介紹
moonmq是一個用go實現的高性能消息隊列系統,後續準備用於我們消息推送服務以及各個後臺的異步任務。
在設計上面,moonmq主要借鑑了rabbitmq以及rocketmq相關的思想,但是做了很多減法,畢竟我不是要設計成一個非常通用的mq。
名詞解釋
- publisher,消息生產者
- consumer,消息消費者
- broker,消息中轉站
- queue,消息存儲隊列
publisher給一個命名的queue發送消息msg,broker負責將msg存放在queue裏面。
consumer可以關注自己感興趣的queue,這樣當queue裏面有消息的時候,broker就會將該消息推送給該consumer。
推拉模型
在rocketmq裏面,支持的是pull msg,而rabbitmq則是支持push和pull msg。moonmq只支持push msg。主要有如下考量:
- 當consumer在線的時候,push是最及時的,因爲這時候鐵定能把msg push成功。
- 當consumer離線,broker會保存離線消息,當consumer上線之後,broker仍然按照push的方式將離線消息進行推送。
另外,因爲moonmq後續會支持我們的消息推送系統,如果採用pull模型,幾十萬的consumer定期的pull,我有點擔心moonmq會喫不消。
消息類型
moonmq將msg分爲direct和fanout,fanout就是廣播消息,moonmq會將任何訂閱了該queue的consumer進行msg push。
如果msg的type爲direct,moonmq將會採用輪詢的方式,選擇一個consumer進行msg push。
消息優先級
moonmq不支持消息優先級,處理起來會很麻煩,而且通常我們並不需要特別精細的優先級控制。
可以通過一個簡單的方式實現粗粒度的優先級控制:
- 設置queue1,queue2,queue3三個隊列,queue1用來處理保存優先級最高的消息,queue2次之,queue3最低
- publisher發送消息的時候根據優先級發送到指定的queue上面去
- 我們可以有多個consumer處理queue1的消息,譬如3個,然後用2個處理queue2的,1個處理queue1的,這樣實現優先級控制。
消息過濾
moonmq通過routing key來進行消息過濾。
publisher在給特定queue發送msg的時候,還可以指定對應的routing key,只有關注了該queue同時也指定了相同的routing key的consumer纔會收到該msg。
Ack
moonmq支持ack機制,當push一個msg到consumer的時候,consumer必須迴應一個ack,moonmq才認爲msg push成功。如果長時間沒有ack,則moonmq會重新選擇一個consumer再次發送。
ack能夠很大程度的保證消息推送的成功率,但是對於消息的快速推送會有影響,所以moonmq也支持no ack模式,這種模式下moonmq只要發送成功了msg,就認爲push成功,無需等待ack的回執。
延遲消息
這個現在還沒支持,後續是情況而定
定時消息
難度比較大,不會實現
協議
moonmq採用的是類似rocketmq的協議,如下:
|total length(4 bytes)|header length(4 bytes)|header json|body|
total length = 4 + len(header json) + len(body)
header length = len(header json)
在moonmq裏面,我們使用Proto來定義協議
type Proto struct {
Method uint32 `json:"method"`
Fields map[string]string `json:"fields"`
Body []byte `json:"-"`
}
moonmq的任何協議,都需要帶上method,我們通過method進行實際的消息處理。
moonmq的method參考rabbitmq,有如下幾種類型的method:
- 同步request method,客戶端在發送request method之後必須等待對應的response method,在等待的過程中也能夠處理push,error等異步method。
- 同步response method,對應特定的request method。
- 異步method,發送之後無需等待。
現階段,moonmq支持如下同步method:
- auth, auth_ok
- publish, publish_o
- bind, bind_ok
- unbind, unbind_ok
同時支持如下異步method:
- push
- error
- heartbeat
- ack
後續
這只是moonmq的一個簡單介紹,後續我們會不斷完善moonmq,爭取也能成爲一個不錯的mq產品。
moonmq的代碼在這裏https://github.com/siddontang/moonmq,期待大家的反饋。