一種後臺網絡服務器模型

       這裏描述一種後臺網絡服務器模型,其中涉及到偵聽線程,緩衝線程,業務處理線程。偵聽線程循環等待客戶端的連接,一旦有客戶端連接上來,就將客戶端socket加入到socket隊列中,緩衝線程負責循環等待客戶端socket 的讀信息。緩衝線程中的客戶端socket就是偵聽線程提供的。緩衝線程可以有多個。偵聽線程和緩衝線程共同維護socket隊列。

        這裏解釋一下爲什麼要開多個緩衝線程。因爲我們採用了select 這種 I/O 複用模型,select 在管理大量 socket的時候,在Windows 上,雖然可以通過重新定義 FD_SETSIZE 來使其能夠管理大量socket,但是效率相對較低,而在linux上面,select 有FD_SETSIZE的限制,數量多了還不行。所以這裏開啓多個緩衝線程,每個緩衝線程裏面調用select 函數,這樣,管理的 socket 數量能夠增加幾倍,達到   n * FD_SETSIZE。在 socket 的維護中,緩衝線程之間不需要同步,因爲他們各自維護了一個 socket隊列,緩衝線程只和偵聽線程需要同步維護socket。

       前面提到緩衝線程負責循環等待客戶端socket 的讀信息,當客戶端socket 有讀信息的時候,緩衝線程會爲該客戶端尋找空閒的 業務處理線程。這裏採用線程池的方式來管理業務線程。如果緩衝線程能夠找到空閒的業務線程,則把 當前socket 交給該空閒的業務線程,如果沒找到,則創建 業務處理線程池。所以,緩衝線程 和 業務處理線程需要同步業務處理線程的工作狀態,是空閒,還是正在忙於處理客戶端socket 。

      下面給出這種網絡服務器模型的時序圖:

       

      

 

    如上圖,ListenThread負責偵聽客戶端的連接,當有客戶端連接上來時,接受socket,並且發送消息3add socketInfo,將socketinfo增加到 m_sockCacheList[nIndex]中。nIndex表示緩衝線程的線程索引,取值可以爲[1…n]ListenThreadsocket總數對緩衝線程總數取模來決定當前socket加入到哪個緩衝線程中。

    緩衝線程對自己m_sockCacheList[nIndex]中的socket循環檢查是否有數據可讀。若有數據可讀,則爲客戶端尋找空閒的TradeThread(或者創建TradeThread,發送消息5Create TradeThread),接着發送消息6Delete socketInfo,socketInfo從自己內部的m_sockCacheList[nIndex]移除。

TradeThread,偵聽客戶端的請求操作,並且根據業務規則,做相應處理。當發現客戶端在規定的時間內無反應時,發送消息:5:3Delete socketInfo,scoketInfo刪除。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章