2016-10-02 123 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);