kafka总结
kafka的优点:
解耦、冗余、扩展、灵活性,峰值处理能力、可恢复性、顺序保证、缓冲、异步通信
kafka的组件:
Break
Topic
partition
group_id
producer
consumer
kafka为什么吞吐量高?
- 磁盘顺序读写,pageCache使用Liunx来管理缓存
- 零拷贝:
- 传统的复制:磁盘文件->内核空间读取缓冲区->用户缓冲区(应用程序上下文)->socket缓冲区->网卡接口->消费者进程
- 零拷贝:磁盘文件->内核空间读取缓冲区->网卡接口->消费者进程
- 数据以分区形式存放:
- 并发读写,加速性能;
- 多分区存储,利于数据均衡;
- broker-->topic-->partition-->segment file segment file****:分为index索引文件和log数据文件,分别以后缀".index"和“.log”结尾。
- 批量压缩:
- 压缩后批量传输,降低网络带宽压力;
kafka消息丢失的场景?
- 客户端:auto.commit.enable=true的时候,当消费者拉到消息后还没有处理结束,自动commit的提交间隔时间到,自动提交了offerset,而消费者这时挂了,重启后,之前的消息就丢失了。
- 服务端:网络压力过大,写磁盘很忙,写入失败,有没有重试,数据丢失。
- 磁盘损坏;
- 单批次数据的长度超过了限制会丢失数据。
解决方案:
- 首先客户端要配置:auto.commit.enable=false没次结束手动提交commit offerset,确保数据都被正确消费;
- 其次服务端要配置:kafka一定要配置消息重试机制,并且重试时间一定要长,默认的一秒钟不符合生产环境;
- 配置高可用,多副本,保证数据完整性;
- 合理的设置flush间隔,kafka一开始数据都是存储到pagecache中,一定间隔才刷新到磁盘,消息开始不是存储到磁盘的,如果在刷新间隔出现了断电等,就会出现数据丢失。
kafka扩容后,一部分消费者消费不到消息?可能是什么原因?
如果你发现你的一个消费者客户端A已经启动了,但是就是不消费消息,此时你应该检查一下该消费者所在的组中(ConsumerGroup)是否还有其他的消费者,topic的分区可能被组中其他的消费者线程抢走(负载均衡机制),从而导致消费者客户端A连一个分区都没有得到,自然消费不到消息。