Loading

kafka总结

kafka的优点:

解耦、冗余、扩展、灵活性,峰值处理能力、可恢复性、顺序保证、缓冲、异步通信

kafka的组件:

Break
Topic
 partition
 group_id
producer
consumer

kafka为什么吞吐量高?

  1. 磁盘顺序读写,pageCache使用Liunx来管理缓存
  2. 零拷贝:
    1. 传统的复制:磁盘文件->内核空间读取缓冲区->用户缓冲区(应用程序上下文)->socket缓冲区->网卡接口->消费者进程
    2. 零拷贝:磁盘文件->内核空间读取缓冲区->网卡接口->消费者进程
  3. 数据以分区形式存放:
    1. 并发读写,加速性能;
    2. 多分区存储,利于数据均衡;
      1. broker-->topic-->partition-->segment file segment file****:分为index索引文件和log数据文件,分别以后缀".index"和“.log”结尾。
  4. 批量压缩:
    1. 压缩后批量传输,降低网络带宽压力;

kafka消息丢失的场景?

  1. 客户端:auto.commit.enable=true的时候,当消费者拉到消息后还没有处理结束,自动commit的提交间隔时间到,自动提交了offerset,而消费者这时挂了,重启后,之前的消息就丢失了。
  2. 服务端:网络压力过大,写磁盘很忙,写入失败,有没有重试,数据丢失。
  3. 磁盘损坏;
  4. 单批次数据的长度超过了限制会丢失数据。

解决方案:

  1. 首先客户端要配置:auto.commit.enable=false没次结束手动提交commit offerset,确保数据都被正确消费;
  2. 其次服务端要配置:kafka一定要配置消息重试机制,并且重试时间一定要长,默认的一秒钟不符合生产环境;
  3. 配置高可用,多副本,保证数据完整性;
  4. 合理的设置flush间隔,kafka一开始数据都是存储到pagecache中,一定间隔才刷新到磁盘,消息开始不是存储到磁盘的,如果在刷新间隔出现了断电等,就会出现数据丢失。

kafka扩容后,一部分消费者消费不到消息?可能是什么原因?

如果你发现你的一个消费者客户端A已经启动了,但是就是不消费消息,此时你应该检查一下该消费者所在的组中(ConsumerGroup)是否还有其他的消费者,topic的分区可能被组中其他的消费者线程抢走(负载均衡机制),从而导致消费者客户端A连一个分区都没有得到,自然消费不到消息。

双集群模式下,kafka的顺序存储会出现什么问题?还能保证消息的顺序性吗?

博客园

posted @ 2021-03-11 16:55  书中人007  阅读(100)  评论(0编辑  收藏  举报
拈花微笑·恬淡诠释生命