消息中間件–01. Kafka的幾個疑問
- 2020 年 2 月 18 日
- 筆記
Kafka是基於partition
的模型,在消費的時候,消費者會和kafka建立一個綁定的關係。假設有一個topic
有3個partition
:P1,P2,P3,同時有一個消費group對應有3個消費者:C1,C2,C3,則消費會建立一個P1-C1,P2-C2,P3-C3的關係。

如果消費者數量多於partirion
的話,就會有消費者空閑。

而如果partition個數比consumer個數多,則有可能導致有的消費者存在比其他消費者多的情況:

所以,kafka的最合理的分配機制是partition
與consumer的成倍數關係,而且一個partition只能被一個消費者消費。
交代了Kafka的基本模型,下面再說幾個疑問:
- 一個Consumer是什麼意思,一個線程還是進程?
- 消費組是什麼含義?
- 為什麼一個partition不能被多個Consumer消費?
上面幾個問題,有的卻是很低級,但是卻是不弄清楚就是層窗戶紙。
答
: —————————–
- 一個Consumer是一個消費者實例,可以是一個線程,也可以是一個進程,可以理解成一個客戶端。一個客戶端可以是一個單獨的進程,也可以個開多個線程調用的一個客戶端實例。
- 個人覺得消費組的引入是能讓消息更通用化的消費,通俗的來說,一個消息的
Topic
中一個partition
每次被消費的時候,會記錄一個消費的進度,用術語來說是offset(位移)
。 假設一個Topic中有10條消息,被消費者A消費了2條,則消費者A對應的offset的為2。如果這個時候有一個消費者B想從頭消費,又不影響消費者A的消費offset,這個時候就需要引入一個消費組的概念。 - 對於問題3,也想了很久,如果在不考慮順序的話,kafka完全可以多個消費者消費一個partition,而且與現在的kafka的機制並不違背。
對於為什麼一個partition只能被一個消費組裡的一個消費者消費,可能就是為了保證有序性,網上也查了點資料:
相比傳統的消息系統,Kafka可以很好的保證有序性。 傳統的隊列在服務器上保存有序的消息,如果多個consumers同時從這個服務器消費消息,服務器就會以消息存儲的順序向consumer分發消息。雖然服務器按順序發佈消息,但是消息是被異步的分發到各consumer上,所以當消息到達時可能已經失去了原來的順序,這意味着並發消費將導致順序錯亂。為了避免故障,這樣的消息系統通常使用「專用consumer」的概念,其實就是只允許一個消費者消費消息,當然這就意味着失去了並發性。
在這方面Kafka做的更好,通過分區的概念,Kafka可以在多個consumer組並發的情況下提供較好的有序性和負載均衡。將每個分區分只分發給一個consumer組,這樣一個分區就只被這個組的一個consumer消費,就可以順序的消費這個分區的消息。因為有多個分區,依然可以在多個consumer組之間進行負載均衡。注意consumer組的數量不能多於分區的數量,也就是有多少分區就允許多少並發消費。
Kafka只能保證一個分區之內消息的有序性,在不同的分區之間是不可以的,這已經可以滿足大部分應用的需求。如果需要topic中所有消息的有序性,那就只能讓這個topic只有一個分區,當然也就只有一個consumer組消費它
作者:付威 博客地址:http://blog.laofu.online 如有任何知識產權、版權問題或理論錯誤,還請指正。 本文是付威的網絡博客原創,自由轉載-非商用-非衍生-保持署名,請遵循:創意共享3.0許可證