我正在使用Redis pubsub频道将消息从工作进程池发送到我的ASP.NET应用程序。当收到一条消息时,我的应用程序将该消息转发给客户端的浏览器与SignalR。使用Booksleeve维护开放的Redis PubSub订阅
我发现this solution与Redis保持开放连接,但它在重新创建连接时没有考虑订阅。
我目前正在处理Redis的发布 - 订阅消息在我的Global.asax文件:
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
重新订阅。但是,在连接重置期间发布到通道的任何消息都将丢失。
是否有任何推荐的方法来处理这种情况的例子?
我的解决方案确实会返回一个Redis连接,如果它已经打开,或者打开一个,否则。我相信,在“常规使用”中,连接将保持打开状态,并且不会将其放到PubSub模式中。在某些原因导致连接关闭的罕见情况下,您将得到一个新连接,并且yes - 连接正在重置时发布到通道的消息将会丢失。但是这个时间很短,并且不会定期发生。无论如何,让我们让BookSleeve的作者重点关注这个(CC @marcgravell)。 – 2012-04-10 01:43:11
@OferZelig谢谢,但'@ someone'不能工作,除非我已经以某种方式参与了这篇文章; p – 2012-04-10 13:08:46
@MarcGravell我不知道;无论如何:1)如何与其他SE用户沟通以获得他/她的关注?我的意思是 - 在一个SE网站内部,不是通过查看个人资料,并去他/她的博客或这样的; 2)您可以在SE中实现标识此功能和警报的功能( xxx模式,其中xxx是已知的SE用户名)。谢谢! –
2012-04-11 08:08:08