【问题标题】:Shared Kafka StateStore Best Practices共享 Kafka StateStore 最佳实践
【发布时间】:2020-06-10 11:33:44
【问题描述】:

在创建处理器 API Topology 时,我注意到 Topology#addStateStore(StoreBuilder, String...) 接受多个处理器,这意味着一个状态存储可以由多个处理器共享。

这种设计有什么注意事项吗? 如果一个键不存在,而实际上其他处理器只是为这个键存储一个值,是否有可能通过存储值来丢失数据? 我想我在问是否会出现通常的比赛条件问题。

如果处理器属于不同的子拓扑,会有什么不同吗?
此外,当附加到具有不同数量分区的源的处理器共享相同的状态存储时会发生什么?这将如何影响状态存储分片?

【问题讨论】:

  • 我看到人们对这个问题投了反对票......我们很幸运有很多关于 Kafka 处理器的文章计算一个句子中的单词,但我找不到任何资源可以解决(非常常见 - 在我的意见)处理器需要相互共享一些数据的情况,以及它可能引入的陷阱。很抱歉问了这么含糊的问题。

标签: apache-kafka apache-kafka-streams


【解决方案1】:

没有竞争条件。如果单个存储连接到多个处理器,则两个处理器都在单个线程中执行。

但请注意,没有定义两个处理器访问存储的顺序,即,如果有单个输入记录,您不知道哪个处理器将首先执行。

如果处理器属于不同的子拓扑,会有什么不同吗?

这是不可能的。如果两个处理器访问同一个存储,它们将始终位于同一个子拓扑中。

另外,当附加到具有不同数量分区的源的处理器共享同一个状态存储时会发生什么?这将如何影响状态存储分片?

一般来说,不建议这样做,因为您的输入数据不会被共同分区(即,具有相同键的记录很可能在两个主题的不同分区中)。该程序仍将使用更大的分区计数来执行以创建存储分片。对于某些分片(对于更高的分区号),相应的任务将只从一个主题中读取数据,因为在另一个主题中没有对应的分区。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-19
  • 1970-01-01
相关资源
最近更新 更多