设计 Kafka 消费者和生产者以实现可扩展性
Design Kafka consumers and producers for scalability
我想设计一个解决方案,用于向多个提供商发送不同类型的电子邮件。总体概述。
我有几个上游供应商Sendgrid、Zoho、Mailgun等,他们将用于发送电子邮件等。例如:
- 新用户注册邮箱
- 删除用户的电子邮件
- 电子邮件 Space 配额限制
(一般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
编辑:
- 顺序很重要,因为通信将是异步的。生产者将等待返回消息的状态
- 将每个网关的数据保存在不同的主题上并不重要
- 你想要什么样的隔离?
我希望 ot 将 messages/topics 彼此完全隔离,以防止将来在我需要添加更多网关或消息类型时出错
将每个网关的数据保存在不同的主题上对您来说很重要吗? - 不,我只是想隔离 hte 数据。
如果您愿意为每个网关使用一个主题,您是否关心它在客户端产生的开销? - 读取不必要的消息、编写更多逻辑、混合序列化程序等
我不知道这里。我的主要关注是使系统易于扩展新功能。
我认为每个事件类型一个主题对于您提到的运营开销来说确实太多了。
选项 2 我认为是正确的方法 - 每个集成网关一个主题,有专门的消费者。优点是:
- 您在主题级别隔离工作负载(集成网关 A 上的许多消息不会影响网关 B 的使用者)
- 您可以根据主题工作量扩展使用者
制作方会根据网关的要求对消息进行序列化,在特定的话题上发布。消费者只会阅读消息并推送它。
嗯,不幸的是,这里没有简单的答案。
您需要问自己几个问题并从一些权衡中做出选择 -
首先,订单重要吗?您只是想从 A 点转发到 B 点的电子邮件吗?还是要(我想您会)保持合理的事件顺序到同一实体(例如 - 关于用户创建的邮件需要在关于更改密码的同一新用户的邮件之前收到。)
如果顺序很重要,最好使用带有 的相同主题,因为 Kafka 仅在分区级别保证消息的顺序。
你想要什么样的隔离?将每个网关的数据保存在不同的主题上对您来说很重要吗?
如果您希望每个网关使用一个主题,您是否关心它会在客户端产生的开销? - 读取不必要的消息、编写更多逻辑、混合序列化程序等
你能估计一下你会在哪些维度上进行缩放吗? - 如果您使用第一个解决方案,每个网关和事件类型的主题,突然您需要添加 100 倍的网关,这不一定是正确的选择。此外,如果您需要更快地处理 User-Change-Emails
会怎样? - more partitions lead to higher throughput - 你能做到吗?
Confluent 几乎没有关于可能对您有帮助的主题的精彩文章 -
我想设计一个解决方案,用于向多个提供商发送不同类型的电子邮件。总体概述。
我有几个上游供应商Sendgrid、Zoho、Mailgun等,他们将用于发送电子邮件等。例如:
- 新用户注册邮箱
- 删除用户的电子邮件
- 电子邮件 Space 配额限制
(一般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
编辑:
- 顺序很重要,因为通信将是异步的。生产者将等待返回消息的状态
- 将每个网关的数据保存在不同的主题上并不重要
- 你想要什么样的隔离? 我希望 ot 将 messages/topics 彼此完全隔离,以防止将来在我需要添加更多网关或消息类型时出错
将每个网关的数据保存在不同的主题上对您来说很重要吗? - 不,我只是想隔离 hte 数据。
如果您愿意为每个网关使用一个主题,您是否关心它在客户端产生的开销? - 读取不必要的消息、编写更多逻辑、混合序列化程序等
我不知道这里。我的主要关注是使系统易于扩展新功能。
我认为每个事件类型一个主题对于您提到的运营开销来说确实太多了。
选项 2 我认为是正确的方法 - 每个集成网关一个主题,有专门的消费者。优点是:
- 您在主题级别隔离工作负载(集成网关 A 上的许多消息不会影响网关 B 的使用者)
- 您可以根据主题工作量扩展使用者
制作方会根据网关的要求对消息进行序列化,在特定的话题上发布。消费者只会阅读消息并推送它。
嗯,不幸的是,这里没有简单的答案。
您需要问自己几个问题并从一些权衡中做出选择 -
首先,订单重要吗?您只是想从 A 点转发到 B 点的电子邮件吗?还是要(我想您会)保持合理的事件顺序到同一实体(例如 - 关于用户创建的邮件需要在关于更改密码的同一新用户的邮件之前收到。)
如果顺序很重要,最好使用带有
你想要什么样的隔离?将每个网关的数据保存在不同的主题上对您来说很重要吗?
如果您希望每个网关使用一个主题,您是否关心它会在客户端产生的开销? - 读取不必要的消息、编写更多逻辑、混合序列化程序等
你能估计一下你会在哪些维度上进行缩放吗? - 如果您使用第一个解决方案,每个网关和事件类型的主题,突然您需要添加 100 倍的网关,这不一定是正确的选择。此外,如果您需要更快地处理 User-Change-Emails
会怎样? - more partitions lead to higher throughput - 你能做到吗?
Confluent 几乎没有关于可能对您有帮助的主题的精彩文章 -