業(yè)務(wù)消息系統(tǒng)對于微服務(wù)架構(gòu)的必要性
- 微服務(wù)中少不了 EDA事件驅(qū)動機(jī)制荧琼,進(jìn)而少不了引入一套 業(yè)務(wù)消息系統(tǒng)處理事件
- 業(yè)務(wù)消息系統(tǒng)要保證消息的可靠性、一致性衷咽、可用性狞换、事務(wù)
Kafuka 作為業(yè)務(wù)消息系統(tǒng)的可能性和主流性污呼,主要用于消峰和異步解耦多組微服務(wù)
Kafuka作為業(yè)務(wù)消息系統(tǒng)的優(yōu)勢
- 時(shí)間復(fù)雜度O(1)提供消息持久化裕坊,對 TB 級數(shù)據(jù)也可以保證O(n)訪問性能,可以配置保留策略
- 高吞吐燕酷,單機(jī)100k/s 以上消息傳輸籍凝,引入sendfile、mmap系統(tǒng)調(diào)用實(shí)現(xiàn)"零拷貝"苗缩,基于順序 io 不是隨機(jī) io 和 clickhouse存儲原理類似饵蒂,
- 支持 多組server間消息分區(qū),分布式消費(fèi)酱讶,同時(shí)保證每個(gè) partition 內(nèi)消息順序傳輸(offset)
- 同時(shí)支持離線數(shù)據(jù)和在線實(shí)時(shí)數(shù)據(jù)處理
- 最重要支持在線橫向擴(kuò)展
Exactly Once:事務(wù)性退盯,確保分布式場景下的數(shù)據(jù)最終一致性
在0.11之前還不支持事務(wù),只能做到 at least once泻肯、at most once 渊迁,0.11以后官方實(shí)現(xiàn)了一套分布式事物機(jī)制實(shí)現(xiàn)了 exactly once模式,這個(gè)是可以作為業(yè)務(wù)消息系統(tǒng)的關(guān)鍵
消費(fèi)者消費(fèi)消息時(shí)可以指定具體的讀隔離級別 - at least once
讀完消息先 commit灶挟。這種模式下琉朽,如果在處理完消息后 commit 之前的 Consumer crash了,下次重新開始工作還會處理剛剛沒有 commit 的消息稚铣,實(shí)際上該消息已經(jīng)被處理過了箱叁。 - at most once
讀完消息先 commit 再處理消息。這種模式下惕医,如果 Consumer 在 commit 后還沒來得及處理消息就 crash 了耕漱,下次重新開始工作后就無法讀到剛剛已提交而未處理的消息。
0.11以后引入了冪等性曹锨,producer 不論向 server 發(fā)送多少重復(fù)數(shù)據(jù)server 只能持久化一條
https://www.cnblogs.com/middleware/p/9477133.html
Replication:可用性
0.8以后引入了 Replication孤个,相同 Partition可能會有多個(gè) Replica選舉出一個(gè) Leader一定程度上保證了可用性
Rebalance:高可用和在線水平擴(kuò)展
當(dāng)新的消費(fèi)者加入消費(fèi)組時(shí),會消費(fèi)一個(gè)或多個(gè)分區(qū)沛简,這些分區(qū)是之前其他消費(fèi)者負(fù)責(zé)的
作為業(yè)務(wù)消息系統(tǒng)對比rabbitmq齐鲤、rocketmq
- 使用 kafuka 一定程度上可以保證基建統(tǒng)一,kafuka無論對于日志分析還是實(shí)時(shí)計(jì)算都是不可替代的一個(gè)重要組成椒楣,如果業(yè)務(wù)系統(tǒng)也應(yīng)用 kfk 一定程度上降低系統(tǒng)復(fù)雜度给郊,技術(shù)棧復(fù)雜度
- 高吞吐、高可用對于業(yè)務(wù)消息系統(tǒng)一樣重要
- kafuka官方暫時(shí)不支持延時(shí)隊(duì)列捧灰、消息重試淆九,需要自己實(shí)現(xiàn)统锤,也可以考慮接入其他 mq 實(shí)現(xiàn)
https://juejin.cn/post/7065664161786626084
http://dockone.io/article/9820
https://zhuanlan.zhihu.com/p/365802989