Apache Flink 中的有状态函数

Stateful Functions in Apache Flink

我研究了 Apache Flink 的新状态函数 2.0 API。我阅读了以下文档 link https://ci.apache.org/projects/flink/flink-statefun-docs-stable/. Also I ran examples in Git repo. (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>。我可以清除特定键的状态吗?

最后一个问题是关于开窗和水印的。如何将这些功能实现到 Stateful Functions 2.0?

First question is about state TTL. How can I give to state to TTL? Example says: After 30 days, the “Fraud Count” function will receive an expiration message (from itself) and clear its state. Should I do this manually or is there another feature? How can I do this manual?

您可以使用 delayed message. In effect, you can create a call back trigger by sending yourself a message on a delay. This message is durable and will not be lost in case of failure. If you look at the fraud count 函数手动执行此操作,在模型服务示例中,您会看到它正是这样做的。当收到一个值时,会延迟 30 天发送 ttl 消息。当收到该消息时,计数会减少。

Second Question about keyedstream. Example says: multiple instances of “Fraud Count” will exist — for example, one per customer account. Should I put values to PersistedTable? For example . Can I clear state to specific key?

所有函数实例都是 "keyed",因为用户代码总是在一个键的范围内调用,并且所有 Persisted 字段都在该键范围内。关键是 address 的 "id" 部分。在您的示例中,您可以使用一个函数 "CustomerFunction" 来跟踪您公司的每个客户的信息。当您想与该客户互动时,您将向其发送消息,将客户 uid 指定为地址的 "id"。

new Address(new FunctionType("ns", "customer"), "customer-id-1");

如果您正在跟踪每个客户的计数,您只需要一个 PersistedValue,因为它已经限定在该客户 ID 范围内。回到欺诈计数示例,该函数的作用域为 "account id",它跟踪每个银行账户的欺诈交易数量。

Last Question is about windowing and watermark. How can I implement theese feature to Stateful Functions 2.0?

statefun 2.0 不直接支持这些功能。 windows 的原因是它们主要适用于数据处理,而不是应用程序开发。对于这些用例,使用 Flink 的 DataStream 和 Table API 可能会更好,尽管可以在用户代码中自己实现它们。

活动时间很棘手。事件时间在幕后使用 "watermarks" 来跟踪系统内的时间进程。它们依赖于与其水印相关的有序数据。这意味着如果事件 x 在 2:00 的水印前使用 1:59 的时间戳被摄取,它必须始终位于该水印的前面。否则,这个准时记录将被错误地标记为迟到。

有状态函数基于迭代和任意消息传递。因为记录可以在数据流中以任何方向进行,所以事件时间没有很好地定义。