当前位置: 首页 > 知识库问答 >
问题:

在Apache Kafka中,为什么使用者实例不能比分区多呢?

曹建明
2023-03-14

我正在了解Kafka,阅读这里的导言部分

https://kafka.apache.org/documentation.html#导言

特别是关于消费者的部分。在导言的倒数第二段中,案文如下

Kafka做得更好。通过在主题中具有并行性(分区)的概念,Kafka能够在消费者进程池上提供排序保证和负载平衡。这是通过将主题中的分区分配给使用者组中的使用者来实现的,以便每个分区由该组中的恰好一个使用者使用。通过这样做,我们确保使用者是该分区的唯一读取器,并按顺序使用数据。由于有许多分区,这仍然平衡了许多使用者实例的负载。但是请注意,使用者实例不能比分区多。

我的困惑源于最后那句话,因为在作者描述了两个消费者组和一个4分区主题的图片中,消费者实例比分区多!

使用者实例不能比分区多也是没有意义的,因为分区会小得令人难以置信,而且为每个使用者实例创建一个新分区的开销似乎会使Kafka陷入困境。我知道分区用于容错和减少任何一台服务器上的负载,但是上面的句子在分布式系统的上下文中没有意义,因为分布式系统应该能够一次处理数千个使用者。

共有1个答案

徐卓
2023-03-14

好的,要理解它,需要理解几个部分。

  1. 为了提供订购总订单,消息只能发送给一个消费者。否则效率极低,因为在发送下一个消息之前,它需要等待所有使用者接收到消息:

然而,尽管服务器按顺序发送消息,但消息是异步传递给使用者的,因此它们可能会在不同的使用者上无序到达。这实际上意味着在存在并行消耗的情况下会丢失消息的排序。消息传递系统通常通过“独占消费者”的概念来解决这一问题,该概念只允许一个进程从队列中消费,但当然这意味着处理过程中不存在并行性。

另外,您认为的性能损失(多个分区)实际上是性能增益,因为Kafka可以完全并行地执行不同分区的操作,同时等待其他分区完成。

开头介绍了两种情况:

如果所有使用者实例都具有相同的使用者组,那么这就像传统队列在使用者上平衡负载一样工作。

 类似资料:
  • 我已经在kafka上工作了相当长的六个月,我对用户延迟和存储到主题分区中的数据有一些疑问。 问题1:最初,当我开始阅读Kafka并了解如何使用Kafka的功能时,我被教导说,一个只有一部分和一个复制因子的主题会创造奇迹。经过相当长的六个月的工作,将我的项目迁移到live之后,使用我的主题消息的消费者开始给我一个延迟。我阅读了许多关于消费者延迟的堆栈溢出答案,得出结论,如果我增加某个主题的分区和复制

  • 问题内容: 考虑以下示例: 并且还请参见下面的示例,该示例创建了Tk背对背的实例,而不是一次创建,因此在任何给定时间都只有一个实例Tk: 为什么拥有多个实例被认为是不好的Tk? 第二个代码段是否被认为更好一些,还是遇到了与第一个代码相同的条件? 问题答案: 为什么拥有多个实例被认为是不好的Tk? Tkinter只是围绕导入Tk库的嵌入式Tcl解释器的python包装器。创建根窗口时,将创建Tcl解

  • 问题内容: 我可以使用分号在Python中加入行,例如 但是为什么我不能这样做 问题答案: 简短的(至今有效的)答案只是“因为未定义语言语法以允许它”。至于为什么 这是 的话,就很难,如果除非你问任何人与语法的部分来了,但我想这是由于可读性,这是Python的目标之一并非不可能,以确保1。 你为什么要写像这样晦涩难懂的东西?只需将其分成多行: 我认为这种变体要清晰得多。 1自: 可读性计数。

  • /usr/local/kafka2.12-2.6.0/config/server.properties 在开始动物园管理员和Kafka之后,创建一个新的主题 检查所有三个节点上的集群状态

  • 我正在尝试使用文件系统。我的< code>CMakeLists.txt中有< code>-std=c 11 -std=c 1y。GCC版本为4.9.2。然而,我得到了一个错误: 使用的正确方法是什么?

  • 问题内容: 我只是意识到,SQL Server比较器用于文本比较时不区分大小写。关于此功能,我有几个问题: 所有数据库都相同还是特定于SQL Server? 到目前为止,我一直在使用该功能来确保文本比较不敏感。遵循相同的方法还是个好主意吗? 如何在SQL Server中进行区分大小写的比较? 为什么操作员默认不区分大小写的比较? 问题答案: 不可以,区分大小写与等号无关。 区分大小写由数据库的排序