Zinx v0 8訊息佇列和任務池

2021-09-23 17:19:00 字數 1303 閱讀 9244

訊息佇列和任務池

原來乙個鏈結對應乙個reader和乙個writer,乙個訊息對應handler

原來客戶端發乙個message,伺服器會開闢乙個handler goroutine去處理業務。很多message會有很多handler goroutine

為了提高效能,要降低gorouine數量

手段:讓處理業務的 handler goroutine和訊息無關

制定乙個worker處理業務

啟動一定數量的worker處理業務的go程,每個worker繫結乙個任務的佇列

能夠降低go的數量

記憶體節省

go排程器切換go的成本降低,更好利用cpu

比如1萬個reader和1萬個writer都是阻塞,並不會占用太多的cpu資源

訊息列隊及worker工作池的實現

建立訊息佇列

屬性訊息佇列

工作池的數量

type msghandler struct
構造方法
//初始化方法

func newmsghandler() ziface.imsghandler

}

方法

啟動工作池:啟動固定數量的goroutine

//啟動worker工作池 (在整個server服務中 只啟動一次)

func (mh *msghandler) startworkerpool()

}

worker和訊息佇列進行繫結,並處理業務:

func (mh *msghandler) startoneworker(workerid int, taskqueue chan ziface.irequest) 

}}

將請求傳送給工作池

func (mh *msghandler) sendmsgtotaskqueue(request ziface.irequest)

建立多工的worker工作池,並且啟動

啟動工作池:繫結worker和channel

將之前傳送的訊息,由reader呼叫handler過程變成 讓worker工作池來處理

//全域性計數器,記錄訊息的個數

修改全域性配置

工作池最大數量

訊息佇列的長度

修改connection

給訊息佇列傳送請求

if config.globalobject.workerpoolsize > 0  else

Zinx V0 8訊息佇列及多工機制

之前的zinx框架 是1個鏈結對應1個reader和1個writer,1個訊息對應乙個handler,如果說1個客戶端傳送10個訊息 1w客戶端 就10w訊息,10w handler的go程來處理業務,cpu就會在10w handler之間進行切換,影響效能,這時就需要制定乙個worker處理業務的...

django celery 任務訊息佇列

描述 為提高 效能,很多耗時,但不影響頁面正常的操作,可丟給訊息佇列非同步執行 比如sns 的 新鮮事兒 系統,我發帖之後,會給所有關注我的人推送一條通知。乍一看沒什麼難的,發帖之後找出關注我的人,然後生成相應的訊息記錄就行了。但問題是,100個人關注我,就要執行100條insert查詢,更要命的是...

訊息和訊息佇列

在傳統的c 程式當中,我們呼叫 fopen 函式開啟檔案,這個庫函式最終呼叫作業系統 提供的函式 來開啟檔案。而在 windows 中,不僅使用者程式可以呼叫系統的 api函式,反回來,系統也會呼叫使用者程式,這個呼叫是通過訊息來進行的。windows程式設計是一種完全不同於傳統的 dos方式的程式...