【发布时间】:2015-10-20 15:41:55
【问题描述】:
我们目前使用 vertx 和 hazelcast 作为其集群实现。为了让它按照文档工作 hazelcast 嵌入在我们的应用程序中,这意味着它将作为集群的成员加入。我们希望我们的应用程序独立于 Hazelcast。原因是当 Hazelcast 缓存变得不一致时,我们会关闭所有服务器并重新启动。相反,我们希望将 Hazelcast 保留在它自己的服务器上,并将 vertx 作为客户端连接,因此我们重新启动 hazelcast 独立于我们的应用程序服务器。 Zookeeper 集群实现完全按照我们的意愿进行,但我们不想仅出于此目的维护另一个集群,因为我们还将 Hazelcast 用于应用程序内部的其他缓存目的。目前我们正在做一些类似的事情来让 vertx 工作。
Config hazelcastConfig = new Config();
//Group
GroupConfig groupConfig = new GroupConfig();
groupConfig.setName(hzGroupName);
groupConfig.setPassword(groupPassword);
hazelcastConfig.setGroupConfig(groupConfig);
//Properties
Properties properties = new Properties();
properties.setProperty("hazelcast.mancenter.enabled", "false");
properties.setProperty("hazelcast.memcache.enabled", "false");
properties.setProperty("hazelcast.rest.enabled", "false");
properties.setProperty("hazelcast.wait.seconds.before.join", "0");
properties.setProperty("hazelcast.logging.type", "jdk");
hazelcastConfig.setProperties(properties);
//Network
NetworkConfig networkConfig = new NetworkConfig();
networkConfig.setPort(networkPort);
networkConfig.setPortAutoIncrement(networkPortAutoincrement);
//Interfaces
InterfacesConfig interfacesConfig = new InterfacesConfig();
interfacesConfig.setEnabled(true);
interfacesConfig.setInterfaces(interfaces);
networkConfig.setInterfaces(interfacesConfig);
//Join
JoinConfig joinConfig = new JoinConfig();
MulticastConfig multicastConfig = new MulticastConfig();
multicastConfig.setEnabled(false);
joinConfig.setMulticastConfig(multicastConfig);
TcpIpConfig tcpIpConfig = new TcpIpConfig();
tcpIpConfig.setEnabled(true);
List<String> members = Arrays.asList(hzNetworkMembers.split(","));
tcpIpConfig.setMembers(members);
joinConfig.setTcpIpConfig(tcpIpConfig);
networkConfig.setJoin(joinConfig);
//Finish Network
hazelcastConfig.setNetworkConfig(networkConfig);
clusterManager = new HazelcastClusterManager(hazelcastConfig);
VertxOptions options = new VertxOptions().setClusterManager(clusterManager);
options.setClusterHost(interfaces.get(0));
options.setMaxWorkerExecuteTime(VertxOptions.DEFAULT_MAX_WORKER_EXECUTE_TIME * workerVerticleMaxExecutionTime);
options.setBlockedThreadCheckInterval(1000 * 60 * 60);
Vertx.clusteredVertx(options, res -> {
if (res.succeeded()) {
vertx = res.result();
} else {
throw new RuntimeException("Unable to launch Vert.x");
}
});
*********替代解决方案**********
实际上,我们将分布式缓存实施从 hazelcast 更改为 Redis (Amazon ElastiCache)。
我们无法依赖 hazelcast 有 3 个原因。
1) 因为它在服务器重新启动期间不一致
2) 我们使用嵌入式 hazelcast,当 hazelcast 数据不一致时我们最终重新启动了我们的应用程序我们希望我们的应用程序独立于其他服务
3) 内存分配(hazelcast 数据)现在独立于应用程序服务器
【问题讨论】:
-
我已经为我们最终做的事情添加了替代解决方案
-
我认为我在下面的回答解决了您的问题 1,2 和 3。但是您必须等待拉取请求何时解决(或自己构建
vertx-hazelcast结节)。很高兴听到它在人们的现场案例中效果如何。 -
Vert.x 已经发布了 3.2.1 以及我之前在回答中提到的拉取请求,现在您可以使用我在下面提到的 Hazelcast 智能客户端。