使用PUBSUB订阅时为什么不能PING?

时间:2014-07-16 13:48:22

标签: c# azure redis servicestack.redis

我在Azure上使用PUBSUB时遇到问题。

Azure防火墙将关闭任何时间空闲的连接。时间的长短存在争议,但人们认为它大约需要5到15分钟。

我使用Redis作为消息队列。为此,ServiceStack.Redis库提供了一个订阅以下频道的RedisMqServer:

mq:topic:in

在后台线程上,它阻止从套接字接收数据,等待从Redis接收消息。问题是:

  

如果等待Redis消息的套接字空闲了Azure防火墙的任何时间长度   静默关闭连接。我的应用程序不知道它是什么   现在等待一个封闭的连接(就其所关注的而言)   打开)。后台线程有效挂起。

我曾想过要实现某种Keep Alive,即等待一分钟的消息,但是如果没有收到消息,那么PING服务器有两个目标:

  1. 通过告知Azure此连接是否保持连接打开 仍然在使用。
  2. 检查连接是否已关闭,如果已关闭 重新开始并重新订阅。
  3. 然而,当我实现这个时,我发现在订阅时我不能使用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节点关闭)连接被终止,我仍然需要实现重新启动订阅的第二个目标。

3 个答案:

答案 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消息。