在 Kafka 流中分散消息

Disperse messages in Kafka stream

我正在尝试找出将我的数据扇出到单独的占位符以供其他处理使用的最佳方法

用例 我正在接收 Kafka 主题中几个脚本(~2000 只股票)的代码数据。我希望能够 运行 在所有脚本上分别设置 KPI(KPI 就像应用于输入数据以获取 KPI 值的公式)。

我能想到的选项

  1. 根据脚本名称扇出主题 在源主题上收到的所有内容都通过脚本名称发送到不同的主题。这里的问题是,这将创建大量主题,管理它们并跟踪内容将成为一项乏味的任务。

  2. 将所有报价数据保存在一个主题中,并使用 CustomPartitioner 按脚本名称对其进行分区。 这有助于保持较低的主题数量和易于管理的系统。但是所有消费者都需要丢弃大量记录才能获取导致延迟的数据块。 (换句话说,在 Apple Tick 上寻找 运行 KPI 的工作将需要订阅公共主题并丢弃所有其他脚本中的滴答)

如果有更好的方法,请告诉我,如果没有,应该选择哪个。 另一个重要的考虑因素是每个 KPI 都会将数据写回 Kafka 主题,以供规则引擎进一步使用

如我所见:

1。根据脚本名称扇出主题

优点

  • 完全控制各个占位符。您可以为每个源设置不同的复制、持久性、分区号参数。
  • 轻松进行健康检查。您可以轻松地检查来源(p.e、Citigroup)是否比其他来源获得更多传入数据,或者从影响流程的特定来源删除数据等。
  • 独立规模。与上一点相关,如果您对每个来源有不同的主题,这将有助于解决扩展问题。使用第二种方法,您只与一个主题的分区数相关联,以扩展您的消费者(并且可能您刚刚达到消费者的最大数量)。使用第一种方法,您可以创建不同的主题(因此,不同的分区),允许您在需要的地方(主题)启动消费者,或者增加单个主题的分区数量。

缺点

  • 很多主题,可能导致大量复制、持久化、偏移控制等:更多代理工作...
  • ... 以及维护者。 :)

2。将所有报价数据保存在一个主题中,并使用 CustomPartitioner

按脚本名称对其进行分区

优点

  • 减少broker/maintainer饱和度。所有数据都在一个主题上,您 "only" 必须控制分区。
  • 将不同的消费者群体启动到一个主题中是完全可以的。无论如何,您在这里有两个选择:
    • 对所有分区启动不同的CG:每个worker必须检查消息的key,如果不是他的则丢弃它"source"。这真的很快,应该不会造成那么多延迟。
    • 忘记 CG:如果您根据源进行分区,则可以通过 assign 将特定的工作人员发送到特定的分区。这样,即使所有数据都在一个主题中,它也会在分区内得到有效划分,因此您的消费者不会丢弃任何东西。请记住,即使分配不适用于订阅规则,每个分区也只能有一个消费者,因为即使可以将同一分区分配给 2 个不同的线程,该分区中的所有数据也将被处理两次。

缺点

  • 可能更容易维护(从hardware/resources的角度来看),但更难正确开发

  • 您的 分区程序必须不断更新 (如果有新源进入,如果分区数量增加,...),这可能会变得乏味手动任务。

  • 忘记对源的不同管理:您所有传入的数据,无论来源如何,都将共享相同的主题参数,例如,保留时间;您将无法选择比其他更多地保留某些源,或者(轻松地)将其分布在更多的分区中,等等。

  • 较小、较轻的来源将受到较大来源的影响,因为所有数据都在同一主题中处理。如果您启动消费者组,"small"-source 消费者将不得不丢弃更多的消息才能访问他们自己的消息。 另一方面,如果你不手动启动消费者组assign消费者,你需要手动增加分区的数量 主题,将新的分配给大来源。这将涉及常数 更改您的分区程序和您的消费者的分配。


无论如何,如果您控制了源脚本,您可以去掉第二个 topic/topics,因为您可以在源主题中创建相同的逻辑,并避免数据移动 (我认为它没有被转换,只是从一个地方移动到另一个地方) 从源主题到结束主题。这在第二种方法中更为明显(为什么不对第一个主题进行分区?)

希望对您有所帮助,其中一些完全是主观的。 :)