What's kafka
What's kafka
- Kafka 可以提供 MQ 功能:發(fā)布 & 訂閱消息
- Kafka 可以提供 stream processing 功能
- Kafka 提供對 messages/ streams 的存儲功能(通過配置刃跛,決定存儲的 retention,當(dāng)然苛萎,本質(zhì)上我們不能把 Kafka 當(dāng)成真正的存儲系統(tǒng)來用)
- Kafka 是 distributed system桨昙,搭建 cluster 來靈活動態(tài)的伸縮容
Kafka vs Messaging system
Kafka 是一個 MQ 系統(tǒng),支持 publish & subscribe messages腌歉,就像 ActiveMQ, RabbitMQ蛙酪,核心就是處理消息,提供 producer & consumer 的解耦翘盖。
Kafka 和普通 MQ 系統(tǒng)的真正不同在于它的 stream processing capabilities桂塞,可以通過該功能讀取 streams & 動態(tài)的輸出 streams。
Kafka vs RabbitMQ
- RabbitMQ 不會存數(shù)據(jù)馍驯,沒有消費者的話藐俺,msg 就丟了
- RabbitMQ 支持靈活的 exchange 策略,Kafka 的 topic 不支持
- Kafka 需要 Zookeeper 來管理 cluster泥彤,RabbitMQ 不需要
- Kafka 對 Java 友好
- Kafka 的社區(qū)活躍度比 RabbitMQ 高
Kafka vs Big data systems
Hadoop 支持大規(guī)模的 data 存儲 & 周期性的處理文件數(shù)據(jù)欲芹。
Kafka 側(cè)重于提供實時、低延遲的大量 data 處理能力
Kafka vs ETL tools
ETL 的主要能力在于:從一個系統(tǒng)中獲取到數(shù)據(jù)吟吝,插入到新的系統(tǒng)中菱父。Kafka 也可以提供該能力。
Summary
Kafka 通過抽象數(shù)據(jù)流的概念,把以上三種類型系統(tǒng)的能力結(jié)合了起來浙宜。而 stream processing 正是 Kafka 的突出亮點官辽。
Messages and Batches
Messages
kafka 中 message 是可以持久化一定時間的,但是不同的配置 (retention)會影響 messages 保留的時間長短粟瞬。觸發(fā)閾值時同仆,消息會被刪除。
retention 是針對 topic 來配置的裙品,可以配置的項有兩個:
- 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ù)場景對 message 丟失俗批、重復(fù)、延遲的忍耐程度不同市怎,需要使用不同的配置參數(shù)岁忘、不同的 API
Batches
Batches 是一組 messages。Batches 中的 messages 擁有相同的 topic and partition区匠。
producer client 創(chuàng)建消息后干像,實際上會先緩存在本地的 buffer 中,等收集到一定量后驰弄,batches 發(fā)送給 broker麻汰。這種方式提升了效率,但導(dǎo)致了消息發(fā)送的延遲戚篙∈惨遥可以根據(jù)業(yè)務(wù)需求,通過配置 batch 的 size 來調(diào)節(jié)延遲已球。
Serializer and deserializer
message 在網(wǎng)絡(luò)間傳遞時臣镣,是需要 serialize 的,這時就需要有 serializer智亮。
kafka 中有以下幾種 serializer:
- string serializer
- Custom Serializer
- Serializing Using Apache Avro
默認(rèn)的 string serializer 不夠靈活忆某,custom serializer 又需要投入大量的時間開發(fā),比較建議使用現(xiàn)成的 serializer 工具阔蛉,如 Apache Avro弃舒。Avro 通過 schema 的概念很好的實現(xiàn)了 serialize & deserialize 的功能。schemas 存儲在獨立的 register 中状原。producer & consumer 都從 schema repository 中讀取 schema 來達(dá)到自動更新兩端的能力聋呢。
Topic
kafka 中的消息是按 topic 來組織的〉咔可以把 topic 理解成數(shù)據(jù)庫中 table 的概念削锰。
Partitions
partition 是 topic scale 的重要手段,它跟存儲系統(tǒng)中的分片是一個概念毕莱。topic split 成多個 partitions器贩,topic 中的 messages 分布到不同的 partitions 中颅夺,平衡負(fù)載,提高寫性能蛹稍,同時通過增加 consumer group 中 consumers 的個數(shù)吧黄,達(dá)到提高讀性能的目的。
kafka 可以保證單個 partition 上的 msg 是有序的唆姐,但是在各個 partition 間拗慨,是無法維持一個全局有序的。
如何決定消息落到哪個 partition 上:
- 不指定 message 的 partition & key 參數(shù)奉芦,根據(jù) round-robin algorithm 赵抢,隨機(jī)落到某個 partition
- 指定 message 的 key
2.1 默認(rèn)的 partitioner 對 key 應(yīng)用一定的 hash 算法,來決定 partition 位置
2.2 默認(rèn)的 key partition 算法在某種業(yè)務(wù)場景下仗阅,會導(dǎo)致各個 partition 的數(shù)據(jù)量嚴(yán)重不平衡。根據(jù)業(yè)務(wù)場景自定義 partitioner国夜,對 key 應(yīng)用自定義的算法來分配 partition 位置 - 指定 partition减噪,則忽略 key,直接按照配置的 partition 去存儲消息
改變 topic 的 partition 個數(shù)后车吹,相同 key 的 messages 在改變前后可能分配到不同的 partition 中筹裕,如果業(yè)務(wù)系統(tǒng)對此敏感,則建議:
1窄驹、初始時朝卒,估算好恰當(dāng)?shù)摹⒆銐虼蟮?partitions
2乐埠、初始化后抗斤,盡量不改