我有一个小型演示,演示了Vertx如何通过带有Hazelcast Cluster Manager的Eventbus在节点之间发送消息。
到目前为止,我已经让节点成功识别了对方。
Members [2] {
Member [192.168.150.193]:5701 - 0c8120d8-73dc-4fc2-af6d-16288dbd707a
Member [192.168.130.41]:5701 - 19239bb1-e7e8-4990-a389-817d6a7d128a this
}
但是,我遇到了Cluster成员之间的EventBus通信问题。根据Vertx手册页。
集群管理器不处理事件总线节点间传输,这是由Vert.x与TCP连接直接完成的。
但是,即使我事先通过Cluster Manager从集群管理器获得集群事件总线:
public static EventBus clusterEB = null;
...
Vertx.clusteredVertx(options, res -> {
if (res.succeeded()) {
Vertx vertx = res.result();
clusterEB = vertx.eventBus();
vertx.deployVerticle(new DemoVerticle());
}
});
当 local 节点的主Verticle使用该静态eventbus对象向远程节点发送消息时。
eb.send("worker.count", request_count, res -> {
if (res.succeeded()) {
System.out.println("Received reply No." + res.result().body());
worker_busy--;
System.out.println("WORKER_BUSY = " + worker_busy);
}
});
抛出异常:
io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: localhost/127.0.0.1:50509
使用 netstat ,我发现 50509 是远程节点eventbus正在侦听的端口。因此,我猜测我的配置错过了导致Vertx错误地址的内容,如果我错了,请纠正我。
这些信息是我迄今为止所研究的信息,我真的很期待听到你们对这个问题的任何建议。如果您需要更多信息,请随时问我。
p / s:本地节点之间的事件总线通信仍然正常。在Ubuntu上运行的代码(禁用UFW),远程机器是关闭防火墙的Windows(我认为防火墙在这里不是问题,因为节点之间仍有tcp连接列出网络中的所有集群成员)
答案 0 :(得分:3)
看起来vert.x正在为您的主机(127.0.0.1)选择错误的IP地址,而实际上它们是:
您可能希望通过添加以下额外命令行参数来强制每个节点选择正确的IP地址:
-cluster-host 192.168.150.193
对于其他节点也是如此:
-cluster-host 192.168.130.41
答案 1 :(得分:1)
对于遇到同样问题的人,希望我的回答能为您提供帮助。
感谢@Paulo_Lopes的建议,我的问题通过一点调整解决了。
我必须以编程方式设置Cluster主机,例如:
VertxOptions options = new VertxOptions().setClusterManager(mgr).setClusterHost("192.168.130.21");
Vertx Hazelcast的文档也有一个简短的信息:
当运行Vert.x处于群集模式时,您还应该确保 Vert.x知道正确的接口。在跑步时 命令行这是通过指定cluster-host选项来完成的......
但说实话,我认为他们应该更容易理解方式。简而言之,您必须将您的机器IP指定为群集主机,因为群集事件总线将获取该IP并注册套接字以进行节点间通信。如果未设置群集主机配置,则Vertx将使用您的本地主机' (127.0.0.1)作为IP,通过Vertx发送的每条消息只能到达本地节点。
这就是全部。希望它能帮助有需要的人,非常感谢你,@ Paulo。