解耦、異步、削峯數據庫
RocketMQ模型簡單、接口易用,在阿里大規模使用,社區活躍,單機吞吐量10萬級,可用性很是高,消息理論上不會丟失;異步
4.RocketMQ是怎麼保證系統高可用的?分佈式
爲了下降消息丟失的機率,MQ須要進行超時和重傳cdn
(1) MQ-client-sender 發送消息給MQ-serverserver
(2) MQ-server接收到消息後,發送 ACK消息給發送方接口
(3) MQ-client-sender 接收到 ACK消息後,則 消息已經投遞成功隊列
若是上述 2 消息丟失或者超時,MQ-client-sender 內的 timer 會重發消息,直到收到 ACK消息,若是重試N次後還未收到,則回調發送失敗。須要注意的是,這個過程當中 MQ-server 可能會收到同一條消息的屢次重發。內存
對每條消息,MQ系統內部必須生成一個inner-msg-id,做爲去重和冪等的依據,這個內部消息ID的特性是:部署
(4) MQ-server 將消息發送給 MQ-client-receiver消息隊列
(5) MQ-client-receiver 獲得消息處理業務邏輯
(6) MQ-client-receiver 回覆 ACK消息給 MQ-server
(7) MQ-server收到 ACK消息,將已消費的消息刪除
若是上述 6 消息丟失或者超時,MQ-server 內的 timer 會重發消息,直到 MQ-server 收到ACK消息 而且 將已消費的消息刪除,這個過程也可能會重發屢次,MQ-client-receiver 也可能會收到同一條消息的屢次重發。
須要強調的是,MQ-client-receiver 回ACK給 MQ-server,是消息消費業務方的主動調用行爲,不能由 MQ-client-sender 自動發起,由於MQ系統不知道消費方何時真正消費成功。
爲了保證業務冪等性,業務消息體中,必須有一個biz-id,做爲去重和冪等的依據,這個業務ID的特性是:
最多見的業務ID有:支付ID,訂單ID,帖子ID等。
歡迎關注個人公衆號~ 搜索公衆號: 碼咖 或者 掃描下方二維碼: