【问题标题】:Kafka Streams Custom processingKafka Streams 自定义处理
【发布时间】:2018-08-25 03:31:39
【问题描述】:

我需要处理大文件,可能有多个文件最终我们可能会并行处理。

  • 将针对特定于该文件的规则处理特定文件中的每一行。
  • 处理完成后,我们将根据处理后的记录生成输出文件。

我想到的一个选项是推送到代理的每条消息都将具有:行数据 + 要应用的规则 + 一些关联 ID(就像该特定文件的标识符)

我计划使用 kafka 流并使用处理器创建一个拓扑,该处理器将使用消息处理它并接收它的规则。

但是(我是 kafka 流的新手,因此可能是错误的):

  • 消息的处理顺序不会是连续的,因为我们在 Tandom 中处理多个文件(这很好,因为我不需要这样做,而且我希望保持分离)。但是,我将如何将其置于逻辑关闭状态,即在我的处理器中,我如何知道文件的所有记录都已处理。
  • 我是否需要以 ignite 之类的方式维护记录(关联 ID、记录数等).. 不过我不确定..

【问题讨论】:

  • 可以想到的一个选项是有状态存储,其中在密钥库中,每条消息都将具有文件中的总记录数,并且它维护一个像 co-relation-id+total number 这样的键记录作为键并不断更新以值处理的记录,一旦这些匹配,我们可以假设这是该文件的逻辑闭包并相应地接收..

标签: spring apache-kafka apache-kafka-streams


【解决方案1】:

我猜你可以设置一个键和值记录,它可以发送到文件末尾的主题,这意味着文件的关闭。 假设记录具有唯一键,例如 -1,表示 eof

【讨论】:

  • 是的,它可能会发生,但在这种情况下,问题是由于整个范例是异步工作的,因此可能会发生 EOF 消息在少数消息仍未结束之前到达(想知道这是否可能发生?) ,如果是这种情况,我们是否还应该维护状态中已处理记录的计数?
  • kafka主题的单个分区中会有排序,但不能保证主题之间相同。我们可以改写n说每个文件名都是一个键,唯一的值可以设置为表示关闭文件
猜你喜欢
  • 2017-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-10
相关资源
最近更新 更多