kafka顺序消费&消息丢失&消息重发&重复消费

kafka的顺序消费、重复消费以及消息丢失是在面试过程中经常会被问到三点,本文将从kafka架构生产者、broker、消费者三个角度分析

kafka架构

架构
体系结构中的角色

  • 生产者
    生产者将消息发送到topic中去,同时负责选择将message发送到topic的哪一个partition中。通过round­robin做简单的 负载均衡。也可以根据消息中的某一个关键字来进行区分。通常第二种方式使用的更多
  • 消费者
    传统的消息传递模式有2中:队列( queue) 和(publish-subscribe),kafka基于这两种模式提供了消费者组(consumer group)概念,
    • queue模式:所有的consumer都位于同一个consumer group 下。
    • publish-subscribe模式:所有的consumer都有着自己唯一的consumer group
  • broker
    kafka服务器,存储消息,多个broker组成kafka集群
  • zookeeper
    管理集群元数据、控制器选举等操作的分布式协调器

topic、partion和replication

在broker的内部设计了topic、partion和replication这三个核心概念
一张图彻底理解他们的关系
在这里插入图片描述
依图解析

  • 一个broker就是一台kafka服务器,这个kafka集群
  • 一个topic下的消息分多个partion存储,这叫replication
  • 同一个topic下的partion分布在不同的机器上
  • 每个topic都有一个leader partion
  • leader partion所在机器中的其他partion为follower partion,leader 负责所有的读写操作,follower执行leader的指令

消费者组

一张图说明
在这里插入图片描述
一句话,每个partion可以被多个消费者组中的一个消费者实例消费

回到问题

如何保证顺序消费

在这里插入图片描述

  • 同一类消息发送到同一个partion,比如订单号
  • 消费者内部起N个内存队列,同一类消息发送到同一内存队列中,同时每个内存队列对应一个线程处理

消息丢失&重发消息&重复消费

  • 生产者可能出现的问题
    在这里插入图片描述
    生产者是直接和topic的leader partion打交道的
  1. 生产者从集群中获取topic的leader partion元数据
  2. 生产者向leader partion发送消息
  3. 如果消息是需要些到指定的partion,有leader发出指令
  4. leader收到写完的ack再回复producer ack

leader partion 回复producer ack有三种机制
1. ack 0,即producer发完不管,可能丢消息
2. ack 1,leader收到消息马上回复producer ack,不管有没有把消息些到follower partion,可能丢消息
3. ack all,确保follower写入消息后再回复producer ack,如果网络抖动回复producer ack 失败,会有重发问题

  • broker 可能出现的问题
    在这里插入图片描述
    broker写入数据并不是马上刷盘的,中间有系统cache,达到一定时间或cache达到一定量才会刷盘,如果突然宕机或断电可能出现消息丢失

  • 消费者 可能出现的问题

  1. 如果设置自动ack,如果消费端挂了但自动ack 可能丢消息
  2. 如果设置手动提交ack,处理完消息后提交ack,在处理完后提交ack前挂了就可能出现重复消费

总结

深入理解kafka架构,理解topic、partion、消费者、消费者组概念,才能真正理解问题所在,理解到的才是自己的

整理不易,转载请注明出处。欢迎联系、探讨技术问题,共同进步。

Logo

Kafka开源项目指南提供详尽教程,助开发者掌握其架构、配置和使用,实现高效数据流管理和实时处理。它高性能、可扩展,适合日志收集和实时数据处理,通过持久化保障数据安全,是企业大数据生态系统的核心。

更多推荐