【问题标题】:Best ways to design a kafka consumer设计卡夫卡消费者的最佳方法
【发布时间】:2022-01-05 21:24:00
【问题描述】:

在获得创建 Kafka 消费者的最佳设计解决方案方面需要帮助。

将有多个主题,例如,这些主题可能就像小组说的那样 用于发送 电子邮件 的 10 个主题(选择 10 个是因为将获得更多的客户流量,并且希望每个客户专用一个主题,就像每个客户的每个主题一样,这样其他人就不会被延迟或等待)

处理一个业务逻辑的10个主题,10个计数解释同上。

现在有了这种用法,设计 Kafka 消费者的最佳方式是什么?消费者专注于每个主题?还是有一种方法可以通过传入需要订阅的主题来动态扩展消费者?肯定会在容器中部署它,但需要有关如何开始使用具有动态可伸缩性和通用代码的消费者部分的建议。实现这种卡夫卡消费者的最佳技术是什么? (dotnet/java/python) ?

另外请建议分区在这种设计中是否有意义,以便我们可以利用消费者群体。

【问题讨论】:

  • 在某些情况下,“每个客户的主题”并不是一个好的设计,尤其是当您接触到成千上万的客户时。您可以使用单独的主题来处理“email-sent”或“email-read”的事件,并具有一些交叉引用值,但这些事件将与实际的 SMTP 电子邮件客户端流量分开

标签: apache-kafka kafka-consumer-api producer-consumer


【解决方案1】:

属于同一消费者组的消费者被分配到一个主题中的分区。

在kafka中,一个topic可以有多个partition。消费者从他们分配的分区中消费特定主题的消息。分区中的消息按顺序偏移量排序。

现在,主题范围的记录顺序并不重要,您通常希望从主题中的更多分区开始。假设从 100 个分区开始。您的数据将分布在主题中的 100 个分区中,假设为空键或至少 100 个具有非冲突哈希的唯一键值,因为记录键确定分区。如果主题顺序很重要,则您仅限于一个分区,因此仅限于一个消费者线程;但是,该线程可以通过将记录加载到替代数据结构(队列)中进行处理,从而将消费与处理分开。

您现在可以让 10 个消费者从 100 个分区消费。每个消费者将被分配到大约 10 个分区,他们将以循环方式消费消息。

如果您想向外扩展,只需增加消费者的数量即可。如果您将消费者数量翻倍至 20,则每个消费者将处理 5 个分区,因此您将获得双倍的吞吐量。

【讨论】:

  • 如果您不确定卷的大小并希望如上所述位于较高的一侧,请始终保持较高的分区计数。此外,如果您在消费者中使用任何有状态的操作,那么更改分区数会很痛苦。因此,请始终根据一些性能测试保持最佳分区数
  • 肯定会使用更高的分区数,而且我认为我们不需要在这里订购。但是在编写这个消费者服务代码时有什么技术建议吗?
  • 我也在寻找一种实现消息延迟的方法,因为在某些情况下我们希望消息的处理被延迟。我知道 Kafka 非常适合处理数百万条消息,但有一点延迟,但是有没有什么架构可以引入数据库来持久化延迟的消息并在延迟遇到时处理它们?对此实施有何想法?
猜你喜欢
  • 2019-07-03
  • 2018-05-05
  • 2021-08-22
  • 1970-01-01
  • 1970-01-01
  • 2016-03-28
  • 2020-10-28
  • 2015-12-18
  • 2019-03-27
相关资源
最近更新 更多