1. DMQ簡介
Distributed Message Queue(分布式消息隊列),DMQ 是在kafka之上做了一層封裝,為AC的其他組件提供分布式消息隊列服務。簡單來說,DMQ就是一個消息中間件,傳遞消息。
2. DMQ組件

DMQ主要由消息提供商Producer,消息消費者Consumer,注冊中心Zookeeper以及Kafka集群組成。
消息提供商提供信息到kafka集群,消息消費者從kafka集群獲取信息,kafka集群為了提高消息的安全性,會創建多個備份,而為了保持備份與原信息的一致性,我們需要增加一個注冊中心zookeeper,它用來維護備份信息的同步。
3. KAFAKA介紹
Producer:生產者,即消息發送者,push消息到Kafka集群中的broker(就是server)中
Consumer:消費者,從Kafka集群的broker中pull消息、消費消息
Consumer group:每個 consumer 都屬於一個consumer group,每條消息只能被 consumer group 中的一個 Consumer 消費,但可以被多個 consumer group消費
Broker:Kafka集群由多個Kafka實例(Server)組成,每個實例構成一個broker,說白了就是服務器
topic:producer向kafka集群push的消息會被歸於某一類別,即Topic,這本質上只是一個邏輯概念,面向的對象是producer和consumer,producer只需要關心將消息push到哪一個Topic中,而consumer只需要關心自己訂閱了哪個Topic
partition:每一個Topic又被分為多個Partitions,即物理分區;出於負載均衡的考慮,同一個Topic的Partitions分別存儲於Kafka集群的多個broker上;而為了提高可靠性,這些Partitions可以由Kafka機制中的replicas來設置備份的數量
replicas:partition 的副本,保障 partition 的高可用
Zookeeper:kafka通過zookeeper來存儲集群的meta信息及統一topic不同partition的原子性和一致性
leader:replicas 中的一個角色, producer和consumer只跟leader交互
follower:replica 中的一個角色,從leader中復制數據
controller:kafka 集群中的其中一個服務器,用來進行leader election以及各種failover
4. Zookeeper介紹


在zookeeper中分為
Zookeeper是一個分布式的,開放源碼的分布式應用程序協調服務,它包含一個簡單的原語集,分布式應用程序可以基於它實現同步服務,配置維護和命名服務等。
Zookeeper的核心是原子廣播,這個機制保證了各個Server之間的同步。
實現這個機制的協議叫做Zab協議。Zab協議有兩種模式,它們分別是恢復模式(選主)和廣播模式(同步)。
當服務啟動或者在領導者崩潰后,Zab就進入了恢復模式,當領導者被選舉出來,且大多數Server完成了和leader的狀態同步以后,恢復模式就結束了。狀態同步保證了leader和Server具有相同的系統狀態。
5. Kafka架構與Zookeeper的交互
首先要明白為什么在producer-kafka-consumer的機制中要引入zookeeper。
上面說過,為了保障數據的可靠性,一個topic會在多個kafka服務器上備份partition,但是這就引入了數據的一致性問題,因此要引入zookeeper。
基於zookeeper,kafka為每一個partition找一個節點作為leader,其余備份作為follower,在整個工作過程中,producer充當了client。
6. DMQ全程解析
1. Producer發布消息
采用push模式將消息發布到broker,每條消息都被append到partition中,屬於順序寫磁盤
2. Broker存儲消息
物理上把 topic 分成一個或多個 patition,每個 patition 物理上對應一個文件夾(該文件夾存儲該 patition 的所有消息和索引文件)
3. Consumer消費消息
high-level consumer API 提供了consumer group的語義,一個消息只能被group內的一個consumer所消費
如果消費線程大於patition數量,則有些線程將收不到消息
如果patition數量大於線程數,則有些線程多收到多個patition的消息
如果一個線程消費多個patition,則無法保證你收到的消息的順序,而一個patition內的消息是有序的
