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

2021-09-23 18:46:07 字數 1444 閱讀 9997

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

1.在msghandler中新增workpoolsize(工作池)和taskqueue(訊息佇列)

type msghandler struct

在初始化的時候將workpoolsize和taskqueue初始化,這裡可以讓使用者自己進行配置

func

newmsghandler

() ziface.imsghandler

}

2.在實現層中實現乙個真正處理業務的方法
//乙個worker真正處理業務的 goroutine函式

func

(mh *msghandler)

startoneworker

(workerid int

, taskqueue chan ziface.irequest)

}}

3.抽象層和實現層分別新增啟動工作池和將訊息新增到工作池的方法
type imsghandler inte***ce

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

func

(mh *msghandler)

startworkerpool()

}//將訊息新增到worker工作池中 (將訊息傳送給對應的訊息佇列)

//應該是reader來呼叫的

func

(mh *msghandler)

sendmsgtotaskqueue

(request ziface.irequest)

這裡是用每個connection的id對工作池數量取餘得到乙個workerid,將request寫入taskqueue下標為workerid的channel中,這樣就相對來說實現了將request輪詢分配給每個工作池。4.在connection剛開始也就是還沒有監聽之前開啟工作池

func

(s *server)

start()

......

}

5.將連線的每個request新增到訊息佇列
func

(c *connection)

startreader()

else

}}

Zinx v0 8訊息佇列和任務池

訊息佇列和任務池 原來乙個鏈結對應乙個reader和乙個writer,乙個訊息對應handler 原來客戶端發乙個message,伺服器會開闢乙個handler goroutine去處理業務。很多message會有很多handler goroutine 為了提高效能,要降低gorouine數量 手段...

訊息佇列屬性及常見訊息佇列介紹

訊息佇列是在訊息的傳輸過程中儲存訊息的容器,用於接收訊息並以檔案的方式儲存,乙個佇列的訊息可以同時被多個訊息消費者消費。分布式訊息服務dms則是分布式的佇列系統,訊息佇列中的訊息分布儲存,且每條訊息儲存多個副本,以實現高可用性,如下圖所示。一般來說,訊息佇列具有如下屬性 訊息順序 普通佇列支援 分割...

訊息佇列 分析及運用

訊息佇列特性為先進先出,底層實現是鍊錶,在核心中建立,有乙個訊息佇列的識別符號來表示,這個佇列當中的每乙個元素都有自己的型別,每乙個型別都有乙個優先順序概念 訊息佇列在作業系統屬性 msgmax 每乙個節點最大訊息的傳送位元組數為8 k msgmnb 佇列中所有訊息的長度之和 為 16 k msgm...