Google cloud dataflow 状态原子性与输出

Google cloud dataflow 状态原子性与输出,google-cloud-dataflow,Google Cloud Dataflow,如果ProcessElement方法中的代码既修改了一个(或多个)状态变量,又输出了一些结果,那么我在Dataflow中对此操作的原子性有保证吗 让我们用一个代码示例来澄清我的问题(摘自): @ProcessElement 公共无效处理元素( ProcessContext上下文, @StateId(“索引”)ValueState索引){ int current=firstNonNull(index.read(),0); 输出(千伏(当前,context.element()); 索引写入(当前+1

如果ProcessElement方法中的代码既修改了一个(或多个)状态变量,又输出了一些结果,那么我在Dataflow中对此操作的原子性有保证吗

让我们用一个代码示例来澄清我的问题(摘自):

@ProcessElement
公共无效处理元素(
ProcessContext上下文,
@StateId(“索引”)ValueState索引){
int current=firstNonNull(index.read(),0);
输出(千伏(当前,context.element());
索引写入(当前+1);
}
如果Dataflow worker突然死亡,是否存在执行/检查context.output()但“index”状态变量未相应更新的风险

我还有一个疑问: 我知道ParDo可以在同一个输入记录上执行两次(由于重试或推测性执行),而Dataflow通过基于每个输出记录附加的ID进行重复数据消除,保证了输出的“精确一次”。
然而,对于上述“current+1”状态上的某些“非幂等”操作,我是否也能得到一些“精确一次”的保证呢?

数据流保证状态突变和输出以原子方式提交,也就是说,要么两者都生效,要么两者都不生效。(具体来说,StartBundle和EndBundle之间的所有状态和输出都是如此紧密地联系在一起。)如果需要重试记录,将使用原始状态。

谢谢!谷歌是否有任何文档对此进行了描述?我一直在Beam文档中搜索,我也在阅读非常好的“流媒体系统”Oreilly的书,但是我没有找到关于这个原子性的一些细节。这个原子性是模型的一部分,但是我找不到关于它的好文档。也许我应该更新一下
  @ProcessElement
  public void processElement(
      ProcessContext context,
      @StateId("index") ValueState<Integer> index) {
    int current = firstNonNull(index.read(), 0);
    context.output(KV.of(current, context.element()));
    index.write(current+1);
  }