繁体   English   中英

设计 Kafka 主题 - 许多主题与一个大主题

[英]Desigining Kafka Topics - Many Topics vs One Big Topic

考虑到一系列不同的事件,推荐的方法是

  • 一个包含所有事件的大主题
  • 不同类型事件的多个主题

哪个选项会更好?

我知道消息不在主题的同一分区中,这意味着没有顺序保证,但在做出此决定时是否还有其他因素需要考虑

主题是逻辑抽象,应包含相同类型的消息。 假设您监控网站并捕获点击流事件,另一方面,您有一个数据库将其更改填充到更改日志主题中。 您应该有两个不同的主题,因为点击流事件与您的数据库更改日志无关。

这有多个优点:

  • 您的数据将具有不同的格式,并且您将需要不同的(反)序列化程序来写入读取数据(使用单个主题您将需要一个混合序列化程序,并且在读取数据时您将无法获得类型安全)
  • 您将有不同的消费者应用程序,一个应用程序可能只对点击流事件感兴趣,而第二个应用程序只对数据库更改日志感兴趣,而第三个应用程序对两者都感兴趣。 如果您有多个主题,应用程序一和应用程序二只订阅他们感兴趣的主题——如果您只有一个主题,应用程序一和应用程序二需要阅读所有内容并过滤他们不感兴趣的内容,增加经纪人,网络,客户端可以加载吗

正如@Matthias J. Sax 之前所说,这里没有金子弹。 但我们必须考虑不同的主题。

空调:订购交货

如果您的应用程序需要保证订单交付,您只需要处理一个主题,以及需要保证它的那些消息的相同密钥。

如果订购不是强制性的,游戏开始......

所有消息的模式是否相同?

消费者是否会对相同类型的不同事件感兴趣?

消费者方面会发生什么?,我们是在减少还是增加在实现、可维护性、错误处理方面的复杂性……?

水平可扩展性对我们重要吗? 更多的主题通常意味着更多的可用分区,这意味着更多的水平扩展能力。 它还允许在代理端进行更准确的可扩展性配置,因为我们可以选择每种事件类型增加的分区数量。 或者在消费者方面,每个事件类型有多少消费者站起来。

对每种消息类型并行消费有意义吗? ...

从技术上讲,如果我们允许消费者微调要消费的那些类型的事件,我们就有可能减少从代理向消费者发送不需要的消息所需的网络带宽,以及所有这些事件的反序列​​化数量(使用的 CPU,随着时间的推移,更多的免费资源,能源成本降低......)。

同样值得记住的是,在不同的主题中拆分不同类型的消息并不意味着必须使用不同的 Kafka 消费者来消费它们,因为它们允许同时从不同的主题消费。

好吧,这个问题没有明确的答案,但我有一种感觉,对于 Kafka,因为具有多种功能,如果不需要有序交付,我们应该将每种类型的消息拆分为不同的主题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM