Kafka 基礎(chǔ)概念:Message & Topic

What's kafka

kafka.jpg

What's kafka

  • Kafka 可以提供 MQ 功能:發(fā)布 & 訂閱消息
  • Kafka 可以提供 stream processing 功能
  • Kafka 提供對(duì) messages/ streams 的存儲(chǔ)功能(通過(guò)配置,決定存儲(chǔ)的 retention,當(dāng)然,本質(zhì)上我們不能把 Kafka 當(dāng)成真正的存儲(chǔ)系統(tǒng)來(lái)用)
  • Kafka 是 distributed system,搭建 cluster 來(lái)靈活動(dòng)態(tài)的伸縮容

Kafka vs Messaging system

Kafka 是一個(gè) MQ 系統(tǒng),支持 publish & subscribe messages,就像 ActiveMQ, RabbitMQ,核心就是處理消息,提供 producer & consumer 的解耦。
Kafka 和普通 MQ 系統(tǒng)的真正不同在于它的 stream processing capabilities,可以通過(guò)該功能讀取 streams & 動(dòng)態(tài)的輸出 streams。

Kafka vs RabbitMQ

  • RabbitMQ 不會(huì)存數(shù)據(jù),沒(méi)有消費(fèi)者的話,msg 就丟了
  • RabbitMQ 支持靈活的 exchange 策略,Kafka 的 topic 不支持
  • Kafka 需要 Zookeeper 來(lái)管理 cluster,RabbitMQ 不需要
  • Kafka 對(duì) Java 友好
  • Kafka 的社區(qū)活躍度比 RabbitMQ 高

Kafka vs Big data systems

Hadoop 支持大規(guī)模的 data 存儲(chǔ) & 周期性的處理文件數(shù)據(jù)。
Kafka 側(cè)重于提供實(shí)時(shí)、低延遲的大量 data 處理能力

Kafka vs ETL tools

ETL 的主要能力在于:從一個(gè)系統(tǒng)中獲取到數(shù)據(jù),插入到新的系統(tǒng)中。Kafka 也可以提供該能力。

Summary

Kafka 通過(guò)抽象數(shù)據(jù)流的概念,把以上三種類(lèi)型系統(tǒng)的能力結(jié)合了起來(lái)。而 stream processing 正是 Kafka 的突出亮點(diǎn)。

Messages and Batches

Messages

kafka 中 message 是可以持久化一定時(shí)間的,但是不同的配置 (retention)會(huì)影響 messages 保留的時(shí)間長(zhǎng)短。觸發(fā)閾值時(shí),消息會(huì)被刪除。

retention 是針對(duì) topic 來(lái)配置的,可以配置的項(xiàng)有兩個(gè):

  • log.retention.ms: Retention by time is performed by examining the last modified time (mtime) on each log segment file on disk.
  • log.retention.bytes: all retention is performed for an individual partition, not the topic.
    If you have specified a value for both log.retention.bytes and log.retention.ms (or another parameter for retention by time), messages may be removed when either criteria is met.

不同的業(yè)務(wù)場(chǎng)景對(duì) message 丟失、重復(fù)、延遲的忍耐程度不同,需要使用不同的配置參數(shù)、不同的 API

Batches

Batches 是一組 messages。Batches 中的 messages 擁有相同的 topic and partition。
producer client 創(chuàng)建消息后,實(shí)際上會(huì)先緩存在本地的 buffer 中,等收集到一定量后,batches 發(fā)送給 broker。這種方式提升了效率,但導(dǎo)致了消息發(fā)送的延遲??梢愿鶕?jù)業(yè)務(wù)需求,通過(guò)配置 batch 的 size 來(lái)調(diào)節(jié)延遲。

Serializer and deserializer

message 在網(wǎng)絡(luò)間傳遞時(shí),是需要 serialize 的,這時(shí)就需要有 serializer。

kafka 中有以下幾種 serializer:

  • string serializer
  • Custom Serializer
  • Serializing Using Apache Avro

默認(rèn)的 string serializer 不夠靈活,custom serializer 又需要投入大量的時(shí)間開(kāi)發(fā),比較建議使用現(xiàn)成的 serializer 工具,如 Apache Avro。Avro 通過(guò) schema 的概念很好的實(shí)現(xiàn)了 serialize & deserialize 的功能。schemas 存儲(chǔ)在獨(dú)立的 register 中。producer & consumer 都從 schema repository 中讀取 schema 來(lái)達(dá)到自動(dòng)更新兩端的能力。


message registry.jpg

Topic

kafka 中的消息是按 topic 來(lái)組織的??梢园?topic 理解成數(shù)據(jù)庫(kù)中 table 的概念。

Partitions

partition 是 topic scale 的重要手段,它跟存儲(chǔ)系統(tǒng)中的分片是一個(gè)概念。topic split 成多個(gè) partitions,topic 中的 messages 分布到不同的 partitions 中,平衡負(fù)載,提高寫(xiě)性能,同時(shí)通過(guò)增加 consumer group 中 consumers 的個(gè)數(shù),達(dá)到提高讀性能的目的。

kafka 可以保證單個(gè) partition 上的 msg 是有序的,但是在各個(gè) partition 間,是無(wú)法維持一個(gè)全局有序的。

如何決定消息落到哪個(gè) partition 上:

  1. 不指定 message 的 partition & key 參數(shù),根據(jù) round-robin algorithm ,隨機(jī)落到某個(gè) partition
  2. 指定 message 的 key
    2.1 默認(rèn)的 partitioner 對(duì) key 應(yīng)用一定的 hash 算法,來(lái)決定 partition 位置
    2.2 默認(rèn)的 key partition 算法在某種業(yè)務(wù)場(chǎng)景下,會(huì)導(dǎo)致各個(gè) partition 的數(shù)據(jù)量嚴(yán)重不平衡。根據(jù)業(yè)務(wù)場(chǎng)景自定義 partitioner,對(duì) key 應(yīng)用自定義的算法來(lái)分配 partition 位置
  3. 指定 partition,則忽略 key,直接按照配置的 partition 去存儲(chǔ)消息

改變 topic 的 partition 個(gè)數(shù)后,相同 key 的 messages 在改變前后可能分配到不同的 partition 中,如果業(yè)務(wù)系統(tǒng)對(duì)此敏感,則建議:
1、初始時(shí),估算好恰當(dāng)?shù)摹⒆銐虼蟮?partitions
2、初始化后,盡量不改

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容