《從零開始帶你成為訊息中介軟體實戰高手》 筆記六

2021-10-19 12:30:05 字數 2352 閱讀 5774

場景:通過canal同步mysql資料,並把binlog訊息放入rocketmq,同步系統從mq中同步訊息寫入別的庫,實現資料同步

問題:資料同步後,發現兩邊的資料不一致

發生原因:比如有2條sql,應該先insert,再update,結果同步時先update了,再insert,導致資料不一致

底層原因:因為乙個topic可以指定多個messagequeue,寫入訊息時,訊息也會均勻分配給多個messagequeue。所以可能insert寫入了messagequeue1,update寫入了messagequeue2。接著消費端使用了多台機器組成了consumer group,所以可能一台機器負責消費messagequeue1,一台機器負責消費messagequeue2。導致訊息的亂序消費

1、讓訂單的binlog都進入同乙個messagequeue

2、乙個consumer可以處理多個messagequeue,但乙個messagequeue只能有乙個consumer處理,所以同步只能交給一台消費者機器處理

3、訊息處理失敗不能走重試佇列,因為返回consumeconcurrentlystatus.reconsume_later會跳過當前訊息,處理下一條,導致消費亂序。必須返回consumeconcurrentlystatus.suspend_current_queue_a_moment,意思是先等一會,一會兒再處理這批訊息,而不是把訊息放到重試佇列裡

1、讓訂單的binlog都進入同乙個messagequeue

除message外,要傳入messagequeueselector,在匿名內部類中指定進入哪個messagequeue

2、消費者如何保證按照順序獲取乙個mesagequeue中的訊息

使用messagelistenerorderly,會讓consumer對每乙個messagequeue,只使用乙個執行緒處理

在傳送時給訊息設定tag、屬性,在消費時過濾指定tag、屬性的訊息

場景:使用者在下訂單後,不一定會支付,那麼30分鐘後,要把未支付的訂單自動取消掉

問題:如何在30分鐘後,將未支付的訂單取消掉?最簡單的方法,就是不停查詢資料庫中未支付且已經超過30分鐘的訂單。但這樣首先效能不太好,需要不停的查詢,並且在分布式環境下,訂單資料可能存在不同的資料庫伺服器上,所以不太好查詢

方案:使用rocketmq中的延遲訊息,在建立訂單後,設定30分鐘後才能被訂單掃瞄服務消費到,然後服務就去查詢該訂單是否支付成功了,沒有支付成功就關閉。這樣乙個訂單只會查詢一次,並且可以組成consumer group減小壓力

1、靈活運用tags來過濾資料

2、基於訊息key來定位訊息是否丟失

要根據規則給訊息設定key,這樣一旦訊息丟失了,我們可以去rocketmq根據key查詢該訊息,進行排查

3、訊息零丟失方案的補充

對之前的訊息零丟失方案的補充,如果mq集群全部掛了,那怎麼辦?生產者就要把訊息寫入本地檔案或資料庫暫存起來

4、提高消費者的吞吐量

5、要不要消費歷史訊息

consumer支援設定從**開始消費

1、如何知道這個訊息是哪個producer發出來的,進入了哪個topic,又是被哪個consumer消費的

這樣,在rocketmq控制台的訊息軌跡頁面中,就可以根據messageid,messagekey,topic進行查詢

第84課提到一點,mq集群崩潰後,生產者要將訊息寫入本地硬碟或資料庫中,待mq集群恢復後,要再把這些訊息重新發到mq中。要特別注意,寫入和重新傳送都要按照原來的順序

1、乙個producer,往乙個topic發資料,topic內有多個messagequeue,乙個consumer訂閱這個topic,會有消費亂序問題嗎?

訊息中介軟體

1.訊息的優先順序 2.訊息排序 3.訊息過濾 4.訊息持久化 5.訊息重試 6.事務的支援 7.broker滿 生產者,佇列,消費者 訊息佇列的優點 1 解耦2 非同步訊息,系統響應 在jms中,有兩種訊息模型 點對點模式和發布訂閱模式。1.在點對點模式中 有三種角色 1 訊息佇列,傳送者,接受者...

訊息中介軟體

如何理解訊息中介軟體?訊息中介軟體是儲存訊息的乙個容器,與資料庫不同的是資料庫儲存的資料是可以被修改的,而訊息中介軟體一般不會被修改 訊息中介軟體在消費的生產者與消費者產生,相當於乙個中間人的角色,提供了路由保證訊息的傳遞,如果消費者不能及時接收,訊息會保留下來,知道消費者上線 保證在存活期內 訊息...

訊息中介軟體

訊息中介軟體是在訊息的傳輸過程中儲存訊息 訊息傳遞過程中不能更改 的容器。訊息中介軟體再將訊息從它的原中繼到它的目標時充當中間人的作用。訊息中介軟體的主要目的是提供路由並保證訊息的傳遞 如果傳送訊息時接收者不可用,訊息佇列會保留訊息,知道可以成功傳遞為止,當然,訊息佇列儲存訊息也是有期限的。訊息傳送...