kafka的结构? ack默认级别?

Apache Kafka 是一个分布式流处理平台,主要用于构建实时数据管道和流应用。其核心架构主要包括以下组件:

  1. Broker

    • Kafka Broker 是运行在服务器上的进程,负责接收、存储和转发消息。Kafka 集群由多个相互协作的 Broker 组成,每个 Broker 可以管理多个主题(Topic)并维护这些主题的分区(Partition)。
  2. Topic

    • 主题是逻辑上的类别划分,每个主题内部可以进一步划分为多个分区,每个分区都是一个有序的、不可变的消息序列。
  3. Partition

    • 分区是物理上的细分单元,每个分区都有自己的偏移量(offset),并且在同一分区内的消息是有序的。
  4. Producer

    • 生产者客户端负责发布消息到指定的主题,可以选择将消息发布到哪个分区。
  5. Consumer

    • 消费者客户端订阅主题并拉取消息进行处理。消费者可以组成消费组,同一个消费组内的消费者共同消费一个主题的所有分区,但每个分区只被一个消费者实例消费。
  6. Replication

    • 每个分区都有若干副本(replica),其中一个为主副本(Leader),其他为跟随副本(Follower)。主副本负责处理读写请求,跟随副本用于备份和故障转移。

ACK 确认级别
Kafka 生产者在发送消息后可以配置不同的 ACK 确认级别,以控制消息何时被认为已成功写入 Kafka 集群。以下是可用的 ACK 级别:

  • acks=0

    • 生产者不等待任何来自 Broker 的确认响应,消息发送后立即认为成功,这种情况下消息可能会丢失,但它提供了最高的吞吐量。
  • acks=1(默认级别):

    • 生产者至少需要 Leader 副本确认收到消息才认为消息发送成功。这意味着如果Leader崩溃但在ISR(In-Sync Replicas)窗口期之前未同步到其他副本,则可能造成消息丢失。
  • acks=all-1

    • 生产者需要所有参与复制的 ISR 列表中的副本都确认收到消息才认为消息发送成功。这是最安全的设置,但也降低了吞吐量,因为它等待所有同步副本完成写入。

kafka有序性如何保证?

在Apache Kafka中,消息的有序性是通过分区(partitions)来保证的。Kafka的保证是在单个分区内部的消息是有序的,也就是说,对于同一分区内的消息,生产者发送的消息会按照它们到达的顺序依次存储,而消费者也会按照相同的顺序拉取和消费这些消息。

具体保证消息有序性的方法包括:

  1. 分区策略

    • 生产者在发送消息时,可以根据消息的键(key)来决定消息应该被路由到哪个分区。如果所有具有相同键的消息都被发送到同一个分区,那么这些消息在消费时将会保持原来的顺序。
  2. 控制并发

    • 为了确保顺序,生产者配置max.in.flight.requests.per.connection参数可以控制在收到 broker 确认之前,单个网络连接上最多有多少个未完成请求。设置为1可以确保在发送新消息前,上一条消息已被确认,这样可以防止由于重试导致的消息顺序错乱。

    • 对于幂等性(idempotence)开启的生产者,在Kafka 0.11版本之后,即使max.in.flight.requests.per.connection大于1,也能保证一定程度的顺序,因为Kafka服务端会缓存一定的请求元数据来确保最近几个请求的顺序。

  3. 消费者消费顺序

    • 如果需要全局有序消费,可以设计消费者的消费策略,使其只使用一个消费者实例订阅一个只有一个分区的主题,这样所有消息会被按照发布的顺序依次消费。
最后编辑: kuteng  文档更新时间: 2024-04-02 09:53   作者:kuteng