Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ServiceStack RedisMqServer:无法在运行时添加或删除通道?_Redis_<img Src="//i.stack.imgur.com/WM7S8.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">servicestack_Publish Subscribe - Fatal编程技术网 servicestack,publish-subscribe,Redis,servicestack,Publish Subscribe" /> servicestack,publish-subscribe,Redis,servicestack,Publish Subscribe" />

ServiceStack RedisMqServer:无法在运行时添加或删除通道?

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

到目前为止,我已经“遗留”了,使用ServiceStack实现的发布/订阅解决方案在达到20个客户端的限制时,很快就用完了客户端

我们做的事情如下:

_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?啊,具体的impl
RedisPubSubServer
有一个频道setter,但接口没有?