servicestack redismqserver:没有办法在运行时添加或删除通道?

uelo1irk  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(412)

到目前为止,我已经“遗留”了,使用servicestack的pub/sub解决方案的实现很快就用完了客户端,当它达到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) 
    { 
    }
});

当我们有足够多不同的频道去听的时候,它就会消失。
然后我想,也许我不必为每个订阅使用一个新的iredisclient,我可以为所有订阅使用相同的iredisclient,所以:

_redisConsumer = mySavedRedisClient;
...

但这又回来了 Unknown reply on multi-request 几秒钟后/执行。
最后,我看了一下 RedisPubSubServer ,但似乎我需要在构造函数中指定通道,之后就不能更改了。我确实需要在运行时添加和删除通道,而且通道从一开始就不知道。
推荐的方法是什么?
是否要增加最大限制并像以前一样继续?
是使用redispubsub,但如何处理动态通道?
“多请求未知回复”到底是什么意思?
谢谢!

piv4azn7

piv4azn71#

目前还不清楚你所指的20个客户端限制是什么&客户端限制是如何依赖于频道或订户的,但如果这是你自己的应用程序限制,而不是听起来像增加它将是最简单的解决方案。
servicestack.redis不支持在订阅启动后更改订阅的频道。而不是管理 IRedisSubscription 您自己可能想考虑servicestack.redis托管的发布/订阅服务器,它管理后台订阅线程,增加了弹性并支持自动重试。
虽然不能在运行时更改订阅的频道,但可以修改 Channels 收集并重新启动订阅以创建对已更新频道列表的新订阅,例如:

var pubSub = new RedisPubSubServer(clientsManager, chan1);
pubSub.Start();

//...

pubSub.Channels = new[] { chan1, chan2 };
pubSub.Restart();

否则,根据您的用例,您可以订阅一个通道模式,该模式允许您订阅多个与通配符通道模式匹配的动态通道:

var pubSub = new RedisPubSubServer(clientsManager) {
       ChannelsMatching = new[] { "chan:*" }
    }
    .Start();

它将处理客户端发送的与通道模式匹配的任何消息。

相关问题