kafka--发布-订阅消息系统

Apache Kafka 是一个分布式流处理平台,它主要用于构建实时数据管道和流应用。尽管 Kafka 常被描述为一个消息系统,但它提供的远远超出了传统消息队列系统的功能。Kafka 的核心是一个高吞吐量、持久化、分布式的日志服务,它允许你发布和订阅流式的记录,这些记录被称为"消息"。

Kafka 的核心组件

  1. Producer(生产者)

    • 生产者是向 Kafka 主题(Topic)发送消息的客户端应用程序。
    • 生产者发送的消息被序列化后发送到 Kafka 集群。
  2. Broker(代理/服务器)

    • Kafka 集群由一个或多个服务器组成,这些服务器被称为 Kafka Broker。
    • 每个 Kafka Broker 都负责存储一部分消息数据,并提供数据服务给消费者。
  3. Topic(主题)

    • 主题是 Kafka 消息的分类标签,生产者向特定的主题发送消息,消费者从特定的主题订阅消息。
    • 每个主题可以划分为多个分区(Partition),每个分区是一个有序的、不可变的消息序列。
  4. Partition(分区)

    • 分区是 Kafka 消息的物理分组。每个分区内的消息都是有序的,但分区间的消息顺序不保证。
    • Kafka 集群中的每个 Broker 可以拥有多个分区,但每个分区只能由一个 Broker 来处理。
  5. Consumer(消费者)

    • 消费者是从 Kafka 主题订阅消息并处理这些消息的客户端应用程序。
    • Kafka 支持消费者组(Consumer Group)的概念,每个消费者组内的消费者共同处理同一个主题的消息,但每个消息只会被组内的一个消费者处理。

Kafka 的发布-订阅模式

Kafka 的发布-订阅模式基于主题和分区。生产者将消息发布到特定的主题,消费者从他们感兴趣的主题订阅消息。Kafka 提供了以下几个关键特性来支持这种模式:

  • 高吞吐量:Kafka 被设计用来处理大量的消息,支持每秒数百万条消息的发布和消费。
  • 持久性:Kafka 提供了消息的持久化存储,确保即使系统崩溃,消息也不会丢失。
  • 可扩展性:Kafka 集群可以很容易地通过添加更多的 Broker 来扩展,以处理更多的消息。
  • 容错性:Kafka 能够自动处理 Broker 的失败,保证数据的可靠性和可用性。
  • 消息顺序:在单个分区内,Kafka 保证消息的顺序性。

使用场景

Kafka 广泛应用于各种场景,包括但不限于:

  • 日志收集系统
  • 消息队列系统
  • 流处理系统
  • 实时数据管道
  • 实时分析和监控

当进一步探讨Kafka内部的可操作细节时,我们可以从生产者、消费者、Broker以及集群管理等多个方面进行深入。以下是对这些内部可操作细节的进一步补充:

###生产者(Producer)

  1. 消息发送

    • 生产者通过send()方法将消息发送到Kafka集群。在发送过程中,生产者可以选择是否启用幂等性(Idempotence)和事务(Transactions)来保证消息的原子性和一致性。
    • 消息在发送前会经过拦截器(Interceptor)处理,并经过序列化器(Serializer)对消息的键(Key)和值(Value)进行序列化。
    • 序列化后的消息会根据分区器(Partitioner)的策略选择发送到哪个分区。如果没有指定分区,Kafka会使用默认的轮询策略或其他用户定义的策略来决定分区。
  2. 缓存与批量发送

    • 生产者会将消息先发送到RecordAccumulator缓存区,这个缓存区的大小由生产者配置的buffer.memory参数决定。
    • 当缓存区中的消息达到一定大小(由batch.size参数决定)或等待时间超过linger.ms参数指定的时间后,生产者会唤醒Sender线程将消息批量发送到Broker。
  3. 发送确认与重试

    • 生产者可以通过配置acks参数来控制消息的发送确认机制。acks=0表示生产者不需要等待Broker的确认;acks=1表示等待Leader副本的确认;acks=-1acks=all表示等待ISR(In-Sync Replicas)列表中所有副本的确认。
    • 如果消息发送失败,并且配置了重试次数(retries),生产者会尝试重新发送消息。

