首页 > 解决方案 > 触发后在条件下将元素发送到下一个窗口

问题描述

到目前为止,我一直在处理 Apache Beam 中给定特定 HTTP 代码的场景,我可能会保留要在下一次迭代中重新启动的元素。

一直在用内部代码实现这个,只使用时间触发器。

        .apply(
            "Sample Window",
            Window.into(FixedWindows.of(Duration.standardMinutes(1)))
                .triggering(AfterProcessingTime
                    .pastFirstElementInPane()
                    .plusDelayOf(Duration.standardSeconds(1)))
                .withAllowedLateness(Duration.ZERO)
                .discardingFiredPanes()
        )

我正在对我的逻辑进行硬编码以处理 200 个事件的请求。并且还将这些事件存储在内存中,以防请求失败。

但是,检查我看到的文档组合触发......

  Repeatedly.forever(AfterFirst.of(
     AfterPane.elementCountAtLeast(100),
     AfterProcessingTime.pastFirstElementInPane().plusDelayOf(Duration.standardMinutes(1))))

在我的情况下也是如此。

        .apply(
            "Sample Window",
            Window.<KV<String, String>>into(FixedWindows.of(Duration.standardMinutes(1)))
                .triggering(
                    AfterFirst.of(
                        AfterPane.elementCountAtLeast(200),
                        AfterProcessingTime.pastFirstElementInPane().plusDelayOf(Duration.standardSeconds(1))
                    )
                )
                .withAllowedLateness(Duration.ZERO)
                .discardingFiredPanes()
        )

所以现在想知道...

如果由 1 分钟时间范围内的元素数量触发,这些事件会发生什么情况?它们是否再次被重新处理?我应该手动从窗口中删除它们吗?

我也在谈论 200 个元素失败的情况。我怎样才能让它们在窗口中占上风?

标签: google-cloud-dataflowapache-beam

解决方案


在您的触发器中,您正在设置 .discardingFiredPanes()

这将“在触发后丢弃窗格中的元素”。

任何后续窗格都不会包含已输出的元素。


推荐阅读