Tcp Vertx Eventbus无法发送节点间数据

Tcp Vertx Eventbus无法发送节点间数据,tcp,netty,hazelcast,vert.x,Tcp,Netty,Hazelcast,Vert.x,我有一个小演示,演示了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 }

我有一个小演示,演示了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
}
但是,我在集群成员之间的EventBus通信中遇到了一个问题。根据Vertx手册页面

群集管理器不处理事件总线节点间传输,这是由Vert.x通过TCP连接直接完成的

但是,即使我事先通过以下方式从群集管理器获得群集事件总线:

public static EventBus clusterEB = null;
...
Vertx.clusteredVertx(options, res -> {
        if (res.succeeded()) {
            Vertx vertx = res.result();
            clusterEB = vertx.eventBus();
            vertx.deployVerticle(new DemoVerticle());
        }
    });
本地节点的主垂直体使用该静态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是远程节点事件总线正在侦听的端口。因此,我猜我的配置遗漏了一些导致Vertx错误地址的内容,如果我错了,请纠正我

这些信息是我目前为止研究过的,我真的很期待听到你们对这个问题的任何建议。如果您需要更多信息,请随时询问我


p/s:本地节点之间的事件总线通信仍然良好。在Ubuntu上运行的代码(禁用UFW),远程计算机是一个关闭防火墙的Windows(我认为防火墙在这里不是问题,因为节点之间仍然存在tcp连接,可以列出网络中的所有集群成员)

看起来vert.x为您的主机选择了错误的IP地址(127.0.0.1)事实上,它们是:

  • 192.168.150.193
  • 192.168.130.41
您可能希望通过添加以下额外的命令行参数来强制每个节点选择正确的IP地址:

-cluster-host 192.168.150.193
对于另一个节点也是如此,具有:

-cluster-host 192.168.130.41

看起来vert.x为您的主机(127.0.0.1)选择了错误的IP地址,而实际上它们是:

  • 192.168.150.193
  • 192.168.130.41
您可能希望通过添加以下额外的命令行参数来强制每个节点选择正确的IP地址:

-cluster-host 192.168.150.193
对于另一个节点也是如此,具有:

-cluster-host 192.168.130.41

对于遇到同样问题的人,希望我的回答能对你有所帮助

多亏了@Paulo_Lopes的建议,我的问题通过一点调整就解决了

我必须以编程方式设置群集主机,如下所示:

VertxOptions options = new VertxOptions().setClusterManager(mgr).setClusterHost("192.168.130.21");
Vertex Hazelcast的文件中也有关于此的简要信息:

在群集模式下运行Vert.x时,还应确保 Vert.x知道正确的接口。当你在球场上奔跑时 命令行这是通过指定群集主机选项来完成的

但老实说,我认为他们应该把它放在更容易理解的方式。简而言之,您必须将机器IP指定为群集主机,因为群集事件总线将使用该IP并注册一个用于节点间通信的套接字。如果未设置群集主机配置,Vertx将使用您的“localhost”(127.0.0.1)作为IP,并且通过Vertx发送的每条消息将只能到达本地节点


就这些。希望它能帮助有需要的人,并感谢你,@Paulo.

对于遇到同样问题的人,希望我的回答能帮助你

多亏了@Paulo_Lopes的建议,我的问题通过一点调整就解决了

我必须以编程方式设置群集主机,如下所示:

VertxOptions options = new VertxOptions().setClusterManager(mgr).setClusterHost("192.168.130.21");
Vertex Hazelcast的文件中也有关于此的简要信息:

在群集模式下运行Vert.x时,还应确保 Vert.x知道正确的接口。当你在球场上奔跑时 命令行这是通过指定群集主机选项来完成的

但老实说,我认为他们应该把它放在更容易理解的方式。简而言之,您必须将机器IP指定为群集主机,因为群集事件总线将使用该IP并注册一个用于节点间通信的套接字。如果未设置群集主机配置,Vertx将使用您的“localhost”(127.0.0.1)作为IP,并且通过Vertx发送的每条消息将只能到达本地节点


就这些。希望它能帮助有需要的人,非常感谢你,@Paulo。

你检查过每个节点都能到达另一个节点吗?没有防火墙阻止这些端口?是的,我想是的。因为在集群成员扫描阶段,一切似乎都很好(我将其配置为使用TCP进行扫描,并且远程和本地计算机上的防火墙都已关闭)。还有其他想法吗?顺便说一句,你的建议给了我一些线索。我将尝试它们,并让您知道问题是否得到解决。您是否检查了每个节点是否可以连接到另一个节点?没有防火墙阻止这些端口?是的,我想是的。因为在集群成员扫描阶段,一切似乎都很好(我将其配置为使用TCP进行扫描,并且远程和本地计算机上的防火墙都已关闭)。还有其他想法吗?顺便说一句,你的建议给了我一些线索。我会试试看,如果问题解决了,我会告诉你的。你可以在上获取我的演示。你可以在上获取我的演示