Kafka的复习
- 为什么要使用Kafka
Kafka是一个消息引擎,或者说消息队列
其具有削峰的效果,可以将消息缓存,避免下游收到过多数据崩溃
解耦,可以让不同系统不必直接联系,而是只要符合约定即可,
广播,可以将一条消息广播给下游所有的系统
健壮性,具有对消息持久化高可用的保存能力
- Kafka消费过的消息如何重新消费
这一点,可以让consumer在启动的时候设置自己的消息位移,在此处可以设置制定的位移位置,也可以设置为一个虚化的概念,比如最早,最晚。
- Kafka的消息存储机制
首先说是存储在磁盘之上,不过利用了顺序写入文件,加上直接映射,从而加快了写入的速度
- Kafka的查找为什么这么快
首先,Kafka会分文件进行存储,无论是时间达到了,还是存储的文件大小达到了,都会进行分段。
其次是利用了大量的index文件进行加快查找
而且在实际的查找过程中,利用了二分法进行了快速查找,利用offset快速定位到了Message的文件位置。
- Kafka的消息保存机制
生产者的不丢失,这是在生产端发送消息的时候,可以设置ACK,可以设置为0,这样生产端发送数据不等待响应就继续发送
或者设置为1,这样需要leader落盘后才能发送下一条
设置完-1,则需要leader将消息发送给所有的ISR才能发下一条
对于消费者,则是由commit机制保证的,消费者的消费偏移量保存在了kafka中的一个内部topic,这样消费者可以保证不commit,消息就一直在
对于Kafka本身的消息,则是利用replication的概念进行保存,有了备份,所以不丢失。
- Kafka重启是否会数据丢失
因为进行了持久化保存,所以数据不会丢失。
- Kafka为什么不支持读写分离
Kafka支持的是主读主写的模型,而不是主写从读
之所以这样支持有两方面原因,一方面主写从读涉及到集群内不同节点的数据交换,必然有一定的延迟
另一方面,Kafka利用了收到消息即刻落盘,之后再读取的方式。从而加快了读取速度
而且没有延迟,没有数据不一致的问题
- Kafka数据分区和消费者的关系
一个分区可以对应多个消费组,但是对于一个消费组,只能由一个组内成员进行消费,从而避免重复消费。
- Kafka数据如何读取的
首先说根据consumer group中的分配到的分区,去kafka内部队列中,查看当前的group id对应的分区的偏移量。
然后连接对应分区的Leader Broker
将自己保存的offset发送给Leader
Leader 根据offset等信息定位到segment等索引文件
最后根据索引获取日志文件中的数据,并返回consumer进行消费
- 如何保证消息有序
因为一个topic下有多个partition,不能保证partition之间的有序性,所以一种解决方案就是把业务有序的打到同一个partition中。
- 消息堆积怎么办
对于消息堆积,要么考虑增加topic的分区数,并且增加消费者组的消费数。
要么就是增大处理能力。
- 单条消息最大上限
默认是1M,不过可以通过配置进行修改。
比如message.max.bytes 单个消息最大接受度
replica.fetch.max.bytes 同步的时候消息最大字节数,默认是1M