如何解决ServiceStack RedisMqServer:无法在运行时添加或删除通道吗?
到目前为止,我已经“遗产”化了,使用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)
{
}
});
并且当我们也有足够多的不同频道可以收听时,它就会耗尽。
然后我想,也许我可以为每个订阅使用相同的IRedisClient,而不是为每个订阅都使用一个新的IRedisClient,所以:
_redisConsumer = mySavedRedisClient;
...
但是在执行几秒钟后返回Unknown reply on multi-request
。
最后,我看了RedisPubSubServer
,但看来我需要在构造函数中指定通道,此后我不能更改。我确实需要在运行时添加和删除通道,并且通道从一开始就未知。
- 推荐的方法是什么?
- 增加最大限制并像以前一样继续吗?
- 是否可以使用RedisPubSub,但是如何处理动态通道?
- “对多请求的未知答复”实际上是什么意思?
谢谢!
解决方法
尚不清楚您要指的是20个客户端限制以及客户端限制如何取决于渠道或订户,但是如果这是您自己的应用限制,那么听起来像是增加限制将是最简单的解决方案。
ServiceStack.Redis不支持在订阅开始后更改订阅的频道。与其亲自管理IRedisSubscription
,不如考虑使用ServiceStack.Redis Managed Pub/Sub Server来管理后台订阅线程,该线程具有增强的弹性并支持自动重试。
虽然您无法在运行时更改已订阅的频道,但可以修改Channels
集合并重新启动订阅以创建对已更新频道列表的新订阅,例如:
var pubSub = new RedisPubSubServer(clientsManager,chan1);
pubSub.Start();
//...
pubSub.Channels = new[] { chan1,chan2 };
pubSub.Restart();
否则,根据您的用例,您可能可以subscribe to a channel pattern来订阅多个与通配符通道模式匹配的动态通道:
var pubSub = new RedisPubSubServer(clientsManager) {
ChannelsMatching = new[] { "chan:*" }
}
.Start();
它将在何处处理客户端发送的与通道模式匹配的所有消息。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。