Google cloud dataflow 管道范围的同步选项

Google cloud dataflow 管道范围的同步选项,google-cloud-dataflow,apache-beam,Google Cloud Dataflow,Apache Beam,我正在寻找一种在管道内执行同步块的简单方法,确保没有任何工作线程进入同一部分 理由:我有大量的外部API调用,这些调用必须顺序执行,而其他工作人员没有并发执行。这是一种罕见的情况,当这样的调用必须执行,所以它的罚款有阻塞部分。作为解决方案,我可以创建处理此类请求的外部服务,但我正在寻找实现这一点的最简单方法 基本图如下所示: if (!checkConditions(...)) { withPipelineWiseLock(myHandleId, () -> { i

我正在寻找一种在管道内执行同步块的简单方法,确保没有任何工作线程进入同一部分

理由:我有大量的外部API调用,这些调用必须顺序执行,而其他工作人员没有并发执行。这是一种罕见的情况,当这样的调用必须执行,所以它的罚款有阻塞部分。作为解决方案,我可以创建处理此类请求的外部服务,但我正在寻找实现这一点的最简单方法

基本图如下所示:

if (!checkConditions(...)) {
    withPipelineWiseLock(myHandleId, () -> {
        if (!checkConditions(...)) {
            try {
                call1(...);
                ...
                callN(...);
            } catch (Exception c) {
                ...
            }
        }
    }
}

我猜你想要的东西不能用光束原语来完成。Beam的全部职责是将工作并行地分布到很远和很宽的地方,而不同步到这个粒度。要实现这一点,您必须拥有一个跨越整个网络的全局锁。这的确与Beam范式相矛盾,但要能够创建自定义接收器和源,您仍然需要具有此类功能。例如,
BigQueryIO
中的动态目的地,在需要时使用
org.apache.beam.sdk.io.gcp.bigquery.CreateTables
创建具有给定模式的表。它使用simple
synchronized
处理worker内的并发,但由于许多worker可以运行相同的块,因此它有逻辑来处理已经存在的
和其他响应。在我的例子中,我有不止一个外部调用,所以逻辑变得太复杂,无法实现无锁。我猜,仅仅使用梁原语是做不到的。Beam的全部职责是将工作并行地分布到很远和很宽的地方,而不同步到这个粒度。要实现这一点,您必须拥有一个跨越整个网络的全局锁。这的确与Beam范式相矛盾,但要能够创建自定义接收器和源,您仍然需要具有此类功能。例如,
BigQueryIO
中的动态目的地,在需要时使用
org.apache.beam.sdk.io.gcp.bigquery.CreateTables
创建具有给定模式的表。它使用simple
synchronized
处理worker内的并发,但由于许多worker可以运行相同的块,因此它有逻辑来处理已经存在的
和其他响应。在我的例子中,我有不止一个外部调用,所以逻辑变得太复杂,无法实现无锁。