1. 程式人生 > >如何保證訊息的順序性?

如何保證訊息的順序性?

面試題

如何保證訊息的順序性?

面試官心理分析

其實這個也是用 MQ 的時候必問的話題,第一看看你了不瞭解順序這個事兒?第二看看你有沒有辦法保證訊息是有順序的?這是生產系統中常見的問題。

面試題剖析

我舉個例子,我們以前做過一個 mysql binlog 同步的系統,壓力還是非常大的,日同步資料要達到上億,就是說資料從一個 mysql 庫原封不動地同步到另一個 mysql 庫裡面去(mysql -> mysql)。常見的一點在於說比如大資料 team,就需要同步一個 mysql 庫過來,對公司的業務系統的資料做各種複雜的操作。

你在 mysql 裡增刪改一條資料,對應出來了增刪改 3 條 binlog

日誌,接著這三條 binlog 傳送到 MQ 裡面,再消費出來依次執行,起碼得保證人家是按照順序來的吧?不然本來是:增加、修改、刪除;你楞是換了順序給執行成刪除、修改、增加,不全錯了麼。

本來這個資料同步過來,應該最後這個資料被刪除了;結果你搞錯了這個順序,最後這個資料保留下來了,資料同步就出錯了。

先看看順序會錯亂的倆場景:

  • RabbitMQ:一個 queue,多個 consumer。比如,生產者向 RabbitMQ 裡傳送了三條資料,順序依次是 data1/data2/data3,壓入的是 RabbitMQ 的一個記憶體佇列。有三個消費者分別從 MQ 中消費這三條資料中的一條,結果消費者2先執行完操作,把 data2 存入資料庫,然後是 data1/data3。這不明顯亂了。

  • Kafka:比如說我們建了一個 topic,有三個 partition。生產者在寫的時候,其實可以指定一個 key,比如說我們指定了某個訂單 id 作為 key,那麼這個訂單相關的資料,一定會被分發到同一個 partition 中去,而且這個 partition 中的資料一定是有順序的。
    消費者從 partition 中取出來資料的時候,也一定是有順序的。到這裡,順序還是 ok 的,沒有錯亂。接著,我們在消費者裡可能會搞多個執行緒來併發處理訊息。因為如果消費者是單執行緒消費處理,而處理比較耗時的話,比如處理一條訊息耗時幾十 ms,那麼 1 秒鐘只能處理幾十條訊息,這吞吐量太低了。而多個執行緒併發跑的話,順序可能就亂掉了。

解決方案

RabbitMQ

拆分多個 queue,每個 queue 一個 consumer,就是多一些 queue 而已,確實是麻煩點;或者就一個 queue 但是對應一個 consumer,然後這個 consumer 內部用記憶體佇列做排隊,然後分發給底層不同的 worker 來處理。

Kafka

  • 一個 topic,一個 partition,一個 consumer,內部單執行緒消費,單執行緒吞吐量太低,一般不會用這個。
  • 寫 N 個記憶體 queue,具有相同 key 的資料都到同一個記憶體 queue;然後對於 N 個執行緒,每個執行緒分別消費一個記憶體 queue 即可,這樣就能保證順序性。

本文在米兜公眾號連結:
https://mp.weixin.qq.com/s/403XIk13cFXwjTlpXKQfYA

歡迎關注米兜Java,一個注在共享、交流的Java學習平臺。

相關推薦

如何保證訊息佇列的高可用和冪等以及資料丟失,順序一致性

如何保證訊息佇列的高可用和冪等性以及資料丟失,順序一致性 <!-- more --> RabbitMQ的高可用性 RabbitMQ是比較有代表性的,因為是基於主從做高可用性的,我們就以他為例子講解第一種MQ的高可用性怎麼實現。 rabbitmq有三種模式: 單機模式 普通叢集模

kafka的topic多分割槽的情況,如何保證跨區的訊息消費的順序

這個問題嚴格來說是肯定有的,kafka只能保證分割槽內的有序性。 下面是kafka作者Jay Kreps的blog中介紹kafka設計思想的一段話。 Each partition is a totally ordered log, but there is no global ordering betwe

如何保證訊息佇列的順序

開發十年,就只剩下這套架構體系了! >>>   

如何保證訊息順序

面試題 如何保證訊息的順序性? 面試官心理分析 其實這個也是用 MQ 的時候必問的話題,第一看看你了不瞭解順序這個事兒?第二看看你有沒有辦法保證訊息是有順序的?這是生產系統中常見的問題。 面試題剖析 我舉個例子,我們以前做過一個 mysql binlog 同步的系統,壓力還是非常大的,日同步資料要達到上億

Kafka訊息順序保證

Kafka可以保證同一個分割槽裡的訊息是有序的。生產者按照一定的順序傳送訊息,broker會按照這個順序將訊息寫入分割槽的批次快取中,消費者也會按照同樣的順序讀取它們。 如果把retries設定為非零整數,同時把max.in.flight.requests.per.connection設定為大於

