Kafka什么情况下会出现消息丢失的情况

  • 消息生产时如果设置的acks不是全部副本,那么如果follower副本在未完成同步之前,leader副本挂掉了,就会导致消息丢失。
  • 存储时如果没有多副本备份,消息也可能会丢失
  • 消费时如果没有确认消费成功再提交offset,而这时候消费者又挂掉了,消息同样会丢失

Kafka如何保证消息不丢失

  1. 设置生产者配置参数acks = all或者-1,设置全部副本响应
  2. 主题分区配置多副本
  3. 消费的时候一定要确认消费成功再提交offset

MQ消息积压怎么办

  • 扩容:如果分区数量大于消费者数量,可以通过扩容消费端的实例数量来提升总体的消费能力;如果相等,那么既需要扩容消费者数量同时也需要扩容分区数
  • 降级:如果短时间内没有足够的服务器资源来扩容,我们可以将系统降级,关闭一些不重要的分支业务,让系统还能正常运作,服务一些重要业务
  • 排查异常:通过监控发现,如果无论是发消息的速度还是消费消息的速度都和原来没怎么区别,这时候可以检查一下消费端,看是不是消费失败导致的一条消息反复消费这种情况比较多,这种情况会使得整个系统变慢。如果监考到消费变慢,需要检查一下你的消费实例,分析一下是什么原因导致的变慢。优先检查一下日志是否有大量的消费错误,如果没有错误的话,可以通过打印堆栈信息,看消费线程是不是卡在某个地方不动了,比如触发了死锁或者卡在等待某个资源上了

Kafka如何保证消息不重复消费

Kafka出现重复消费的原因:

  • 消费者宕机、重启或者被强行kill进程,导致消费者提交的offset没有提交,恢复正常后可能会重复消费
  • 由于消费者端处理业务时间长导致会话超时,那么会触发Rebalance重平衡,此时可能存在消费者offset没提交,会导致重平衡后重复消费

消息重复消费是不可避免的,因此一定要保证接口幂等性

Kafka如何实现精准一次性语义

本质是不重复+不丢失。不重复的核心是幂等消费,不丢失的核心是为主题分区配置好多副本,并且设置acks为全部副本,同时消费的时候一定要消费成功再提交offset

你有一个业务希望进入Kafka的消息都是有序的,你应该怎么设计

Kafka的分片流入规则是这样的:如果制定了Partition,那么就是发送到特定的Partition;如果没有指定Partition,但是制定了key,那么就根据key的Hash取模来决定是哪个Partition;如果都没有指定就依次轮流写入

因此我们可以用一个能标识业务的唯一名字来当key,比如秒杀,叫做Seckill,指定的key一定是落入在一个Partition中,也就保持了有序