如何解决通过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实例?
非常感谢罗宾。
解决方法
这种担心是有效的。实际上有一个查询大小限制(请参阅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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。