Jus*_*tch 7 asp.net asp.net-mvc redis booksleeve
我正在使用Redis pubsub通道将工作进程池中的消息发送到我的ASP.NET应用程序.收到消息后,我的应用程序将消息转发到带有SignalR的客户端浏览器.
我找到了这个解决方案来维护与Redis的开放连接,但它在重新创建连接时没有考虑订阅.
我正在处理Global.asax文件中的Redis pubsub消息:
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 */
}
}
Run Code Online (Sandbox Code Playgroud)
当前RedisConnection因任何原因关闭时会发生此问题.最简单的解决方案是RedisConnectionGateway
在重置连接时从类中触发事件,并使用新的重新订阅RedisSubscriberChannel
.但是,在重置连接时发布到通道的任何消息都将丢失.
是否有任何推荐的方法来处理这种情况?
是的,如果连接中断(网络不稳定,重新掌握,等等),那么您将需要重新应用您所做的任何订阅.重新连接和重新订阅的事件非常正常,与我们在SE/SO上使用的事件没有什么不同(除了我们通常跟踪更细粒度的订阅,并且有一些处理所有这些的包装代码).
是的,在您的连接中断时发布的任何事件都已消失.这就是redis pub/sub的本质; 它不保证交付给断开连接的客户端.要么使用一个工具,不承诺这一点,或使用Redis的驱动,而不是队列-入栈/到/从列表的两端通常是一个合理的选择,并确保不会丢失任何信息(只要你的软件不降它从列表中弹出后).如果它有帮助,我在我的列表上有一个添加阻塞pop方法的请求 - 它们完全破坏了多路复用器的意图,但它们在某些情况下有真正的用途,所以我不反对添加它们.
归档时间: |
|
查看次数: |
3662 次 |
最近记录: |