Google cloud dataflow 在云数据流中限制对第三方的并发调用

Google cloud dataflow 在云数据流中限制对第三方的并发调用,google-cloud-dataflow,Google Cloud Dataflow,我正在研究一种管道,它需要限制传输到第三方系统的呼叫,并考虑几种不同的方法 对于单个管道,我考虑使用无操作方法,这样并行性就被限制在键的数量上。基本上,在相关阶段包括: // Add a fake state entry to force serialization per-key. @StateId("force-serialization") private final StateSpec<ValueState<String>> myStateSp

我正在研究一种管道,它需要限制传输到第三方系统的呼叫,并考虑几种不同的方法

对于单个管道,我考虑使用无操作方法,这样并行性就被限制在键的数量上。基本上,在相关阶段包括:

// Add a fake state entry to force serialization per-key.
@StateId("force-serialization")
private final StateSpec<ValueState<String>> myStateSpec = StateSpecs.value();

我想我可以在Foo中包含一个“sameBundle”标志,该标志在序列化时被删除。如果Stage1+Stage2融合,那么这个标志将从Stage1传递到Stage2,我可以假设它们将共享相同的飞行行为。否则,该标志将不会通过,因此这两个阶段将尝试独立申请租赁权。从线程的角度来看,这似乎没什么问题,因为融合中断意味着Stage1的输出将在被Stage2使用之前进行检查。

是的,使用键来限制并行性会很好。如果没有实际使用状态,可以使用GroupByKey而不是KeyedState

使用二级租赁系统也可以,尽管您正确地指出了fusion可能存在的问题。这里的主要困难是区分融合的两个DOFN(并且永远不会同时执行并且可能共享一个租约)和并行处理不同工作项的两个DOFN。如果从外部系统获取/释放租约对于每个元素来说成本太高,那么您可以使用某种两级系统,其中工作人员持有每个工作人员的租约(静态)lease manager,可快速为本地租赁请求/释放参数提供服务,这些参数由在更大时间尺度上从辅助系统获取/释放的租赁支持。这可以很好地用于流式处理和批处理

另一种选择是设置一个代理服务,该服务位于第三方系统前面,并处理全局吞吐量限制

对于所有这些,如果工人把大部分时间闲置在等待租用的话,就需要考虑任何对自动调整的不利影响。
DoFn<KV<String, Foo>, KV<String, Bar>> Stage1  // Calls third party API
DoFn<KV<String, Bar>, KV<String, Baz>> Stage2  // Calls third party API