【面試寶典】訊息佇列如何保證冪等

面試題:那麼來說稅如何保證訊息佇列的冪等性? 面試官心理剖析: 主要是看你對訊息佇列資料重複消費的問題,是否有了解,是否知道怎麼解決?如果這塊不知道,那麼面試官會覺得如果交給你做功能,可能會出現多次消費的情況。 為什麼會出現重複消費? 問題解決參考http://www.wityx.com/d

35、分散式服務介面請求的順序如何保證

1、面試題 分散式服務介面請求的順序性如何保證? 2、面試官心裡分析 其實分散式系統介面的呼叫順序,也是個問題,一般來說是不用保證順序的。但是有的時候可能確實是需要嚴格的順序保證。給大家舉個例子,你服務A呼叫服務B,先插入再刪除。好,結果倆請求過去了,落在不同機器上,可能插入請求因為某些

高併發情況下如何保證訊息順序

      在知乎上看到一位大牛總結了一些保證訊息順序的方案,在此記錄下來學習一下。      在多佇列訊息處理的場景中,怎樣保持多個訊息之間的時間順序,是一個很經典的問題。解決方法當然是有的。        為了討論這個問題,讓我們做一些簡化問題的假設:有若干個訊息佇列A、

【分散式】--訊息kafka保證順序一致性(358)

在kafka中,同一個topic,被分成了多個partition,這多個partition之間是互相獨立的。 之所以要分成多個partition,是為了提高併發度,多個partition並行的進行傳送/消費,但這卻沒有辦法保證訊息的順序問題。 一個解決辦法是,一個to

阿裏Java面試題剖析:在高並發的情況下如何保證消息的順序

沒有 處理 ESS water 發送 text 同步 不同的 color 面試原題 如何保證消息的順序性? 面試官心理分析 其實這個也是用 MQ 的時候必問的話題,第一看看你了不了解順序這個事兒?第二看看你有沒有辦法保證消息是有順序的?這是生產系統中常見的問題。 面試題剖析

Kafka如何保證消息的順序

錯亂 可能 相同 9.png sum info 處理 生產 分享圖片 1. 問題 比如說我們建了一個 topic,有三個 partition。生產者在寫的時候,其實可以指定一個 key,比如說我們指定了某個訂單 id 作為 key,那麽這個訂單相關的數據,一定會被分發到同

LinkedHashMap如何保證順序

一. 前言 先看一個例子,我們想在頁面展示一週內的消費變化情況,用echarts面積圖進行展示。如下: 我們在後臺將資料構造完成 HashMap<String, Integer> map = new HashMap<>(); map.put("星期一", 40)

如何保證訊息不被重複消費?或者說,如何保證訊息消費的冪等

面試題 如何保證訊息不被重複消費?或者說,如何保證訊息消費的冪等性? 面試官心理分析 其實這是很常見的一個問題,這倆問題基本可以

二叉搜索樹的順序

-s 鍵值 發生 logs 結果 依然 得到 能夠 src ------------------siwuxie095 二叉搜索樹的順序性 二叉搜索樹具有一定的順序性,即 使用二叉搜索樹可以回答很多

memory_order 強記憶體模型保證記憶體順序就好

在C++11標準原子庫中,大多數函式接收一個memory_order引數:   enum memory_order { memory_order_relaxed, memory_order_consume, memory_order_acqu

對List去重並保證新增順序主要有三種方式

方式一,利用HashSet不能新增重複資料的特性 由於HashSet不能保證新增順序,所以只能作為判斷條件: private static void removeDuplicate(List<String> list) { HashSet<String>

如何保證訊息佇列的高可用

RabbitMQ的高可用性   RabbitMQ是基於主從做高可用性的,有三種模式:單機模式,普通叢集模式,映象叢集模式   單機模式:   demo級別   普通叢集模式:     在多臺機器上啟動rabbitmq例項,每個機器啟動一個。   但是你建立的

如何保證訊息的可靠性傳輸(如何處理訊息丟失的問題)

RabbitMQ   生產者弄丟了資料     生產者將資料傳送到RabbitMQ的時候,可能資料就在半路給搞丟了,因為網路啥的問題,都有可能。     此時可以選擇用RabbitMQ提供的事務功能,就是生產者傳送資料之前開啟RabbitMQ事務(channel.tx

Kafka如何保證訊息不丟失不重複

轉載:https://blog.csdn.net/matrix_google/article/details/79888144 首先要考慮這麼幾個問題: 訊息丟失是什麼造成的,從生產端和消費端兩個角度來考慮 訊息重複是什麼造成的,從生產端和消費端兩個角度來考慮  

資料結構與演算法C++之二分搜尋樹的順序

二分搜尋樹可以查詢最小值 minimum 和最大值 maximum 可以找到一個元素的前驅(successor),後繼(predecessor),floor,和 ceil 當該元素在樹中時,前驅後繼和f