2014-07-16 45 views
0

我在使用Azure上的PUBSUB時遇到問題。爲什麼使用PUBSUB訂閱時不能PING?

Azure防火牆將關閉空閒任意時間長度的連接。時間的長短正在爭論不休,但人們認爲它大約在5至15分鐘之間。

我使用Redis作爲消息隊列。要做到這一點ServiceStack.Redis庫提供了預訂以下信道RedisMqServer:

mq:topic:in 

在後臺線程它從插座接收的數據塊,等待從Redis的接收消息。問題是:

如果等待Redis消息的套接字在任何時間段內都空閒,Azure防火牆 將以無提示方式關閉連接。我的應用程序不知道,因爲它現在正在等待一個關閉的連接(關於它的 打開)。後臺線程被有效掛起。

我原以爲實現某種活着的保持這將是等待一分鐘的消息,但如果沒有接收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節點停止)。

回答

2

我剛剛實施了發佈/訂閱模式PING支持的Redis的unstable分支在此承諾:https://github.com/antirez/redis/commit/27839e5ecb562d9b79e740e2e20f7a6db7270a66

這將在未來幾天被移植入Redis的2.8穩定。

+0

棒極了!我將在PUBSUB期間將此能力添加到PING Redis客戶端,作爲ServiceStack.Redis的保持活動能力。我使用的是Azure託管的Redis作爲我的服務器,因此我無法控制它們的版本,但我會保持注意並儘快使用它。非常感謝! – James

0

當客戶端訂閱時,該連接基本上被阻塞用於傳出命令,因爲它用於偵聽傳入消息。一種可能的解決方法是在頻道上發佈定期保活消息。

+0

真巧 - antirez今天修補了這個:https:// github。com/antirez/redis/commit/27839e5ecb562d9b79e74​​0e2e20f7a6db7270a66 :) –

+0

回答了錯誤的答案... – James

1

這是由於我們在Azure中託管Redis時處理keepAlive數據包所致。我們很快就會解決這個問題。

此外,如上所述,您可以通過ping手動保持連接處於活動狀態。對於sub/pub連接,您今天可以使用的黑客正在調用取消訂閱隨機頻道。 (這就是StackExchange.Redis所做的)

+0

感謝您的澄清邁克。我發現如果我使用B2(非複製)產品,超時問題並不是那麼糟糕,但是當我使用S1(複製,共享硬件)時,情況會更糟糕。不知道這是否有用。我會考慮暫時將該功能添加到我的ServiceStack.Redis分支中。 – James

相關問題