使用 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 个问题:

  1. 您能否确认 IMap 可以实现此行为?
  2. 如果是,imap.values 返回的组集合是否可能包含重复项(相同的组 ID)?我必须执行某种 distinct 操作吗?
  3. 我们不确定是否应该使用 Vertx + Hazelcast,或者将所有处理代码移至 Hazelcast Jet。仅迁移到 Hazelcast Jet 有什么优势?
  4. 如果我们使用 Hazelcast Jet,是否可以像这样在 StreamStage 中使用 IMap.values(Predicate) 功能:
StreamStage.flatMap(memberIds -> Traversers.traverseIterable(imap.values(Predicates.in("memberIds", memberIds.toArray(new String[0])))

非常感谢!

  1. 如果您的原始地图不包含重复项且 IMap 未同时更新,则不应包含重复项

  2. 要看你的用例,我不能一概而论

  3. 这不好,因为 imap.values 调用是阻塞的,而 flatMap 中的函数不能阻塞。阻塞是指它确实阻塞了 IO 操作。此外,您无法从局部变量捕获 imap 实例,因为它不可序列化且 Jet 无法将其发送给成员。但是你可以像这样使用 mapUsingServiceServiceFactories.imapService

 .mapUsingService(
         ServiceFactories.iMapService("my_map").toNonCooperative(),
         (imap, memberIds) -> 
             imap.values(Predicates.in("memberIds", memberIds.toArray(new String[0]))))