代码之家  ›  专栏  ›  技术社区  ›  elPsyChris

Vertx Eventbus无法发送节点间

  •  1
  • elPsyChris  · 技术社区  · 7 年前

    我有一个小演示,演示了Vertx如何使用Hazelcast群集管理器通过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直接完成的。具有TCP连接的x。

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

    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 是远程节点eventbus正在侦听的端口。因此,我猜我的配置遗漏了一些导致Vertx错误地址的内容,如果我错了,请纠正我。

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

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

    2 回复  |  直到 7 年前
        1
  •  3
  •   Paulo Lopes    7 年前

    看起来是垂直的。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
    
        2
  •  1
  •   elPsyChris    7 年前

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

    多亏了@Paulo\u Lopes的建议,我的问题通过一点微调就解决了。

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

    VertxOptions options = new VertxOptions().setClusterManager(mgr).setClusterHost("192.168.130.21");
    

    Vertx Hazelcast的文档中也有关于此的简要信息:

    运行垂直时。x处于群集模式,您还应确保 那个垂直。x知道正确的接口。在 命令行这是通过指定群集主机选项来完成的。。。

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

    这就是全部。“希望它能帮助有需要的人,并感谢你,”保罗说。