Kafka为什么在消息积压时不能直接通过消费者水平扩容来提升消费速度?

我们知道当消息生产者生产的速度快于消费者的消费速度时,会产生大量的消息积压,大多数人的想法是增加消费者的数量来提升消费速度,这个想法在RocketMQ中是可行的,但是在Kafka中不一定可行。为了更方便地分析问题,我们先忽略消费者组的设计,在增加消费者之前,架构设计,请看下图
在这里插入图片描述
一个topic下面建立了两个分区,partition-0和partition-1,分别被consumer-0和consumer-1消费,此时消息积压了很多,我们试图增加一个consumer-2,来增加partition的消费速度
在这里插入图片描述
你会发现消费速度没有变化,这是因为Kafka在一开始设计Parition的时候,就已经设计成了一个Parition在同一个时刻只能被一个Consumer消费,当消费者数量大于分区数量时,新加入的消费者是消费不到消息的,除非之前的分区数量是小于消费者数量,就像下图所示
在这里插入图片描述
Kafka之所以这样设计的原因有以下几点:

  • 保证分区局部有序性。一个分区同一时刻只能让一个消费者消费,这样有助于保证分区内的消息是有序的,能够实现在局部消息的顺序性,如果同时让多个消费者消费,必然会破坏分区的顺序性
  • 消费者组更好地协作和高吞吐。Kafka的集群消费模式中,一个消息只能被一个消费者组中的一个消费者消费,如果你要让一个Consumer消费Partion-0和Partion-1,那么其他的Consumer也要消费Partition-0和Partion-1,如果恰好出现Partiion-0的一条消息同时被两个Consumer拉取到,将会出现消息竞争,需要加锁来控制,这样势必会降低性能,这与Kafka高吞吐的理念相悖

所以在水平扩容消费者上面,相对RocketMQ来说不是那么地直接,在Kafka中需要做进一步考虑,多说一句,在RocketMQ中由于业务场景不同,相比Kafka处理的业务场景要复杂地多,所以RocketMQ需要支持消费者的水平扩容,这样就会出现消息竞争,但是为了水平扩容,RocketMQ需要这样做。

对比RocketMQ
RocketMQ在大多数情况下只会被同一个消费者组中的一个消费者实例消费,以保证消息的有序性。
但是在有些情况下,RocketMQ也支持消息负载均衡,即允许同一个MessageQueue被同一个消费者组中的多个消费者实例共同消费,

  • 消息负载均衡: 如果消费者组中存在一个实例处理速度较快,RocketMQ可能会将同一个MessageQueue分配给这个组中的其他相对较慢的实例,以实现负载均衡
  • 动态扩容:也就是我们讨论的动态增加消费者实例时,新加入的实例可能会被分配到已有实例所消费的MessageQueue上,以实现动态扩容

相关推荐

  1. Kafka顺序消费以及消息积压问题

    2024-01-22 17:40:00       120 阅读
  2. 使用时间戳消费消息(kafka)

    2024-01-22 17:40:00       52 阅读
  3. kafka 线上消费积压问题

    2024-01-22 17:40:00       33 阅读
  4. Kafka之【消费消息

    2024-01-22 17:40:00       28 阅读
  5. kafka中,使用ack提交,存在重复消费问题

    2024-01-22 17:40:00       59 阅读
  6. 消费数据积压

    2024-01-22 17:40:00       59 阅读
  7. Kafka-exporter监控消费速度与生产速度差异规则

    2024-01-22 17:40:00       28 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-22 17:40:00       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-22 17:40:00       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-22 17:40:00       82 阅读
  4. Python语言-面向对象

    2024-01-22 17:40:00       91 阅读

热门阅读

  1. 每日一道编程题:niven 数

    2024-01-22 17:40:00       52 阅读
  2. 设计类标书制作方法

    2024-01-22 17:40:00       53 阅读
  3. 常用的Qt开源库分享

    2024-01-22 17:40:00       56 阅读
  4. LeetCode 211.添加与搜索单词 - 数据结构设计 题解

    2024-01-22 17:40:00       62 阅读
  5. vue 一键换肤

    2024-01-22 17:40:00       55 阅读
  6. Python经典例题20道

    2024-01-22 17:40:00       62 阅读
  7. Hive之set参数大全-11

    2024-01-22 17:40:00       47 阅读
  8. PiflowX组件-PostgresCdc

    2024-01-22 17:40:00       55 阅读
  9. 柠檬微趣面试准备

    2024-01-22 17:40:00       50 阅读
  10. 使用helm部署 redis 单机版

    2024-01-22 17:40:00       53 阅读
  11. NGINX网站服务

    2024-01-22 17:40:00       44 阅读