因为我们有一个流应用程序来做交易清算,我们需要缓存内存和检查点中的所有帐户,以定期快照,以避免数据丢失。
缓存需要与快照同步,并提供密集的读/写操作。
我们尝试了以下代码,发现性能不太好。
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的代码中,put将转到rocksdb,write也将转到rocksdb,并对序列化和反序列化进行惩罚。
对于这样的高r/w率,有什么最佳实践吗?
谢谢,
1条答案
按热度按时间mfuanj7w1#
我很想知道你为什么选择rocksdb状态后端,因为听起来好像所有东西都适合内存,而且你使用flink状态只是为了容错。如果是这样的话,您是否研究过使用fsstatebackend?它有更好的吞吐量和平均延迟(尽管最坏情况下的延迟受gc需求的影响)。这将避免serde开销,而且由于所有内容都只是堆上的对象,因此您还可以探索不必处理缓存,从而避免当前正在执行的复制。
将来您可能还需要考虑可溢出堆键控状态后端。