丢消息

丢消息的情况

  • 生产者发送消息。丢消息的原因主要是生产者一般发送消息到 kafka 都是异步的,所以有可能失败之后没有处理。解决方案一般是进行失败重试,或者设置发消息的方法设置成同步。
  • 消费者消费消息。丢消息的原因主要是消费者拉取消息后会设置 autocommit offset,但是消费者拉取消息后因为某些原因宕机后没有处理这个数据导致丢消息。解决方案可以先关掉 autocommit offset,等待业务处理完后再提交。但是这个方案要注意不要让消费者消费过长让 kafka 超时踢出消费者组导致 rebalance
  • kafka 中 topic 及 replicate 的主从同步。

注解

前提知识:kafka 的高可用方案是把一个 topic 在多台 kafka 实例上做了副本 replicate (当然也分了 leader 和 follower, 用的是 zk 管理,新版本的 kafka 也去除了zk 管理的依赖)。这时一般的读写都是从 leader 上操作的,当 leader 接收了一个消息, 没有来得及同步到 follwer 前 broker 挂掉了,会导致丢消息。

解决方案

  • 全同步。可配置一个参数 acks = all,也就是类似于 Mysql 主从复制中的全同步,等到所有 topic 副本都同步完才返回给生产者发送成功。
  • 半同步。可配置一个参数 mini.sync.replicas。也就是 Mysql 的半同步,可以设置同步到多少个副本就返回给生产者发送成功
  • 新增副本个数,增大同步到的概率。可配置一个参数 replication.factor,也就是增大副本的个数,因为副本越多,同步到的概率就越大,但会导致数据冗余。