一、Kafka的Topic主題
Topic主題用來區分不同類型的消息,實際也就是適用於不同的業務場景,默認消息保存一周時間;
同一個Topic主題下,默認是一個partition分區,也就是只能有一個消費者來消費,如果想提升消費能力,就需要增加分區;
同一個Topic的多個分區,可以有三種方式分派消息(key,value)到不同的分區,指定分區、HASH路由、默認,同一個分區內的消息ID唯一、自增、順序;
消費者消費partition分區內的消息時,是通過offsert來標識消費的位置,消費掉的消息並不會立刻刪除;
二、重復消費或多消費者
GroupId用來解決同一個Topic主題下重復消費問題,比如一條消費需要多個消費者接收到,就可以通過設置不同的GroupId實現;
實際消息是存一份的,只是通過邏輯上設置標識來區分,系統會記錄Topic主題下--》GroupId分組下--》partition分區下的offsert,來標識是否消費過。
三、發送消息的高可用
采用集群模式,多副本方式實現;一條消息的提交,可能通過設置acks標識實現不同的可用性,
=0時,發送成功就OK;
=1時,master成功響應才OK,
=all時,一半以上的響應才OK(真正的高可用)
四、消費消息的高可用
通過關閉自動標識offsert模式,先拉取消息,消費完成后,再去設置offsert位置,來解決消費高可用;
生產消費端需要冪等設計,防止確認失敗,而造成的消息重復;
五、Kafka高性能的原因
單個partition內的消息是順序讀寫,先進先出,消息ID是自增長,按ID分段成不同所Segment文件存儲,檢索快速;
內存讀寫是零拷貝,使用了Linux的sendfile技術,減了用戶態與內核態的內存拷貝移動次數;