我们目前正在使用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)。
我们有三个原因依赖于淡褐色
1)由于服务器重启期间的不一致2)我们使用嵌入式hazelcast,当不正常的hazelcast数据我们希望我们的应用程序独立于其他服务时,我们最终重新启动我们的应用程序
3)内存分配(hazelcast数据)现在独立于应用服务器
答案 0 :(得分:0)
Vertx 3.2.0现在支持将预先配置的Hazelcast实例交给其构建群集。因此,您可以完全控制Hazelcast配置,包括存储数据的方式和位置。但是您还需要Vert.x 3.2.1 release中的错误修复才能真正使用它。
上的更新文档注意: 创建自己的群集时,需要使用Vertx所需的额外Hazelcast设置。这些都在上面的文档中注明。
Vert.x 3.2.1 release修复了阻止客户端连接使用的问题。请注意,如果您使用Hazelcast客户端进行分布式锁定,则如果网络连接以对服务器节点不明显的方式停止(默认情况下所有其他JVM出口应该),则锁定的默认超时为60秒立即清除锁。)
您可以使用以下方式降低此金额:
>>> c=a[:]
>>> c
[1, 5, 3]
>>> a[1]=10
>>> a
[1, 10, 3]
>>> c
[1, 5, 3]
另请注意,对于Hazelcast客户端,您可能希望对某些映射使用近缓存,并查看其他高级配置选项,以便对客户端进行性能调优,该客户端的行为与完整数据节点不同。
从版本3.2.1开始,您可以使用Vertx所需的地图设置运行其他完整的Hazelcast节点。然后在启动Vertx时创建自定义Hazelcast客户端(取自新的单元测试用例):
// This is checked every 10 seconds, so any value < 10 will be treated the same
System.setProperty("hazelcast.client.max.no.heartbeat.seconds", "9");
显然,您的客户端配置和需求会有所不同。有关客户端配置,请参阅Hazelcast文档:http://docs.hazelcast.org/docs/3.5/manual/html-single/index.html