一、Kafka的使用场景
a、消息系统
kafka最主要的使用场景,必然是消息系统(分布式消息订阅系统)。
kafka的特性:
- 削峰
- 冗余存储
- 系统解耦
- 缓冲
- 异步通信
- 扩展性和可恢复性
b、存储系统
kafka的本地持久化策略
c、流式处理平台
二、Kafka的顺序性
顺序性是在消费时的顺序。
如果需要保证全局的消息顺序性,这样显然是违背了kafka的设计初衷的,可能你需要换一个方案。
下面会说明为什么会这样。
a、单Partition如何保证顺序
当生产者发送的消息是顺序时,众所周知,如果配置了多个分区,消息是会分到不同的分区的,这样就没办法保证顺序了。因此,
生产者在生产消息时,可以指定key
ProducerRecord<Integer, String> record = new ProducerRecord<>(topic, key, msg);
相同key的消息会发到topic的同一分区中,这样,在消费时,从这一分区获取的数据就是顺序的。
存放分区数据的默认的default策略是对分片数取余。
**这样会带来一个问题,分区数增加了怎么办?**后面的文章会再分析这个问题
b、单Partition场景细化
问题:
- broker在发送ack到producer时,网络超时了,producer重试,这样消息不是重复了吗?
- producer连续发送两条消息,m1和m2,m1由于某些原因,发送失败,m2发送成功,m1重试后成功,这样发到partition中不是乱序了吗?
解决:
- kafka引入了pid和sequenceNumber,producer发送到broker时,会带有一个sequenceNumber,同时broker本身也维护一个sequenceNumber,commit一次