通过REST / WebFlux公开整个IMap,而不会过多地利用堆

我有一个可能很大的分布式Hazelcast地图(IMap)。

我的任务是返回ENTIRE map values()集合作为对HTTP GET请求的响应。

为了最大程度地减少堆利用率,我计划使用Spring WebFlux并返回一个Flux实例。

我担心的是,IMap#values()。iterator()。next()的调用在Flux.fromIterable()中是隐式的,可能反序列化来自所有集群成员的所有值,因此炸毁了为GET请求服务的Hazelcast客户端JVM。

如果这种担心是有充分根据的,那么:

Hazelcast Jet是否可以提供解决方案?我可以创建Pipeline.withSource(IMap),但是如何将接收器创建为可以返回的Flux实例?

非常感谢罗宾。

iCMS 回答:通过REST / WebFlux公开整个IMap,而不会过多地利用堆

这种担心是有效的。实际上有一个查询大小限制(请参阅here),对于大地图,values()调用将失败。

Jet对于请求-响应方案不是有用的:它可以以流方式处理大型地图,但是它将地图项传递到接收器而不是调用者。您也许可以破解它,但这并不简单。

在即将到来的Hazelcast 4.1中,将提供最适合您的用例的SQL API:如果您使用SQL查询地图,则即使没有较大的内存使用量,也可以将较大的结果流式传输到客户端。

作为解决方法,您可以查看Jet地图阅读器的后备代码:ReadMapOrCacheP.java,它使用internal API来逐步读取地图。但这是一个内部不支持的API,可以在每个发行版中更改/删除。

,

作为Oliv的回答的补充,IMDG 4.0中引入了一个内部迭代器实现,该实现是对IMap内容的,它不会检索整个地图内容,并且在遇到并发变异和失败时应该可以很好地工作。

仍然使用它有点麻烦,因为我们尚未通过公共API公开它。有关javadoc和成员端实现,请参见here

示例代码:

event.target.content.dataset.index
本文链接:https://www.f2er.com/1517464.html

大家都在问