0

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

Azure 防火墙将关闭空闲时间不限的连接。时间长度有很多争论,但人们认为大约是 5 到 15 分钟。

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

mq:topic:in

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

如果等待 Redis 消息的套接字在任意时间段内处于空闲状态,Azure 防火墙会静默关闭连接。我的应用程序不知道,因为它现在正在等待关闭的连接(就其而言,它是打开的)。后台线程有效地挂起。

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

  1. 通过告诉 Azure 此连接仍在使用中来保持连接打开。
  2. 检查连接是否已关闭,如果是,则重新开始并重新订阅。

但是,当我实现这一点时,我发现我在订阅时无法使用 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 节点关闭)而被终止,我仍然需要实现重新启动订阅的第二个目标。

4

3 回答 3

2

unstable我刚刚在此提交中在 Redis 的分支中以 Pub/Sub 模式实现了 PING 支持: https ://github.com/antirez/redis/commit/27839e5ecb562d9b79e74​​0e2e20f7a6db7270a66

这将在接下来的几天内被反向移植到 Redis 2.8 稳定版中。

于 2014-07-16T15:49:43.103 回答
1

这是由于我们在 Azure 中托管 Redis 时处理 keepAlive 数据包造成的问题。我们很快就会解决这个问题。

此外,如上所述,您可以通过 ping 手动保持连接处于活动状态。对于 sub/pub 连接,您今天可以使用的一个技巧是取消订阅随机频道。(这就是 StackExchange.Redis 所做的)

于 2014-07-20T18:43:09.063 回答
0

当客户端订阅时,该连接基本上被阻止用于传出命令,因为它用于侦听传入消息。一种可能的解决方法是在通道上发布定期的 keepalive 消息。

于 2014-07-16T15:00:37.857 回答