關於面試--【Spark消費 Kafka,分佈式的情況下,如何保證消息的順序?】

Kafka 分佈式的單位是 Partition。如何保證消息有序,需要分幾個情況討論。

同一個 Partition 用一個 write ahead log 組織,所以可以保證 FIFO 的順序。

不同 Partition 之間不能保證順序。但是絕大多數用戶都可以通過 message key 來定義,因爲同一個 key 的 message 可以保證只發送到同一個 Partition。比如說 key 是 user id,table row id 等等,所以同一個 user 或者同一個 record 的消息永遠只會發送到同一個 Partition上,保證了同一個 user 或 record 的順序。

當然,如果你有 key skewness 就有些麻煩,需要特殊處理。


實際情況中: (1)不關注順序的業務大量存在;(2)隊列無序不代表消息無序。


第(2)條的意思是說: 我們不保證隊列的全局有序,但可以保證消息的局部有序。舉個例子: 保證來自同1個 order id 的消息,是有序的!


Kafka 中發送1條消息的時候,可以指定(topic, partition, key) 3個參數。partiton 和 key 是可選的。如果你指定了 partition,那就是所有消息發往同1個 partition,就是有序的。並且在消費端,Kafka 保證,1個 partition 只能被1個 consumer 消費。或者你指定 key(比如 order id),具有同1個 key 的所有消息,會發往同1個 partition。也是有序的。

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