觀察者


如今使用nodejs作tcp方面的開發工做,使用了redis和mongodb做爲基礎數據的支撐,由於系統須要長期地運行,因此不肯定當中途某個數據庫鏈接斷掉以後會發生什麼狀況,暫時不從源代碼入手吧,先手動嘗試觀察一下,先觀察表象,再深刻理解node


通過測試,發現經過nodejs的redis客戶端獲取的鏈接在中途發生斷線以後(模擬場景有手動Kill掉TCP鏈接和手動關閉redis-server兩種狀況)會進行自動重連,並且在中途進行操做,回調函數中會返回錯誤信息,這樣的話至少代碼不會爆掉,進程也不會掛,最神奇的是以前獲取到的操做句柄還可以正常使用,重連發生在這個操做對象內部,對開發者是不可見,應該來講很友好吧,最神奇的是nodejs驅動開發者考慮到了不少細節的問題,好比開始的時候客戶端訂閱了某個頻道,在進行重連後還會初始化一次(內部機制以後看源代碼以後才能下結論),看來真是省心啊。redis


mongodb的官方nodejs驅動有個很厲害的地方,當操做過程當中鏈接被斷掉後(直接手動關閉mongodb-server),若是後續還有操做,將會被暫時存儲起來,當鏈接被從新創建以後,全部「緩衝區」的數據將會被寫入數據庫,看來仍是很不錯的哦,可是目前待思考的地方是若是有大量數據,「緩存區」會在什麼狀況下清空呢?(看來研究一下驅動頗有必要了)mongodb


他們的共同點就是第一次必須先獲取操做對象,不然代碼直接會爆掉的(不過這點上redis就作得比較好了,不管是否鏈接上客戶端都返回一個操做對象,看來mongodb其實還能夠改進一下),這個固然好理解,因此如今系統在最開的時候會有一個初始化階段,負責初始化數據緩存池鏈接(包括redis和mongodb),接下來就不怕啦,即便是中途tcp斷掉一段時間仍是能夠接受的數據庫


不管在使用mongo仍是redis在進行寫操做的時候,都必定使用回調函數,這樣才能更加保險,不然頗有可能都沒有寫進去,又或者是數據在重連成功前被清除掉了呢。緩存


@todo mongodb nodejs drive buffer size before connected again...tcp

相關文章
相關標籤/搜索