首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Booksleeve维护打开的Redis PubSub订阅

使用Booksleeve维护打开的Redis PubSub订阅
EN

Stack Overflow用户
提问于 2012-04-10 03:31:41
回答 1查看 4.3K关注 0票数 7

我使用Redis pubsub通道将消息从工作进程池发送到我的ASP.NET应用程序。当收到消息时,我的应用程序使用SignalR将消息转发到客户端浏览器。

我发现this solution用来维护到Redis的开放连接,但当它重新创建连接时,它不会考虑订阅。

我目前在我的Global.asax文件中处理Redis pubsub消息:

代码语言:javascript
复制
public class Application : HttpApplication
{
    protected void Application_Start()
    {
        var gateway = Resolve<RedisConnectionGateway>();
        var connection = gateway.GetConnection();
        var channel = connection.GetOpenSubscriberChannel();

        channel.PatternSubscribe("workers:job-done:*", OnExecutionCompleted);
    }

    /// <summary>
    /// Handle messages received from workers through Redis.</summary>
    private static void OnExecutionCompleted(string key, byte[] message)
    {
        /* forwarded the response to the client that requested it */
    }
}

当当前的RedisConnection由于某种原因而关闭时,就会出现问题。最简单的解决方案是在重置连接时从RedisConnectionGateway类中激发一个事件,然后使用新的RedisSubscriberChannel重新订阅。但是,在重置连接时发布到通道的任何消息都将丢失。

有没有推荐的处理这种情况的方法的例子?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-10 21:08:14

是的,如果连接中断(网络不稳定、重新主控等),那么您将需要重新应用您所做的任何订阅。重新连接和重新订阅事件是很正常的,与我们在SE/SO上使用的没有太大区别(除了我们通常跟踪更细粒度的订阅,并有一些包装器代码来处理所有这些)。

是的,在您的连接中断时发布的任何事件都将消失。这就是redis pub/sub的本质;它不保证交付到断开连接的客户端。或者使用一个支持这一点的工具,或者使用redis来驱动一个队列--推送/弹出列表的两端通常是一个合理的选择,并且确保不会丢失任何东西(只要你的软件在将它从列表中弹出后不会丢弃它)。如果有帮助,我的列表中有一个添加阻塞pop方法的请求-它们完全破坏了多路复用器的意图,但在某些情况下它们有真正的用途,所以我不反对添加它们。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10078665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档