使用 Hazelcast 将单个节点转换为分布式 java 应用程序
Convert a single node to distributed java application with Hazelcast
我们有一个当前的 java 应用程序,使用 Vert.x 使用简单的本地 HashMaps
构建。为了将我们的应用程序分布在多个节点上,我们想用单个 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
返回的组集合是否可能包含重复项(相同的组 ID)?我必须执行某种 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]))))
我们有一个当前的 java 应用程序,使用 Vert.x 使用简单的本地 HashMaps
构建。为了将我们的应用程序分布在多个节点上,我们想用单个 Hazelcast IMap
.
基本上我们有 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
返回的组集合是否可能包含重复项(相同的组 ID)?我必须执行某种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]))))