TIM中c2s的事件反應模型

2021-09-23 01:33:47 字數 763 閱讀 4646

為了更容易理解後面的內容,先給出登入jabber伺服器的互動包。

s:是server發給client的包,c:是client to server

wildfire中採用的是per requst per thread的模型(確切的說是處理乙個請求,需要兩個執行緒),這種設計的缺陷是顯而易見的,但優勢是易於編碼。當新的物理連線建立之後,一直都有執行緒專門對應這個連線做業務處理,直到完成全部業務後斷開連線,銷毀執行緒。

為了讓單機能服務的連線數最大,tim中不採用per thread per request的模型,而採用的是reactor模型(ace中已實現,更多參閱posa2),在盡量少的執行緒中應答請求,避免多執行緒帶來的開銷。

由於這個原因,在應用層必須設計乙個可靠的事件分配機制,將收到的包分給適當的處理器。

我的想法是堅決杜絕業務處理過程中阻塞執行緒。由於reactor的特性,業務處理過程預設是在reactor自身執行的thread中進行,如果該執行緒被業務處理過程阻塞,reactor也無法監視更多的控制代碼狀態,系統整體效能會受到嚴重的影響。參照前面的xml,設想如下情況,server發出標示,希望接收到客戶端的驗證串,在此時阻塞等待控制代碼的可讀狀態,並試圖接收資料。在正常情況下,client會立刻傳送驗證包給server,server接收到後繼續進行其他處理。這個過程看起來很流暢。但是,如果client不傳送任何資料過去,server會一直處於阻塞態,執行緒主控權永遠也不會交還給reactor的主迴圈,明顯這個模型是脆弱的,我們無法防止惡意使用者,即使是使用超時來防止永久阻塞,系統整體效能也會受到極大影響。

未完待續...

C 中的委託和事件 2

我們繼續思考上面的程式 上面的三個方法都定義在programe類中,這樣做是為了理解的方便,實際應用中,通常都是 greetpeople 在乙個類中,chinesegreeting和 englishgreeting 在另外的類中。現在你已經對委託有了初步了解,是時候對上面的例子做個改進了。假設我們將...

QT中的事件2

qevent void qobject installeventfilter const qobject obj 事件過濾器就是接收所有被傳送到這個物件的事件的物件。這個過濾器可以停止事件或者把它再轉給這個物件。事件過濾器obj通過它的eventfilter 函式來接收事件。如果事件被過濾了 比如,...

C 中的事件

目錄 介紹委託和事件 宣告事件 定義事件 註冊事件 實現事件 觸發事件 為事件增加 新增 刪除 方法 一 介紹委託和事件 事件是特殊化的委託,委託是事件的基礎,所以在介紹事件之前先介紹一下委託。委託 使用委託可以將方法應用 不是方法 封裝在委託物件內,然後將委託物件傳遞給呼叫方法的 這樣編譯的時候 ...