考虑以下示例类,其实例存储在events={[{
"status": "pending",
start: moment().toDate(new Date(2020, 10, 11, 10, 0)),
end: moment().toDate(new Date(2020, 10, 11, 17, 0)),
"title": "Michael Scott",
'allDay': false,
}]}
中:
ListState
如果与特定客户和的最后一笔交易(class BusinessObject {
long clientId;
String region;
Instant lastDealDate;
bool isActive;
}
)距已满1年,则应用程序要求该对象不应处于flink状态。未启用,即lastDealDate
解决此问题并使flink知道这两个因素以便自动删除这些条目的正确方法是什么?目前,我读取了该状态中的所有项目,清除了状态,然后重新添加了相关的项目,但是随着客户端数量的增加和状态的规模变大,这将花费很长时间。我的大多数在线搜索都谈论使用isActive == false
并通过time-to-live
将其设置为我的状态。但是,我的逻辑不能依赖处理/事件/摄取时间,因此我还需要检查descriptor
是否为假。
其他信息:上下文未设置键,后端为RocksDB。使用isActive
的原因是因为每天都需要丢弃上述条件下的所有相关状态/历史记录。
有什么建议吗?
答案 0 :(得分:0)
有了RocksDB状态后端,Flink可以在不进行序列化/反序列化的情况下追加到ListState,但是由于ser / de,除追加外的任何读取或修改都是昂贵的。
即使您偶尔需要遍历整个地图,如果可以重新做一些事情以使这些BusinessObjects存储在MapState中,您的状况也会更好。 MapState中的每个键/值对将是一个单独的RocksDB条目,您将能够分别创建/更新/删除它们,而不必对整个地图进行ser / de(除非必须扫描它)。 。 (为此,在RocksDB中迭代MapState的价值在于按序列化键排序的顺序遍历地图。)
MapState仅可用作键控(或广播)状态,因此此更改将要求您键控流。使用keyBy确实会强制进行网络改组(和ser / de),因此它将很昂贵,但不如使用ListState昂贵。