apache-kafka - 设计 Kafka 消费者和生产者以实现可扩展性
问题描述
我想设计一个解决方案,用于向多个提供商发送不同类型的电子邮件。一般概述。
我有几个上游提供商 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 数据。
如果您要为每个网关使用一个主题,您是否关心它将在客户端产生的开销?- 读取不必要的消息、编写更多逻辑、混合序列化程序等
我不知道这里。我主要关心的是使系统易于扩展新功能。
解决方案
我认为对于您提到的操作开销而言,每种事件类型的一个主题确实太多了。
我认为选项 2 是正确的方法 - 每个集成网关一个主题,有专门的消费者。优点是:
- 您在主题级别隔离工作负载(集成网关 A 上的许多消息不会影响网关 B 的消费者)
- 您可以根据主题工作负载扩展消费者
生产者将根据网关的要求将消息序列化,并将其发布到特定的主题上。消费者只会阅读消息并推送它。
推荐阅读
- json - 错误:输入“列表”
' 不是类型 'String' 的子类型 - mysql - 从 MySQL 数据库表版本 8.0.17 提取非空数据
- flutter - Visual Studio代码中的颤动代码显示错误
- python - 从列表中删除特定关键字之前的项目
- javascript - 检测 puppeteer 下通过 xvbf + Chrome 运行的 bot
- next.js - 为什么在 Safari 中 next-i18next 总是路由到 EN?
- ios - 比较 String 和 MVC 的 String 值
- c# - 证书身份验证在 ASP.NET Core 5.0 中不起作用
- c - C 预处理器的输出文件
- html - 我如何在 html 和 Css 中移动 Readmore 链接在段落文本之后