设计 Kafka 消费者和生产者以实现可扩展性
Posted
技术标签:
【中文标题】设计 Kafka 消费者和生产者以实现可扩展性【英文标题】:Design Kafka consumers and producers for scalability 【发布时间】:2021-04-24 22:39:41 【问题描述】:我想设计一个解决方案,用于向多个提供商发送不同类型的电子邮件。总览。
我有几个上游提供商 Sendgrid、Zoho、Mailgun 等。它们将用于发送电子邮件等。例如:
新用户注册邮箱 删除用户的电子邮件 空间配额限制的电子邮件(一般大约6种电子邮件)
每种类型的电子邮件都应生成到生产者中,转换为序列化 Java 对象并发送到与上游提供者集成的适当 Kafka 消费者。
问题是如何设计 Kafka 以获得最大的性能和可扩展性?
到目前为止,我认为第一个解决方案是为每种类型的电子邮件和每个网关(6x4 = 24 个主题)设置主题。将来我希望添加更多类型的消息和网关。也许它会达到600个主题。这将使大量 Java 源代码用于维护和大量主题需要管理。另一个缺点是 Kafka 日志会很大。
第二个解决方案是为每个消费者(集成网关)使用 1 个主题。但在这种情况下,如何根据我要发送的消息类型发送每种类型的不同序列化 Java 对象?
是否有更好的方法来设计此设置,以便我可以更轻松地扩展它并使其在未来的集成中变得非常强大?
您可以在这里看到我如何在消费者和生产者之间发送消息:org.apache.kafka.common.KafkaException: class SaleRequestFactory is not an instance of org.apache.kafka.common.serialization.Serializer
编辑:
-
顺序很重要,因为通信将是异步的。生产者将等待返回消息的状态
将每个网关的数据保留在不同的主题上并不重要
您想要什么样的隔离?
我希望将消息/主题彼此完全隔离,以防止将来在需要添加更多网关或消息类型时出错
将每个网关的数据保存在不同的主题上对您来说很重要吗? - 不,我只想隔离 hte 数据。
如果您希望每个网关使用一个主题,您是否关心它会在客户端产生的开销? - 读取不必要的消息、编写更多逻辑、混合序列化程序等
我不知道这里。我的主要考虑是使系统易于扩展新功能。
【问题讨论】:
【参考方案1】:我认为对于您提到的操作开销而言,每种事件类型一个主题确实太多了。
我认为选项 2 是正确的方法 - 每个集成网关一个主题,有专门的消费者。优点是:
您在主题级别隔离工作负载(集成网关 A 上的许多消息不会影响网关 B 的使用者) 您可以根据主题工作负载扩展消费者生产者会根据网关的要求将消息序列化,并发布到特定的主题上。消费者只会阅读消息并推送它。
【讨论】:
【参考方案2】:不幸的是,这里没有简单的答案。 您需要问自己几个问题并从一些权衡中进行选择 -
首先,顺序很重要吗?只是您想从 A 点转发到 B 点的电子邮件吗?还是您想(我想您会)将事件的合理顺序保留给同一实体(例如 - 关于用户创建的邮件需要在邮件之前收到关于更改密码的同一新用户的邮件。)
如果顺序很重要,最好使用带有partitioning key 的同一主题,因为 Kafka 仅在分区级别保证消息的顺序。
你想要什么样的隔离?将每个网关的数据保存在不同的主题上对您来说很重要吗? 如果您要为每个网关使用一个主题,您是否关心它将在客户端产生的开销? - 读取不必要的消息、编写更多逻辑、混合序列化程序等
你能估计一下你会在哪些维度上进行缩放吗? - 如果您使用第一个解决方案,每个网关和事件类型的主题,突然您需要添加 100 倍的网关,它不一定是正确的调用。此外,如果您需要更快地处理User-Change-Emails
,会发生什么? - more partitions lead to higher throughput - 你能做到吗?
Confluent 几乎没有关于那些可能对您有帮助的主题的精彩文章 -
Should You Put Several Event Types in the Same Kafka Topic?
How to choose the number of topics/partitions in a Kafka cluster?
【讨论】:
以上是关于设计 Kafka 消费者和生产者以实现可扩展性的主要内容,如果未能解决你的问题,请参考以下文章