【问题标题】:Disperse messages in Kafka stream在 Kafka 流中分散消息
【发布时间】:2019-09-25 05:54:26
【问题描述】:

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

用例 我在 Kafka 主题中接收到几个脚本(约 2000 支股票)的股票数据。我希望能够在所有脚本上单独运行 KPI(KPI 就像应用于输入数据以获取 KPI 值的公式)。

我能想到的选项

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

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

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

【问题讨论】:

  • 你可以让消费者从静态分配的分区中读取,所以我不确定我是否理解关于丢弃数据以获得“他们的块”的论点
  • @cricket_007 为了清楚起见更新了问题
  • 但同样,如果您只订阅包含苹果刻度的分区,您不会丢弃任何东西
  • 情况就是这样 1.In case 2 所有刻度都在同一个主题中,只是不同的分区。所以如果我订阅那个主题,我会得到所有的滴答声

标签: apache-kafka streaming apache-kafka-streams


【解决方案1】:

在我看来:

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

优点

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

缺点

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

2。将所有刻度数据保存在单个主题中,并使用 CustomPartitioner 按脚本名称对其进行分区

优点

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

缺点

  • 它可能更容易维护(从硬件/资源的角度来看),但更难正确开发

  • 您的分区器必须不断更新(如果有新的源进来,如果分区号增加,...),这可能成为一项繁琐的手动任务。

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

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


无论如何,如果您可以控制源脚本,则可以摆脱第二个主题/主题,因为您可以在源主题中创建相同的逻辑,并避免数据移动(我相信没有转换,只是从一个地方移动到另一个地方)从源主题到最终主题。这在第二种方法中更明显(为什么不在第一个主题上分区?)

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

【讨论】:

  • 感谢您提供详细的描述性答案。生活就是权衡利弊!!在这种情况下,我可能需要超越 Kafka
猜你喜欢
  • 2019-09-17
  • 2020-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-26
相关资源
最近更新 更多