1. 程式人生 > >漫遊Kafka入門篇之簡單介紹

漫遊Kafka入門篇之簡單介紹

釋出訊息通常有兩種模式:佇列模式(queuing)和釋出-訂閱模式(publish-subscribe)。佇列模式中,consumers可以同時從服務端讀取訊息,每個訊息只被其中一個consumer讀到;釋出-訂閱模式中訊息被廣播到所有的consumer中。

Consumers可以加入一個consumer 組,共同競爭一個topic,topic中的訊息將被分發到組中的一個成員中。同一組中的consumer可以在不同的程式中,也可以在不同的機器上。如果所有的consumer都在一個組中,這就成為了傳統的佇列模式,在各consumer中實現負載均衡。

如果所有的consumer都不在不同的組中,這就成為了釋出-訂閱模式,所有的訊息都被分發到所有的consumer中。

更常見的是,每個topic都有若干數量的consumer組,每個組都是一個邏輯上的“訂閱者”,為了容錯和更好的穩定性,每個組由若干consumer組成。這其實就是一個釋出-訂閱模式,只不過訂閱者是個組而不是單個consumer。
由兩個機器組成的叢集擁有4個分割槽 (P0-P3) 2個consumer組. A組有兩個consumerB組有4個 相比傳統的訊息系統,Kafka可以很好的保證有序性。 傳統的佇列在伺服器上儲存有序的訊息,如果多個consumers同時從這個伺服器消費訊息,伺服器就會以訊息儲存的順序向consumer分發訊息。雖然伺服器按順序釋出訊息,但是訊息是被非同步的分發到各consumer上,所以當訊息到達時可能已經失去了原來的順序,這意味著併發消費將導致順序錯亂。為了避免故障,這樣的訊息系統通常使用“專用consumer”的概念,其實就是隻允許一個消費者消費訊息,當然這就意味著失去了併發性。 在這方面Kafka做的更好,通過分割槽的概念,Kafka可以在多個consumer組併發的情況下提供較好的有序性和負載均衡。將每個分割槽分只分發給一個consumer組,這樣一個分割槽就只被這個組的一個consumer消費,就可以順序的消費這個分割槽的訊息。因為有多個分割槽,依然可以在多個consumer組之間進行負載均衡。注意consumer組的數量不能多於分割槽的數量,也就是有多少分割槽就允許多少併發消費。
Kafka只能保證一個分割槽之內訊息的有序性,在不同的分割槽之間是不可以的,這已經可以滿足大部分應用的需求。如果需要topic中所有訊息的有序性,那就只能讓這個topic只有一個分割槽,當然也就只有一個consumer組消費它。