我研究了Apache Flink的新的Stateful Functions 2.0 API。我阅读了以下文档链接https://ci.apache.org/projects/flink/flink-statefun-docs-stable/。我也在Git回购中运行了示例。 (https://github.com/ververica/stateful-functions/tree/master/stateful-functions-examples) 我对实现没有什么疑问。
https://flink.apache.org/stateful-functions.html->页面末尾有一个示例,它是欺诈检测的事务评分。
第一个问题是关于状态TTL的。我该如何给TTL状态?示例说:30天后,“欺诈计数”功能将(从其自身)接收到一条到期消息并清除其状态。我应该做本手册还是有其他功能?我该怎么做本手册?
关于keyedstream的第二个问题。示例说:“欺诈计数”的多个实例将存在-例如,每个客户帐户一个。我应该将值放入PersistedTable<K,V>
吗?例如<customerid,count>
。我可以清除特定密钥的状态吗?
最后一个问题是关于窗口和水印。如何在状态功能2.0中实现这些功能?
答案 0 :(得分:4)
第一个问题是关于状态TTL的。我该如何给TTL状态?示例说:30天后,“欺诈计数”功能将(从其自身)接收到一条到期消息并清除其状态。我应该手动执行此操作还是有其他功能?我该怎么做本手册?
您可以使用delayed message手动执行此操作。实际上,您可以通过延迟向自己发送消息来创建回叫触发器。该消息是持久的,在失败的情况下不会丢失。如果您查看fraud count函数,则在模型投放示例中,您会发现它正是这样做的。收到值后,将发送ttl消息,延迟30天。收到该消息后,计数将减少。
关于keyedstream的第二个问题。示例说:“欺诈计数”的多个实例将存在-例如,每个客户帐户一个。我应该将值放入PersistedTable吗?例如 。我可以清除特定密钥的状态吗?
所有函数实例都是“键控”的,因为始终在键的范围内调用用户代码,并且所有持久字段的作用域都是该键。密钥是address的“ id”部分。在您的示例中,您可以具有一个“ CustomerFunction”函数,该函数可跟踪有关您的每个客户的信息。当您想与该客户进行交互时,将向其发送消息,将客户uid指定为地址的“ id”。
new Address(new FunctionType("ns", "customer"), "customer-id-1");
如果您要跟踪每个客户的计数,则只需要一个PersistedValue,因为它已被限定为该客户ID。回到欺诈计数示例,该功能的作用范围是“帐户ID”,它正在跟踪每个银行帐户的欺诈交易次数。
最后一个问题是关于窗口和水印。如何在状态功能2.0中实现这些功能?
statefun 2.0不直接支持这些功能。 Windows的原因是它们主要适用于数据处理,而不适用于应用程序开发。对于这些用例,尽管可以在用户代码中自己实现它们,但使用Flink的DataStream和Table API可能会更好地为您服务。
活动时间很棘手。事件时间是使用引擎盖下的“水印”来跟踪系统内时间的进展。他们依赖于与水印相关的数据井井有条。这意味着,如果在x之前在水印前以1:59的时间戳摄取事件x,则它必须始终在该水印之前。否则,此准时记录将被错误地标记为延迟。
状态函数基于迭代和任意消息传递。由于记录可以沿数据流的任何方向移动,因此事件时间定义不明确。