线上问题及优化

  1. 消息丢失
  • 发送端min.insync.replicas配置>1
  • 消费端手动提交offset
  1. 重复消费
  • 发送 由于重试机制 解决办法
  • 消费 消费幂等处理 redis setnx 分布式锁
  1. 消息乱序
  • ack不为0 同步发送到相同分区
  • countDownLanch 消费端业务处理
  1. 消息积压
  • 修改消费端程序 将其快速转发到其他topic 再启动多个消费者同时消费新主题不同分
  • 转类似死信队列
  1. 延时队列 使用特定主题 使用定时器
  2. 消息回溯 用consumer的offsetsForTimes seek等方法
  3. kafka分区上限 分布式存储redis集群 上限100个节点

测试脚本 kafka-producer-perf-test.sh

  1. 消息传递保障
  • at most once <=1条ack=0
  • at least once >=1条ack=all ack=-1
  • exactly once 消费幂等性+at least once还可以用kafka生产者的幂等性实现
  1. kafka事务 一批消息同时成功同时失败
  2. 高性能原因 顺序读写 零拷贝(sendfile->网卡接口 MMAP内存映射技术) 批量batch处理以及压缩传输 rocketmq预留1G文件空间