对于运行在不同机器上的垂直设备,无法使用事件总线进行通信



我们试图使用事件总线在垂直设备之间建立通信。我们尝试了最简单的乒乓球通信示例-

public class Sender extends AbstractVerticle {
    public static void main(String[] args) {
        Vertx.clusteredVertx(new VertxOptions(),res->{
            res.result().deployVerticle(new Sender());
        });
    }
    @Override
    public void start() throws Exception {
        EventBus eb = vertx.eventBus();
        vertx.setPeriodic(1000, v -> {
            eb.send("ping-address", "ping!", reply -> {
                if (reply.succeeded()) {
                    System.out.println("Received reply: " + reply.result().body());
                } else {
                    System.out.println("No reply");
                }
           });
        });
    }
}

类似地,我们写了,写了接收者。请参阅代码。

如果发送方和接收方都在同一台机器上运行,则通信成功。但当它们运行在不同的机器上时,通信会失败。此外,这似乎不是Hazelcast集群管理器(我们使用的)的问题,因为hazecast正确地发现了两台机器上的另一个对等机(这从Hazelcast的控制台日志中可以明显看出)。

Members [2] {
    Member [192.168.43.12]:5701
    Member [192.168.43.84]:5701 this
}

此外,两台机器上都没有启用防火墙,我们只能使用hazelcast(不使用vertx)在同一台机器之间建立通信,而且它运行得很好(例如)。所以问题可能出在vert-x上。

是否尝试在VertxOptions上设置setClustered(true)?我正在测试这个示例代码,它对我来说很好:

public static void main(String[] args) {
    VertxOptions op = new VertxOptions();
    op.setClustered(true);
    Vertx.clusteredVertx(op, e -> {
        if (e.succeeded()) {
            HelloWorldVerticle hwv = new HelloWorldVerticle();
            e.result().deployVerticle(hwv);
        } else {
            e.cause().printStackTrace();
        }
    });
}

Hazelcat通信不同于Vert.x通信。从文件

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

部署时,可以将事件总线设置为集群模式。从文件上看,

事件总线不仅仅存在于一个Vert.x实例中。通过将网络上不同的Vert.x实例聚集在一起可以形成单个分布式事件总线。

关于集群事件总线,文档中说

EventBusOptions还允许您指定事件总线是集群的,端口和主机。

在容器中使用时,还可以配置公共主机和端口:

代码段是

VertxOptions options = new VertxOptions()
    .setEventBusOptions(new EventBusOptions()
        .setClusterPublicHost("whatever")
        .setClusterPublicPort(1234)
    );
Vertx.clusteredVertx(options, res -> {
// check if deployment was successful.

另一个有用的链接是这个

最新更新