【问题标题】:Desigining Kafka Topics - Many Topics vs One Big Topic设计 Kafka 主题 - 许多主题与一个大主题
【发布时间】:2017-04-03 22:03:11
【问题描述】:

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

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

哪个选项更好?

我了解消息不在主题的同一分区中,这意味着没有顺序保证,但是在进行此操作时是否有任何需要考虑的其他因素决定?

【问题讨论】:

    标签: apache-kafka message-queue messaging distributed-computing kafka-producer-api


    【解决方案1】:

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

    这有很多好处:

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

    【讨论】:

    • 我将如何处理更多类似事件,例如用户事件? (例如:鼠标和键盘事件——它们应该在同一个主题中还是分开;左键事件和右键事件呢?)
    • 我想我要问的是你在创建新主题时划清界限。
    • 这取决于您的用例。对此没有通用的“金子弹”答案。
    • 当然,但是在做出这个决定时应该考虑哪些因素?
    • 我在回答中提到了两个重要因素。对于您的用例,您需要自己决定——除了您(和您的同事)之外,没有人有足够的能力来解决这个问题。
    【解决方案2】:

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

    护发素:订购交货

    如果您的应用程序需要保证订单交付,您只需要使用一个主题,并为需要保证它的消息加上相同的键。

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

    所有消息的架构都相同吗?

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

    消费者方面会发生什么?我们是在实现、可维护性、错误处理方面降低还是增加复杂性...?

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

    按消息类型并行消费有意义吗? ...

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

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

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

    【讨论】:

    • 关于排序在现实生活中的分布式系统中有点复杂。如果您有多个节点向 Kafka 生产,则显然无法保证订单。即使您只有一个节点但异步生产者,也不能保证顺序。如果你有一个同步生产者 - 你的代码在每次发送时都会阻塞。
    猜你喜欢
    • 1970-01-01
    • 2015-03-05
    • 2020-04-12
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 2019-10-09
    • 2019-01-04
    相关资源
    最近更新 更多