由于我们有一个用于清算交易的流应用程序,因此我们需要将所有帐户缓存在内存和检查点中,以便定期进行快照,以避免数据丢失。
缓存需要与快照同步并提供密集的读/写操作。
我们尝试使用以下代码,但发现效果不是很好。
MapState<KEY, VALUE> orderState = runtimeContext.getMapState(new
MapStateDescriptor(name, TypeInformation.of(keyType), TypeInformation.of(valueType)));
MapStateStorage<KEY, VALUE> mapStateStorage = new MapStateStorage<>(orderState);
我们将业务对象缓存在自己的Map中,在提交阶段,我们将获取修改后的对象并放入 mapStateStorage
具有配置
rocksdb.filepath=s3://test-flink/${ENV_NAME}/rocksdb
从 RocksDBMapState 的代码中,看跌期权将进入rocksdb,而写入操作也将进入rocksdb,这会不利于序列化和反序列化。
对于这样高的读/写速率,是否存在任何最佳实践?
谢谢
答案 0 :(得分:0)
我很想知道为什么您选择了RocksDB状态后端,因为听起来一切都适合内存,并且您仅将Flink状态用于容错。如果是这样,您是否使用FsStateBackend进行了探索?它具有更好的吞吐量和平均延迟(尽管最坏情况下的延迟受GC需求的影响)。这样可以避免SERDE开销,并且由于所有内容都只是堆上的对象,因此您还可以探索不打扰缓存,从而避免当前正在执行的复制。
将来,您可能还需要考虑使用Spillable Heap Keyed State Backend。