我在Azure上使用PUBSUB时遇到问题。
Azure防火墙将关闭任何时间空闲的连接。时间的长短存在争议,但人们认为它大约需要5到15分钟。
我使用Redis作为消息队列。为此,ServiceStack.Redis库提供了一个订阅以下频道的RedisMqServer:
mq:topic:in
在后台线程上,它阻止从套接字接收数据,等待从Redis接收消息。问题是:
如果等待Redis消息的套接字空闲了Azure防火墙的任何时间长度 静默关闭连接。我的应用程序不知道它是什么 现在等待一个封闭的连接(就其所关注的而言) 打开)。后台线程有效挂起。
我曾想过要实现某种Keep Alive,即等待一分钟的消息,但是如果没有收到消息,那么PING服务器有两个目标:
然而,当我实现这个时,我发现在订阅时我不能使用PING命令?不知道为什么会这样,但有没有人有替代解决方案?
我不想定期取消订阅和重新订阅,因为我可能会错过消息。
我已阅读以下文章:http://blogs.msdn.com/b/cie/archive/2014/02/14/connection-timeout-for-windows-azure-cloud-service-roles-web-worker.aspx,其中讨论了Azure负载均衡器在4分钟后如何断开连接。但即使我可以保持连接活动,如果由于其他原因(redis节点关闭)连接被终止,我仍然需要实现重新启动订阅的第二个目标。
答案 0 :(得分:2)
我刚刚在此次提交中在Redis的unstable
分支中以Pub / Sub模式实现了PING支持:https://github.com/antirez/redis/commit/27839e5ecb562d9b79e740e2e20f7a6db7270a66
这将在接下来的几天内被移植到Redis 2.8 stable。
答案 1 :(得分:1)
这是一个问题,因为我们在Azure中托管Redis时处理keepAlive数据包。我们很快就会解决这个问题。
此外,如上所述,您可以通过ping手动保持连接活动。对于子/ pub连接,您今天可以使用的hack是调用取消订阅随机通道。 (这就是StackExchange.Redis所做的事情)
答案 2 :(得分:0)
当客户端订阅时,该连接基本上被阻止用于传出命令,因为它用于侦听传入消息。一种可能的解决方法是在频道上发布定期的keepalive消息。