我在 Azure 上使用 PUBSUB 时遇到问题。
Azure 防火墙将关闭空闲时间不限的连接。时间长度有很多争论,但人们认为大约是 5 到 15 分钟。
我使用 Redis 作为消息队列。为此,ServiceStack.Redis 库提供了一个订阅以下频道的 RedisMqServer:
mq:topic:in
在后台线程上,它阻止从套接字接收数据,等待从 Redis 接收消息。问题是:
如果等待 Redis 消息的套接字在任意时间段内处于空闲状态,Azure 防火墙会静默关闭连接。我的应用程序不知道,因为它现在正在等待关闭的连接(就其而言,它是打开的)。后台线程有效地挂起。
我曾想过实现某种 Keep Alive,即等待消息一分钟,但如果没有收到消息,则 PING 服务器有两个目标:
- 通过告诉 Azure 此连接仍在使用中来保持连接打开。
- 检查连接是否已关闭,如果是,则重新开始并重新订阅。
但是,当我实现这一点时,我发现我在订阅时无法使用 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 节点关闭)而被终止,我仍然需要实现重新启动订阅的第二个目标。