消费者(Consumer)

  1. 订阅与拉取

    • 消费者通过订阅(Subscribe)一个或多个主题来接收消息。消费者可以加入消费者组(Consumer Group)以实现负载均衡和故障转移。
    • 消费者通过拉取(Poll)操作从Broker获取消息。每次拉取操作会返回一个消息集合,消费者需要遍历这个集合并处理每条消息。
  2. 偏移量管理

    • 消费者通过维护自己的偏移量(Offset)来跟踪已经消费的消息位置。消费者可以手动提交偏移量,也可以配置自动提交偏移量。
    • 消费者可以指定从最早的偏移量开始消费(从头开始),或者从最新的偏移量开始消费(只消费新消息)。
  3. 消费者组协调

    • Kafka通过消费者组的协调者(Coordinator)来管理消费者组内的成员和分区分配。当消费者加入或离开消费者组时,协调者会触发重新平衡(Rebalance)操作来重新分配分区。

Broker

  1. 消息存储

    • Broker将接收到的消息存储在磁盘上的Log文件中。每个分区对应一个Log文件,Log文件被划分为多个Segment(段),以便于管理和维护。
    • Kafka使用索引文件(Index File)来快速定位Log文件中的消息位置。
  2. 副本同步

    • 每个分区都有一个Leader副本和零个或多个Follower副本。Leader副本负责处理读写请求,Follower副本从Leader副本同步数据。
    • Kafka通过ISR(In-Sync Replicas)列表来管理与Leader副本保持同步的Follower副本。只有当Follower副本的同步进度达到特定条件时,它才会被添加到ISR列表中。
  3. 请求处理

    • Broker接收到生产者的发送请求或消费者的拉取请求后,会将这些请求传递给相应的请求处理器(Request Processor)进行处理。
    • 请求处理器会根据请求类型执行相应的操作,如将消息写入Log文件、更新分区状态或回复消费者等。

集群管理

  1. 控制器选举

    • Kafka集群中有一个或多个Broker会被选举为控制器(Controller)。控制器负责监控集群的状态、管理分区和副本的分配、处理Broker的加入和离开等。
    • 控制器的选举通过ZooKeeper或Kafka内部的Raft协议来完成。在新版本的Kafka中,ZooKeeper的依赖逐渐被减弱,Kafka内部实现了更多的集群管理功能。
  2. 元数据管理

    • Kafka使用ZooKeeper或Kafka内部的元数据管理机制来存储集群的元数据信息,如Broker列表、分区和副本的分配情况等。
    • 客户端通过向ZooKeeper或Kafka集群查询元数据信息来获取必要的配置和状态信息。

综上所述,Kafka的内部机制涉及生产者、消费者、Broker以及集群管理等多个方面。这些内部机制共同协作,使得Kafka能够高效地处理大规模的消息流,并提供高吞吐量、低延迟、可扩展性和容错性等特性。

相关推荐
代码探秘者9 小时前
【Redis】分布式锁深度解析:实现、可重入、主从一致性与强一致方案
java·数据库·redis·分布式·缓存·面试
西***634710 小时前
无死机、高流畅!FPGA架构高清画面分割器解锁多场景应用新可能
分布式·音视频
升职佳兴14 小时前
CentOS 9 下 HBase 2.4.9 分布式集群安装与配置实战
分布式·centos·hbase
山北雨夜漫步14 小时前
微服务01
分布式·微服务·架构
2501_9333295514 小时前
舆情监测系统的技术架构与实践:Infoseek如何用AI重构企业品牌护城河
人工智能·分布式·自然语言处理
lang2015092816 小时前
Logback MDC 实战:在分布式混沌中构建清晰的日志链路
分布式·logback
@土豆17 小时前
Kafka on Kubernetes 有状态应用部署文档(KRaft 模式)
分布式·kafka·kubernetes
肥猪猪爸17 小时前
数据库 2PC 极简流程图
java·数据库·分布式·mysql·分布式事务·2pc
斯普信专业组18 小时前
Kafka集群数据迁移方案:基于多Listener配置的集群迁移实践指南
分布式·kafka
only-qi19 小时前
RabbitMQ 深度解析:从架构原理到消息全链路可靠性保障
分布式·架构·rabbitmq