文章目錄
前言
本項目Pixysoft.Framework.Noebe.Sockets,是把資料庫的操作用socket暴露出來,實現區域網路的調用。
不支援穿越防火牆、不支援區域網路-公網連結、不支援路由。
作品完成後,能夠通過這個架構,把眾多異構資料庫連結成一個龐大的資料庫池(雲??)
開發過程
第一階段 自以為是
剛開始,網上搜尋了幾個socket的區域網路聊天的例子,用同步的方法實現的。
連結在這裡:http://www.pudn.com/downloads40/sourcecode/p2p/detail138986.html
2天時間我就搞了個prototype,本機調用一點問題都沒有。還有點沾沾自喜,以為自己牛逼了,2天搞好了個socket 的伺服器。
結果一部署,問題來了。
伺服器正在傳輸資料,但是本地收了10%不到就斷了。用thread去等待簡直就是放屁,誰知道thread等到什麼時候。就算把資料位移量也傳遞過去,一樣斷。
第二階段 認真對待
一下子受了挫折,開始認真搜尋資料。在codeprojects和cnblogs找到了非同步socket的例子,特別是NCindy這個非常的好,有個很簡單的非同步模型例子http://www.cnblogs.com/ncindy/archive/2006/11/01/547143.html
於是新的解決方案:
1. 使用非同步做伺服器
2. 使用自訂的結束符號,例如 \0\r\n\0\r\n。讓socket讀到才判斷結束。這樣不用thread去瞎等了。
3. 這個結束符號有可能分割在2次的資料包中,因此判斷的時候要進行最近包合并判斷。
用非同步又花了2天時間搭建了系統,本機跑起來不用thread等待,更加爽了。以為ok了。再部署,又崩了。
傳輸到伺服器的大資料量(5mb左右吧)沒有問題,但是接受的時候,伺服器會顯示用戶端取消連結,而用戶端仍然在等待。
第三階段 自我發展
由於用戶端不知道連結斷了,於是我想到了用雙連結去保證,同時實現了一個續傳的機制。就是本地發送一個命令:
RESUME;續傳的SOCKETID;位移量
通知本socket將代替剛才失敗的socket,續傳。然後用一個心跳連結去檢測、一個資料連結去傳輸。
部署,tnnd,又崩了。當2個連結同時斷開的時候,又進入等待。
第四階段 完成
繼續思考,既然有了續傳機制,何不自己做一個定時,如果超過這個時間,仍然接受不到資料,自己斷開,再續傳。
當然,我最討厭用thread了,直接用非同步去做定時。
1. 首先有個統計器,統計傳輸的頻率
2. 非同步等待的時間 = 頻率*10.
3. 如果非同步等待結束,發現剛才的資料仍然沒有接收到,自動斷開,然後啟動續傳。
總算完成了!
第五階段 完成
經過測試,在超級惡劣的環境下(bt/emule/網頁/馬鈴薯/還有不時斷網),能夠實現大資料量的穩定傳輸。
小結
1. socket服務端開發,盡量使用非同步,那個感覺超級爽!我看日誌,可以在1毫秒內處理多個連結(不是單單接收,而是包括了處理)。這樣1秒鐘的輸送量就非常大了。
2. 使用自訂的結束符表示傳輸完畢,例如\r\n這些。當然,不能用\0了。
3. 連結斷開,用戶端不一定知道,會進入假死狀態。因此用戶端的連結需要有檢視,建議用非同步檢測,不要用線程。
4. 最後,socket的傳輸超級不穩定,說斷就斷,還斷的沒有先兆。
後續
接下來,打算用comet技術去實現跨越防火牆的資料庫即時調用。叫做
Pixysoft.Framework.Noebe.Comets
大概思路:
1. 有個網站作為註冊中心
2. 伺服器啟動後連結網站,實現comet
3. 用戶端需要訪問伺服器資料庫,就聯入comet
如果有研究方向相同的,希望大家相互討論一下。