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能够高效地处理大规模的消息流,并提供高吞吐量、低延迟、可扩展性和容错性等特性。

相关推荐
郭源潮34520 分钟前
Hadoop
大数据·hadoop·分布式
Allen Bright2 小时前
RabbitMQ中的普通Confirm模式:深入解析与最佳实践
分布式·rabbitmq
dzend2 小时前
Kafka、RocketMQ、RabbitMQ 对比
kafka·rabbitmq·rocketmq
李昊哲小课2 小时前
deepin 安装 kafka
大数据·分布式·zookeeper·数据分析·kafka
Kobebryant-Manba3 小时前
zookeeper+kafka的windows下安装
分布式·zookeeper·kafka
_oP_i9 小时前
Pinpoint 是一个开源的分布式追踪系统
java·分布式·开源
lucky_syq11 小时前
Flume和Kafka的区别?
大数据·kafka·flume
观测云12 小时前
Confluent Cloud Kafka 可观测性最佳实践
kafka·confluent
攻心的子乐12 小时前
Kafka可视化工具 Offset Explorer (以前叫Kafka Tool)
分布式·kafka
小林想被监督学习12 小时前
RabbitMQ 的7种工作模式
分布式·rabbitmq