kafka消息隊(duì)列
? 使用消息件:肖峰,解耦和米母,擴(kuò)展下愈,異步
? kafaka是一個(gè)分布式的消息引擎
? 支持發(fā)布/訂閱消息
? 多個(gè)分區(qū),提高并發(fā)能力
? 消息持久化到磁盤(pán)
? topic主題
? ? ? ?Kafka通過(guò)topic對(duì)消息進(jìn)行歸類(lèi)署拟。每一個(gè)topic下有多個(gè)不同的分區(qū)婉宰,每一個(gè)分區(qū)再物理位置上對(duì)應(yīng)一個(gè)文件夾,存儲(chǔ)這個(gè)分區(qū)的消息芯丧。文件夾命名topicname_parationIdnex
? 文件夾里面包括消息的log文件和消息的索引文件芍阎,使得kafaka的吞吐率可擴(kuò)展提升
? partition分區(qū)
? 分一個(gè)分區(qū)的消息都是有序的,不變的缨恒。消息投遞的時(shí)候谴咸,可以通過(guò)指定key,根據(jù)分區(qū)的策略將消息均勻的分發(fā)到不同的分區(qū)骗露,達(dá)到負(fù)載均衡岭佳。
? 投遞kafka的消息在分區(qū)里面給消息都會(huì)分配一個(gè)offset偏移量∠麸保可以通過(guò)控制偏移量指定消息的位置珊随,控制消息是否重復(fù)消費(fèi)
? Broker? 中間件kafak sever
? ? ? 用來(lái)存放消息。kafka集群的每一個(gè)server都是一個(gè)broker
? Cousumer消費(fèi)者
? ? ? ? ? 消費(fèi)者通過(guò)消費(fèi)者組來(lái)標(biāo)識(shí)自己。一個(gè)組內(nèi)的消費(fèi)者叶洞,是主從關(guān)系鲫凶,不重復(fù)消費(fèi)同一個(gè)分區(qū),但是可以并發(fā)的消費(fèi)不同分區(qū)的數(shù)據(jù)衩辟。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 不同組:同一個(gè)分區(qū)的消息可以重復(fù)消費(fèi)
? kafka的高可用
? ? ?同步復(fù)制:投遞到kafka的消息螟炫,需要所有的follow都寫(xiě)入完成,才認(rèn)為消息寫(xiě)入成功艺晴,進(jìn)行commit昼钻。這種影響了吞吐量
? ? ?異步復(fù)制:消息寫(xiě)入到leader后,記錄到leader的log中就認(rèn)為消息寫(xiě)入成功封寞,commit然评。follow通過(guò)從leader上進(jìn)行pull數(shù)據(jù)同步。這種提高吞吐狈究。但是碗淌,但follow未完全復(fù)制,leader宕機(jī)了就會(huì)造成數(shù)據(jù)的丟失
? ? Isr副本同步機(jī)制
結(jié)合同步和異步的復(fù)制機(jī)制進(jìn)行平衡高可用抖锥。生產(chǎn)者只把消息寫(xiě)入分區(qū)的leader贯莺,leader記錄log后,所有的follow從leader進(jìn)行數(shù)據(jù)的同步宁改。follow完成同步后缕探,會(huì)進(jìn)行ack反饋給leader,
leader收到后还蹲,提交消息爹耗。Leader將增加HW并且向Producer發(fā)送ACK。這樣就可以確保谜喊,leader掛了潭兽,只要有一個(gè)follow副本存在數(shù)據(jù)就不會(huì)丟失消息
lsr的動(dòng)態(tài)更新
? leader會(huì)監(jiān)控同步,當(dāng)有一個(gè)follow宕機(jī)或者同步落后太多斗遏,會(huì)從同步副本里面移除山卦。
? follow的反饋超過(guò)設(shè)置replica.lag.max.messages最大值,follow未在設(shè)定時(shí)間內(nèi)發(fā)送ack給kafka
? 監(jiān)聽(tīng)follow的復(fù)制機(jī)制的是zk诵次,通過(guò)改變zk的node節(jié)點(diǎn)账蓉,一旦發(fā)現(xiàn)有broker宕機(jī),會(huì)刪除node幾點(diǎn)
? 每個(gè) broker 都會(huì)在 zookeeper 的臨時(shí)節(jié)點(diǎn) "/controller" 注冊(cè) watcher監(jiān)聽(tīng)逾一。當(dāng)controller掛機(jī)铸本,會(huì)刪除controller,此時(shí)所有的broker會(huì)嘗試重新新建controller path路徑,然后遵堵,在新建的controller path中選擇一個(gè)作為controller
當(dāng)leader宕機(jī)的時(shí)候箱玷,從lru中選舉新的leader
? 如果leader宕機(jī)怨规,lru中存在leader的完整最新數(shù)據(jù)的副本,就從lru中選擇一個(gè)作為leader
? ? ? ? ? ? ? ? ? ? ? ? ? ? lru中沒(méi)有存在leader的最新副本锡足,會(huì)隨機(jī)選舉一臺(tái)作為leader波丰,為了保證數(shù)據(jù)不丟失,會(huì)返回?cái)?shù)據(jù)寫(xiě)入失敗舶得,數(shù)據(jù)重新寫(xiě)入
kafka如何保證消息的冪等性呀舔,不丟失
不丟失:
? 寫(xiě)入的時(shí)候,消息提交成功保證了至少有一個(gè)副本
? sender的重試機(jī)制
? 生產(chǎn)者在寫(xiě)入消息時(shí)扩灯,重寫(xiě)發(fā)送消息失敗的方法onError方法,進(jìn)行重寫(xiě)投遞
? 消費(fèi)者在消費(fèi)消息的時(shí)候霜瘪,業(yè)務(wù)處理完畢珠插,在進(jìn)行消息的提交
不重復(fù)
? ? 消費(fèi)者進(jìn)行冪等