设计 Kafka 消费者和生产者以实现可扩展性

Design Kafka consumers and producers for scalability

我想设计一个解决方案,用于向多个提供商发送不同类型的电子邮件。总体概述。

我有几个上游供应商Sendgrid、Zoho、Mailgun等,他们将用于发送电子邮件等。例如:

(一般6种左右的邮件)

每种类型的电子邮件都应该生成到生产者中,转换成序列化的Java对象并发送到与上游提供者集成的适当的 Kafka 消费者。

问题是如何设计 Kafka 以获得最佳性能和可扩展性?

是否有更好的方法来设计此设置,以便我可以更轻松地扩展它并使其对未来的集成非常稳健?

你可以在这里看到我如何在消费者和生产者之间发送消息:org.apache.kafka.common.KafkaException: class SaleRequestFactory is not an instance of org.apache.kafka.common.serialization.Serializer

编辑:

  1. 顺序很重要,因为通信将是异步的。生产者将等待返回消息的状态
  2. 将每个网关的数据保存在不同的主题上并不重要
  3. 你想要什么样的隔离? 我希望 ot 将 messages/topics 彼此完全隔离,以防止将来在我需要添加更多网关或消息类型时出错

将每个网关的数据保存在不同的主题上对您来说很重要吗? - 不,我只是想隔离 hte 数据。

如果您愿意为每个网关使用一个主题,您是否关心它在客户端产生的开销? - 读取不必要的消息、编写更多逻辑、混合序列化程序等

我不知道这里。我的主要关注是使系统易于扩展新功能。

我认为每个事件类型一个主题对于您提到的运营开销来说确实太多了。

选项 2 我认为是正确的方法 - 每个集成网关一个主题,有专门的消费者。优点是:

  • 您在主题级别隔离工作负载(集成网关 A 上的许多消息不会影响网关 B 的使用者)
  • 您可以根据主题工作量扩展使用者

制作方会根据网关的要求对消息进行序列化,在特定的话题上发布。消费者只会阅读消息并推送它。

嗯,不幸的是,这里没有简单的答案。
您需要问自己几个问题并从一些权衡中做出选择 -

首先,订单重要吗?您只是想从 A 点转发到 B 点的电子邮件吗?还是要(我想您会)保持合理的事件顺序到同一实体(例如 - 关于用户创建的邮件需要在关于更改密码的同一新用户的邮件之前收到。)

如果顺序很重要,最好使用带有 的相同主题,因为 Kafka 仅在分区级别保证消息的顺序。

你想要什么样的隔离?将每个网关的数据保存在不同的主题上对您来说很重要吗?
如果您希望每个网关使用一个主题,您是否关心它会在客户端产生的开销? - 读取不必要的消息、编写更多逻辑、混合序列化程序等

你能估计一下你会在哪些维度上进行缩放吗? - 如果您使用第一个解决方案,每个网关和事件类型的主题,突然您需要添加 100 倍的网关,这不一定是正确的选择。此外,如果您需要更快地处理 User-Change-Emails 会怎样? - more partitions lead to higher throughput - 你能做到吗?


Confluent 几乎没有关于可能对您有帮助的主题的精彩文章 -

您应该将多个事件类型放在同一个 Kafka 主题中吗?

如何选择Kafka集群中topics/partitions的个数?