如何解决使用Hazelcast将单个节点转换为分布式Java应用程序
我们有一个使用简单的本地HashMaps
用Vert.x构建的当前Java应用程序。为了在多个节点上分发我们的应用程序,我们想用一个Hazelcast IMap
替换本地HashMap。
基本上我们有2个HashMaps
:
Map<String,Group> // <groupId - group>
Map<String,Set<String> // <memberId - set of groupIds>
我们有2个HashMaps
,以便通过其ID轻松查询我们的论坛,并知道我们的会员属于哪些论坛。
但是,根据文档,使用IMap
只能创建一张地图:
IMap<String,Group> // <groupId - group>
class Group {
String id;
Set<Member> members;
}
class Member {
String id;
// some data
}
我们应该能够执行:
Collection<Group> groups = imap.values(Predicates.in("members",varargs of member ids))
所以,我有4个问题:
- 您能否确认使用IMap可以实现此行为?
- 如果是,
imap.values
返回的组集合是否可能包含重复项(相同的groupId)?我需要执行一种distinct
操作吗? - 我们不确定是否应使用Vertx + Hazelcast,或将所有处理代码移至Hazelcast Jet。仅迁移到Hazelcast Jet会有什么好处?
- 如果我们使用Hazelcast Jet,是否可以像这样使用
StreamStage
内的IMap.values(Predicate)功能:
StreamStage.flatMap(memberIds -> Traversers.traverseIterable(imap.values(Predicates.in("memberIds",memberIds.toArray(new String[0])))
非常感谢!
解决方法
-
是
-
如果原始地图中不包含重复项且IMap未被同时更新,则该重复项不应包含
-
取决于您的用例,我一般不能说
-
这不好,因为
imap.values
调用正在阻塞,并且flatMap
中的函数一定不能阻塞。阻塞是指阻塞IO操作。另外,您无法从本地变量捕获imap
实例,因为它不可序列化,并且Jet无法将其发送给成员。但是您可以使用mapUsingService
并像这样使用ServiceFactories.imapService
:
.mapUsingService(
ServiceFactories.iMapService("my_map").toNonCooperative(),(imap,memberIds) ->
imap.values(Predicates.in("memberIds",memberIds.toArray(new String[0]))))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。