moonmq: 用go實現的高性能message queue

介紹

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,期待大家的反饋。

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