kafka分区与消费者配置

发布时间 2023-10-22 11:30:33作者: 夜空中最暗的星

kafka分区与消费者配置

工作当中如何计算分区与消费者数量,如何最大化利用资源,防止不必要的浪费,本文将带你计算

1.基本概念回顾

Kafka是一个分布式流处理平台,具有高吞吐量、可扩展性和容错性。以下是一些Kafka的基本概念:

  • 消息:Kafka是一个消息传递系统,它通过生产者将消息发布到主题(topic),然后通过消费者从主题订阅并消费消息。
  • 主题(Topic):主题是消息的分类或者流的名称。生产者将消息发布到特定的主题,而消费者可以订阅一个或多个主题来消费消息。
  • 分区(Partition):每个主题可以分成一个或多个分区。分区是消息的有序序列,每个消息都有一个唯一的偏移量(offset)。分区使得Kafka可以在多个服务器上并行处理和存储消息。
  • 生产者(Producer):生产者负责将消息发布到Kafka主题。生产者将消息发送到特定的主题和分区,或者通过Kafka的分区器自动选择分区。
  • 消费者(Consumer):消费者订阅一个或多个主题,并从分区中拉取消息进行消费。消费者可以以不同的消费者组(Consumer Group)的形式进行组织,每个消费者组可以有一个或多个消费者。
  • 消费者组(Consumer Group):消费者组是一组具有相同消费者组ID的消费者的集合。每个分区只能由一个消费者组中的一个消费者进行消费,这样可以实现负载均衡和并行处理。
  • 偏移量(Offset):偏移量是消息在分区中的唯一标识符,用于跟踪消费者在分区中的消费位置。消费者可以控制自己的偏移量,并决定从哪个偏移量开始消费消息。
  • Broker:Kafka集群中的每个服务器节点称为Broker。每个Broker负责处理消息的存储和复制,以及与生产者和消费者进行通信。

2. 计算方式

  1. 数据量预估(秒/分)

    比如物联网数据告警场景下: 我们有2000台设备,单个设备数据采集点个数: 100个,数据上传频率为1分钟上传一次,配置了告警的设备约占总数量的30%

    由此可得出:

    ​ 1分钟数据量: 2000 * 100 = 200000

    ​ 1秒钟数据量: (1分钟数据量) (200000 * 0.3 (30%的数据) ) / 60s = 1000

  2. 单条数据在业务处理中耗时 ? 单条数据处理耗时: 50ms ,一个线程1秒钟处理20个

  3. 目前Kafka分配了多少个分区 ? 分区数: 32 需要确保每个消费者组中的消费者数量不超过32个

  4. 消费者数量(服务器数量) 4台

每个实例并行度:spring.kafka.listener.concurrency 配置计算方式为: 分区数/实例数 = 32 / 4 = 8 (建议不要超过8),超过8可能会造成线程闲置,也就是说消费组内每个实例只负责8个分区的数据.
每秒可消费数据量: 4台实例 总处理线程为32个,每1秒钟可处理 32 * (1000ms / (单个数据处理耗时)50ms) = 640个
1000 - 640 , 明显处理不过来,会堆积数据, 我们需要放入阻塞队列结合线程池进行异步消费

每秒处理1000个数据,而单个线程每秒可以处理20个数据。为了合理规划阻塞队列大小和线程池数量,可以考虑以下方案:

  1. 阻塞队列大小:由于单个线程每秒可以处理20个数据,可以设置一个容量较小的阻塞队列来缓存待处理的数据。这样可以确保线程池中的线程不会因为队列满而阻塞。
    例如,可以设置阻塞队列的大小为50以上,以便缓存一定数量的待处理数据。
  2. 线程池数量:为了处理每秒1000个数据,需要将线程池的线程数量设置为适当的值。可以根据以下公式计算线程池的大小:
    线程池大小 = 数据量每秒 / 单个线程每秒处理的数据量
    线程池大小 = 1000 / 20 = 50
    由于线程池的大小通常需要为整数,可以将线程池大小设置为50,以确保有足够的线程来处理数据。