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

  1. 您能否确认使用IMap可以实现此行为?
  2. 如果是,imap.values返回的组集合是否可能包含重复项(相同的groupId)?我需要执行一种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无法将其发送给成员。但是您可以使用mapUsingService并像这样使用ServiceFactories.imapService

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...