【问题标题】:Kafka: joining events form multiple topicsKafka:加入事件形成多个主题
【发布时间】:2020-10-25 09:07:40
【问题描述】:

我们已经使用 Kafka 一年多了,并希望继续进行更深入的集成。但是有一个概念让我很纠结。我将尝试解释我们想要实现的目标以及我们想出的解决方案。从我的角度来看,这不是一个优雅的方式,这就是为什么我质疑我是否做对了。

问题

我们有一个包含复杂结构化事件(嵌套结构)的流。消费者正在处理这些事件,将它们分开,并将这些部分放在单独的主题中。每个主题背后都有许多不同的其他服务,它们以流处理方式丰富了流经主题的事件。最后,我们有许多主题,每个主题都有部分丰富的事件,我们希望将它们全部移动到一起,以便在整个过程结束时将它们作为一个完整的事件返回。但这说起来容易做起来难。

解决方案

最后,我们有一个服务消耗所有主题并构建缓冲区,直到所有部分事件流入并将它们组合在一起以将其发布到新主题中。面临的挑战是确保我们只在完整的最终主题中产生事件。 这可行,但有一些陷阱

  • 缓冲区不能是内部的,它必须是外部的,多个使用者可以共享信息
  • 理论上我们可以在计时问题中运行并创建死条目
  • 我们可能会遇到一致性问题
  • 等等

我的问题

即使它有效并且我认为这不是一种非常优雅的方式,我们是否走在正确的轨道上,还是我们在 Kafka 事件和流处理的概念和处理方面存在误解?有没有更好的方法来做到这一点?有人有这方面的经验,可以分享一些以稳定方式整合它的倾向或方法吗?

谢谢!任何 cmets 都非常感谢。

【问题讨论】:

  • 您在加入时如何关联被撕裂的事件?
  • 主事件的ID通过子事件传输,最后是基本连接。只是有了挑战,你不知道事件会延迟多长时间才能重新聚集在一起。

标签: apache-kafka apache-kafka-streams


【解决方案1】:

我们经历了一个非常相似的用例和架构。我了解您将初始嵌套消息拆分为多个主题以增加并行度,从而提高吞吐量。

根据我们的经验,这会导致架构非常复杂,因为连接流(如您已经描述的)可能非常难以操作。我们遇到的主要问题是:

  • 如果其中一项扩充作业失败,所有其他消息应等待多长时间?修复该错误可能需要几个小时或几天的时间。
  • 如果这些扩充作业依赖于外部系统并且它们在一段时间内无法访问。您应该等待多长时间才能再次使用它们?

根据我们的经验,您所描述的当前方法会带来很多复杂性和(有时是无法控制的)依赖性。

最后我们将所有数据放在一起,并显着增加主题的分区以提高吞吐量。这样,每条消息本身都是一致的,如果任何丰富存在问题,整个消息都会受到影响,而不仅仅是其中的一部分。为了降低单个作业的复杂性,我们在 Kafka 主题中缓冲了临时数据,在您的情况下,这可能意味着让各种丰富作业按顺序运行,而不是与它们之间的主题并行运行。这样每个作业都保持合理的小,您可以利用 Kafka 附带的重放功能。

操作流连接是最复杂的事情之一,我建议尽可能避免它,除非可以接受短期的不一致并且您不需要处理所有消息,而是可能会丢弃一个或另一个。

【讨论】:

    猜你喜欢
    • 2020-12-08
    • 2018-08-19
    • 1970-01-01
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    相关资源
    最近更新 更多