ServiceStack RedisMqServer:无法在运行时添加或删除通道?
到目前为止,我已经“遗留”了,使用ServiceStack实现的发布/订阅解决方案在达到20个客户端的限制时,很快就用完了客户端 我们做的事情如下:ServiceStack RedisMqServer:无法在运行时添加或删除通道?,redis,servicestack,publish-subscribe,Redis,servicestack,Publish Subscribe,到目前为止,我已经“遗留”了,使用ServiceStack实现的发布/订阅解决方案在达到20个客户端的限制时,很快就用完了客户端 我们做的事情如下: _redisConsumer = MqClientFactory.Instance.GetRedisClient(); // Returns a IRedisClient _subscription = _redisConsumer.CreateSubscription(); _subscription.OnSubscribe = channel
_redisConsumer = MqClientFactory.Instance.GetRedisClient(); // Returns a IRedisClient
_subscription = _redisConsumer.CreateSubscription();
_subscription.OnSubscribe = channel => CoreLog.Instance.Info($"Subscription started on {eventChannelName}");
_subscription.OnUnSubscribe = channel => CoreLog.Instance.Warning($"Unsubscribed from {eventChannelName}");
_subscription.OnMessage = (channel, msg) =>
{
try
{
onMessageReceived(CoreRequestJsonEnvelope.CreateCoreRequestFromJson(msg));
}
catch (Exception ex)
{
CoreLog.Instance.Exception(ex);
}
};
// Since it blocks execution, we put this in a Task:
Task.Run(() =>
{
try
{
_subscription.SubscribeToChannels(eventChannelName); // blocking
}
catch(Exception e)
{
}
});
当我们有足够多的不同的频道来听的时候,它就用完了
然后我想,也许我不必为每个订阅使用新的iDisc客户端,而是可以为所有订阅使用相同的iDisc客户端,因此:
_redisConsumer = mySavedRedisClient;
...
但在几秒钟/执行之后,它会返回多个请求的未知回复
最后,我查看了RedisPubSubServer
,但似乎需要在构造函数中指定通道,之后无法更改。我确实需要在运行时添加和删除通道,而通道从一开始就不知道
- 推荐的方法是什么
- 是否要增加最大限值并像以前一样继续
- 是否要使用RedisPubSub,但如何处理动态通道
- “多次请求的未知回复”实际上是什么意思
谢谢 不清楚您所指的20个客户端限制是什么&客户端限制如何取决于频道或订户,但如果这是您的应用程序自己的限制,那么增加它听起来是最简单的解决方案
ServiceStack.Redis不支持在订阅启动后更改订阅的频道。您不必管理“代码> iReDebug订阅/代码>自己,您可以考虑管理后台订阅线程,增加了恢复力和支持自动重试。
虽然您无法在运行时更改订阅的频道,但可以修改“修改<代码>频道代码>集合”并重新启动订阅,以创建对更新频道列表的新订阅,例如:
var pubSub = new RedisPubSubServer(clientsManager, chan1);
pubSub.Start();
//...
pubSub.Channels = new[] { chan1, chan2 };
pubSub.Restart();
否则,根据您的使用情况,您可能能够订阅允许您订阅多个与通配符通道模式匹配的动态通道:
var pubSub = new RedisPubSubServer(clientsManager) {
ChannelsMatching = new[] { "chan:*" }
}
.Start();
它将处理客户端发送的与频道模式匹配的任何消息。Ah、.Restart I missed。我做了一个更麻烦的变通方法,看起来很有效,但似乎容易得多。关于20个客户限额;它是PooledRedisClientManager的默认限制;由于第一个不是很好的实现,我们为每个通道使用一个iDisclient,然后手动订阅它,这意味着只要我们有20个或更多通道,就会达到20个客户端默认限制。@Ted您可以使用RedisConfig.DefaultMaxPoolSize
对其进行扩展,或切换到在池外创建和处理任何超过池大小的连接的位置。string[]channels{get;}
,所以我不能给它分配任何东西。我有5.8.0版,也许你晚了一点做了一个公共setter?啊,具体的implRedisPubSubServer
有一个频道setter,但接口没有?