Google cloud dataflow 数据流滑动窗口与带触发器的全局窗口用例?

Google cloud dataflow 数据流滑动窗口与带触发器的全局窗口用例?,google-cloud-dataflow,apache-beam,dataflow,Google Cloud Dataflow,Apache Beam,Dataflow,我正在为一家电子商务公司设计一个篮子丢弃系统。系统将根据以下规则向用户发送消息: 30分钟内用户在站点上没有交互 已经向篮子中添加了价值超过50美元的产品 尚未完成交易 我使用谷歌云数据流来处理数据,并决定是否应该发送消息。我有以下几种选择: 使用持续时间为30分钟的滑动窗口 具有延时30分钟的基于时间的触发器的全局窗口 我想这里可以用推拉窗。但我的问题是,对于这个用例,是否有一个基于全局窗口和基于处理时间的触发器以及延迟的解决方案? 据我所知,基于Apache Beam文档的触发器=> 触

我正在为一家电子商务公司设计一个篮子丢弃系统。系统将根据以下规则向用户发送消息:

  • 30分钟内用户在站点上没有交互
  • 已经向篮子中添加了价值超过50美元的产品
  • 尚未完成交易
我使用谷歌云数据流来处理数据,并决定是否应该发送消息。我有以下几种选择:

  • 使用持续时间为30分钟的滑动窗口
  • 具有延时30分钟的基于时间的触发器的全局窗口
  • 我想这里可以用推拉窗。但我的问题是,对于这个用例,是否有一个基于全局窗口和基于处理时间的触发器以及延迟的解决方案? 据我所知,基于Apache Beam文档的触发器=> 触发器允许光束在给定窗口关闭之前发出早期结果。例如,在经过一定时间后或在到达一定数量的元素后发射。 触发器允许在事件时间水印通过窗口末尾后通过触发来处理延迟数据


    因此,对于我的用例,根据上面的触发器概念,我不认为触发器可以在每个用户的设置延迟后触发(上面提到了它-只能在上面提到的一定数量的元素后发射,但不确定是否可以是1)。你能确认吗?

    我认为滑动窗口是你所描述的正确方法,我认为你不能用触发器+延迟来解决这个问题。如果从业务逻辑的角度来看,事件时间滑动窗口是有意义的,那么首先尝试使用它,这就是它的用途

    我的理解是,虽然您可以使用触发器来产生早期结果,但不能保证在特定(服务器/处理)时间触发,也不能保证使用确切数量的元素(到目前为止已为窗口接收到)。触发器条件启用/取消阻止运行程序发出窗口内容,但并不强制它这样做

    对于事件时间来说,这是有意义的,因为事件何时到达或触发器何时触发并不重要,因为如果元素在窗口中具有时间戳,那么无论它何时到达,它都将被分配到正确的窗口。当触发窗口时,如果元素已经到达,则保证元素在该窗口中

    随着处理时间的推移,您无法做到这一点。如果事件延迟到达,它将在那个时候被解释,并且基本上会在下次触发器触发时发出。而且由于触发器不能保证触发的确切时间,因此最终可能会得到属于意外发出窗格的意外数据。一般来说,获得早期结果是有用的,但我不确定您是否可以基于此推断窗口化

    此外,触发延迟只会增加一个触发延迟(例如,如果它本应在中午12点触发,而不是在中午12点05分触发),但它不允许您可靠地错开多个触发触发,使其以特定的间隔触发

    您可以在此处查看触发器的设计文档:,迟到文档也可能与此相关:

    如果您感兴趣,可以在此处找到其他文档:

    更新:


    芮指出,这个用例可能更复杂,可能不容易通过滑动窗口解决。也许值得研究一下会话窗口或键+状态+计时器上面的手动逻辑

    我找到了Apache Beam的状态[1]和计时器[2]文档,它应该能够处理这个特定的用例,而无需在全局窗口中使用处理时间触发器

    假设传入的数据是用户操作的事件,并且每个事件(操作)都可以由用户id键入

    state和timer所具有的优良属性是基于每个键和每个窗口的。因此,您可以为每个用户id累积状态,在本例中,状态为购物车中的金额。当购物车中的金额超过50美元时,可以在第一时间设置计时器,当用户在处理时间的30分钟内仍有购物行为时,可以重置计时器

    假设事务完成也是一个用户id键控事件。当看到事务完成事件时,可以删除计时器[3]


    更新:

    这个想法完全是在处理时域,所以它会根据系统中的延迟问题产生假警报消息。因此,问题是如何将这种想法改进到事件时域,从而减少误报。一种可能性是基于事件时间的计时器[4]。我不清楚现在基于事件时间的计时器是什么意思

    [1]

    [2]

    [3]


    [4] 答案1-滑动窗口和2-全局窗口都不正确

    滑动窗口是不正确的,因为-假设每个用户有一个键,即使他们仍在浏览,也会在他们首次开始浏览后30分钟发送消息

    全局Windows不正确,因为它将导致每30分钟向所有用户发送一次消息,而不管他们在当前会话的何处

    在这种情况下,即使是固定窗口也是不正确的,因为假设每个用户都有一个密钥,那么每30分钟就会发送一条消息

    正确答案是-使用间隔时间为30分钟的会话窗口
    这是正确的,因为在该用户处于非活动状态30分钟后,它将向每个用户发送一条消息

    您能否尝试给出基于滑动窗口的解决方案(可能是伪代码),以便我了解您的用例并帮助查看全局窗口是否可以工作?当然,我将尝试添加,但一般来说,在基于延迟的全局窗口中,每个元素的触发器都是可能的吗?触发器(特别是处理时间触发器和数据驱动触发器)可以在具有无限数据的全局窗口上设置(否则,将永远不会有数据发出,因为全局窗口nev