MST

星途 面试题库

面试题:消息队列Kafka在物流轨迹实时跟踪系统中的消息可靠性保障

在物流轨迹实时跟踪场景下,消息的可靠性至关重要。请说明Kafka是如何确保消息不丢失、不重复消费的?结合物流轨迹数据传输和处理的流程,讲述生产者、消费者以及Kafka集群之间是怎样协同工作来保障消息可靠性的,若出现消息丢失或重复消费,你会从哪些方面排查问题?
15.8万 热度难度
后端开发消息队列

知识考点

AI 面试

面试题答案

一键面试

Kafka确保消息不丢失、不重复消费的机制

  1. 消息不丢失
    • 生产者端
      • Kafka生产者通过设置acks参数来控制消息发送的确认机制。当acks = 0时,生产者发送消息后不等待任何确认,这种情况下消息可能丢失;当acks = 1时,生产者发送消息后等待Leader副本确认,若此时Leader副本在确认后还未同步给Follower副本就挂掉,消息仍可能丢失;当acks = all(或acks = -1)时,生产者发送消息后等待所有ISR(In - Sync Replicas,与Leader保持同步的副本集合)中的副本都确认,这样可以最大程度保证消息不丢失。
      • 生产者还可以配置retries参数,当消息发送失败时,自动重试一定次数,避免因网络抖动等瞬时故障导致消息丢失。
    • Kafka集群端
      • Kafka采用多副本机制,每个分区有一个Leader副本和多个Follower副本。Leader负责处理读写请求,Follower定期从Leader同步数据。当Leader发生故障时,会从ISR中的Follower副本中选举出新的Leader,保证数据的可用性和持久性,从而防止消息丢失。
      • 对于写入的消息,Kafka会等待ISR中的所有副本都成功同步消息后才认为消息已成功提交,这进一步确保了即使部分副本故障,消息也不会丢失。
    • 消费者端
      • Kafka消费者采用拉取(Pull)模式消费消息。消费者维护一个偏移量(offset),记录已消费的消息位置。当消费者成功处理完一条消息后,再提交偏移量。如果在处理消息过程中消费者崩溃,重新启动后会从上次提交的偏移量处继续消费,避免消息丢失。
  2. 消息不重复消费
    • 消费者端
      • 消费者通过唯一的消费者组(Consumer Group)ID进行标识。每个分区在同一时刻只会被消费者组中的一个消费者消费,避免了同一分区消息被组内多个消费者重复消费。
      • 消费者通过精确控制偏移量的提交来确保不重复消费。只有在消息处理完成后才提交偏移量,这样即使消费者重启,也不会再次消费已提交偏移量之前的消息。
    • Kafka集群端
      • Kafka通过高水位(High Watermark,HW)机制来确保已提交消息的顺序性和不重复性。HW是ISR中所有副本最小的已同步偏移量,只有偏移量小于HW的消息才被认为是已提交消息,消费者只能消费已提交消息,保证了消费的一致性和不重复性。

物流轨迹数据传输和处理流程中各组件协同工作保障消息可靠性

  1. 生产者:在物流轨迹实时跟踪场景下,物流设备(如车载GPS设备、手持终端等)作为生产者,将采集到的物流轨迹数据发送到Kafka集群。生产者根据上述确保消息不丢失的机制,设置合适的acksretries参数,将消息发送到指定的Kafka主题(Topic)和分区(Partition)。例如,对于重要的物流轨迹数据,设置acks = all确保消息被可靠接收。
  2. Kafka集群:Kafka集群接收生产者发送的消息,按照多副本机制将消息写入相应的分区,并同步给ISR中的Follower副本。同时,Kafka为每个分区维护偏移量和高水位等元数据信息,用于跟踪消息的状态和确保消息的一致性。
  3. 消费者:物流轨迹处理应用作为消费者,从Kafka集群的指定主题和分区拉取消息。消费者在处理消息前,先读取当前分区的偏移量,按照偏移量顺序拉取消息。在成功处理完一批消息后,将偏移量提交给Kafka集群,表明这些消息已被成功消费。

消息丢失或重复消费的排查方向

  1. 消息丢失排查
    • 生产者端
      • 检查acks参数设置是否合理,是否设置为01导致消息未被完全确认就丢失。
      • 查看生产者日志,检查是否有消息发送失败且重试次数用尽的情况,可能是网络问题或Kafka集群负载过高导致发送失败。
    • Kafka集群端
      • 检查ISR副本集合的状态,是否有副本长时间不同步,导致消息无法完全同步而丢失。查看Kafka集群日志,查找是否有Leader选举异常或副本故障的记录。
      • 确认Kafka的存储配置,如磁盘空间是否已满,导致无法写入新消息。
    • 消费者端
      • 检查消费者的偏移量提交策略,是否存在偏移量提前提交的情况,导致部分消息未处理就被标记为已消费。查看消费者日志,确认是否有消费过程中崩溃且未正确恢复偏移量的情况。
  2. 消息重复消费排查
    • 消费者端
      • 检查消费者组的配置,是否存在多个消费者组消费同一分区消息的情况,导致重复消费。查看消费者代码,确认是否在消息处理完成前就提交了偏移量,使得重启后重复消费未处理的消息。
      • 检查消费者的幂等性处理逻辑,在物流轨迹处理应用中,可能存在对同一轨迹数据重复处理的情况,需要在业务层面实现幂等性,避免重复处理带来的错误。
    • Kafka集群端
      • 确认Kafka的高水位机制是否正常工作,检查是否存在高水位异常导致消费者重复消费已提交消息的情况。查看Kafka集群的元数据信息,确认分区和副本的状态是否正常,是否存在因副本同步问题导致的消息重复。