2012-07-11 67 views
4

走在我們的redis的配置中,我們已經設置超時時間:7秒Redis的連接從接近事件

node_redis我們處理Redis的連接準備和結束事件作爲

client.on("ready", function() { 
     logger.info("Connection Successfully Established to ", this.host, this.port); 
} 
client.on("end", function() { 
    logger.fatal("Connection Terminated to ", this.host, this.port); 
} 

樣品日誌

[2012-07-11 08:21:29.545] [致命]生產 - 連接終止 結束於'xxx9''6399'
[2012-07-11 08:21:29.803] [INFO]生產 - 連接成功建立'xxx9「6399」

但在某些情況下(最有可能的Redis正在關閉不通知客戶端的連接),我們看到了越來越command queue堆積和請求正在太多時間才能得到響應[直到node-redis客戶端能夠感知關閉事件的時間]。在所有這些情況下,命令回叫將返回此錯誤Redis connection gone from close event。即使在等待之後。看起來好像這不是問題,因爲通常的結束事件沒有被觸發。

問題似乎與此類似 - http://code.google.com/p/redis/issues/detail?id=368

這是一個已知的東西在Redis的發生?

有沒有一種方法可以指定執行命令[發送和接收回復]不應該超過閾值,並在這種情況下回復錯誤,而不是讓客戶端停滯?

或者是否有其他方式在socket_timeout等情況下觸發close事件?

或者我們應該從我們的redis端檢查什麼?我們在debug級別監視了我們的redis日誌,並且我們發現沒有任何與此問題相關的有用內容

當我們在調試模式下運行node-redis時,我們清楚地看到客戶端被阻塞,請求堆積在命令中隊列。我們在​​函數內記錄了why and queue length。我們保持禁用offline_queuing

樣本記錄

Redis的連接從關閉事件了。 離線隊列0 命令隊列失敗的請求的8

響應時間:30388個MS [此變化按照在命令隊列的等待。第一個排隊的人有下列他較少]

平常Resonse時間最大響應時間和那些:1毫秒

PS:我們已經在node_redis提起issue

+1

任何反饋?你沒有標記正確的答案 – oconnecp 2014-01-08 09:22:42

回答

3

我們有一堆連接的麻煩Redis也是如此。它似乎會在沒有告訴客戶的情況下關閉連接。我們注意到它可能是服務器上的超時問題。這是我們使用的解決方案,自7月以來我們沒有遇到任何問題。

var RETRY_EVERY = 1000 * 60 * 3; 
var startTimer = function(){ 
    console.log('Begin the hot tub!') 
    setInterval(function(){ 
     try{ 
      client.set('hot',new Date()); 
      console.log(client.get('hot')) 
     } 
     catch(e){ 
      console.log(e); 
     } 

    },RETRY_EVERY) 
}(); 

考慮到這只是每3分鐘一個電話,它不應該是對性能有問題;)

+0

這個soln非常明顯,但是想知道它是否應該是能夠通過一些redis協議檢測到timeout事件關閉的連接的客戶端,並引發錯誤。我們只是想知道是否有這種情況。 – Tamil 2014-01-10 15:00:37

+0

您的客戶端代碼掛鉤到「結束」工作,並且您還可以掛鉤到「錯誤」事件並檢測到問題,但這是在節點 - Redis代碼或Redis服務器中的固有問題。如果沒有這個代碼,你將會遇到連接問題,因爲他們的代碼中有一個錯誤 – oconnecp 2014-01-10 18:59:13

2

至於oconnecp的答案,你就不能這樣做:

setInterval(client.ping(), 1000 * 60 * 30); 
+0

更簡潔的解決方案。謝謝 – Munim 2014-05-16 05:13:24

+0

不應該這是'setInterval(client.ping.bind(client),1000 * 60 * 30);' – 2014-11-19 17:12:03

+0

看起來像'node_redis 0.11.0'通過將'socket_keepalive'默認爲'true'來「解決」 。不知道爲什麼這並不總是默認的,但無論如何。 – 2014-11-19 17:28:52