2016-10-02 119 views
1

在我当前的设置中,我使用Hazelcast集群管理器的默认多播选项。当我链接集装箱Vertx模块的实例(通过Docker网络链接)时,我可以看到他们正在成功创建Hazelcast集群。但是,当我尝试从一个模块发布事件总线上的事件时,另一个模块不会对它做出反应。我不确定Hazelcast集群中的网络设置如何与事件总线的网络设置相关。如何将Vert.x事件总线配置为跨Docker容器集群工作?

目前,我对每个Vert.x模块都有以下编程配置,每个模块都部署在泊坞窗容器中。

ClusterManager clusterManager = new HazelcastClusterManager(); 
VertxOptions vertxOptions = new VertxOptions() 
      .setClustered(true) 
      .setClusterManager(clusterManager); 
vertxOptions.setEventBusOptions(new EventBusOptions() 
      .setClustered(true) 
      .setClusterPublicHost("application")); 

,我可能必须配置clusterPublicHost,并clusterPublicPort的事件总线,但我不知道如何将这些涉及到一般的网络拓扑Vert.x核心手动状态。

回答

3

一个答案就在这里https://groups.google.com/d/msg/vertx/_2MzDDowMBM/nFoI_k6GAgAJ

我看到这个问题上来了很多,正是很多人在 错过的文档(包括我自己)是事件总线不使用 集群管理器发送事件总线消息。即在你作为集群管理器的 Hazelcast的例子中,你将Hazelcast集群加入 并正确通信(所以你的集群管理器很好);然而, 事件总线无法与其他搬运工 实例通信由于一个或多个以下:

  1. 它正试图使用​​不正确的IP地址到其他节点(即的的IP在泊坞窗实例的专用接口,而不是 公开映射一个)
  2. 它试图泊坞窗未配置为转发端口通信(事件总线挑选一个动态端口,如果你不指定 之一)

你需要什么d做的是:

  1. 告诉Vertx,其他节点应该使用搭腔实例(使用-cluster主机[命令行] IP地址, setClusterPublicHost [VertXOptions]或“vertx.cluster。 public.host“ [系统属性]选项)
  2. 告诉Vertx明确指出用于事件总线通信的端口,并确保Docker为这些端口转发通信量(使用 ”vertx.cluster.public.port“[系统属性],setClusterPublicPort [VertXOptions]或-cluster-port [命令行]选项)。在过去, 我已经使用15701,因为它很容易记住(只是'1'在从 Hazelcast端口)。

事件总线仅使用群集管理器来管理其他Vertx实例的IP /端口 信息和 消费者/生产者的注册。通信独立于集群管理器 完成,这就是为什么您可以让集群管理器 正确配置并进行通信,但仍然没有事件总线 通信。

如果两个容器 都在同一台主机上运行,​​但您肯定会在启动 后,在单独的主机上运行它们,您可能无需执行上述两个步骤。

也可能发生的一件事是,vert.x使用loopback接口,当没有指定哪个vert.x(不是hazelcast)通过eventbus进行通信时应该采用的IP。这里的问题是,你不知道通过哪个接口进行通信(环回,与IP的接口,甚至可能有多个IP接口)。

为了克服这个问题,我写了一次https://github.com/swisspush/vertx-cluster-watchdog/blob/master/src/main/java/org/swisspush/vertx/cluster/ClusterWatchdogRunner.java#L101

0

集群管理器正常工作的方法,集群管理器配置必须是在集群中的每个节点上是相同的(机器/泊坞窗容器)或不完成任何配置(使用群集管理器的默认配置)。

您必须使每个节点上的事件总线配置保持一致,您必须将每个节点上的群集主机设置为此节点本身的IP地址以及任意任意端口号(除非您尝试运行多于Vert .x实例在同一个节点上,您必须为每个Vert.x实例选择不同的端口号)。

例如,如果一个节点的IP地址192.168.1.12是,那么你会做到以下几点:

VertxOptions options = new VertxOptions() 
       .setClustered(true) 
       .setClusterHost("192.168.1.12") // node ip 
       .setClusterPort(17001) // any arbitrary port but make sure no other Vert.x instances using same port on the same node 
       .setClusterManager(clusterManager); 

,IP地址为192.168.1.56,那么你会做以下的其他节点上:

VertxOptions options = new VertxOptions() 
       .setClustered(true) 
       .setClusterHost("192.168.1.56") // other node ip 
       .setClusterPort(17001) // it is ok because this is a different node 
       .setClusterManager(clusterManager);