在我当前的设置中,我使用 Hazelcast 集群管理器的默认多播选项。当我链接容器化 Vertx 模块的实例(通过 Docker 网络链接)时,我可以看到它们正在成功创建 Hazelcast 集群。但是,当我尝试从一个模块在事件总线上发布事件时,另一个模块不会对此做出反应。我不确定 Hazelcast 集群中的网络设置如何与事件总线的网络设置相关。
目前,我的每个 Vert.x 模块都有以下编程配置,每个模块都部署在 Docker 容器内。
ClusterManager clusterManager = new HazelcastClusterManager();
VertxOptions vertxOptions = new VertxOptions()
.setClustered(true)
.setClusterManager(clusterManager);
vertxOptions.setEventBusOptions(new EventBusOptions()
.setClustered(true)
.setClusterPublicHost("application"));
Vert.x Core 手册指出我可能需要配置clusterPublicHost
, and clusterPublicPort
对于事件总线,但我不确定它们与一般网络拓扑有何关系。
一个答案在这里https://groups.google.com/d/msg/vertx/_2MzDDowMBM/nFoI_k6GAgAJ
我发现这个问题经常出现,很多人都错过了
文档(包括我自己)是事件总线不使用
集群管理器发送事件总线消息。 IE。在你的例子中
Hazelcast 作为集群管理器,您已启动 Hazelcast 集群
并正确通信(因此您的集群管理器没问题);然而,
事件总线无法与您的其他泊坞窗通信
由于以下一项或多项原因导致的情况:
- 它正在尝试使用不正确的 IP 地址连接到其他节点(即 Docker 实例上的专用接口的 IP,而不是
公开映射的一个)
- 它正在尝试在 Docker 未配置为转发的端口上进行通信(如果您未指定,事件总线将选择动态端口)
一)
你需要做的是:
- 告诉 Vertx 其他节点用于与每个实例通信的 IP 地址(使用 -cluster-host [命令行] ,
setClusterPublicHost [VertXOptions] 或“vertx.cluster.public.host”
[系统属性]选项)
- 明确告诉 Vertx 用于事件总线通信的端口,并确保 Docker 正在转发这些端口的流量(使用
“vertx.cluster.public.port”[系统属性],setClusterPublicPort
[VertXOptions] 或 -cluster-port [命令行] 选项)。在过去,
我使用了 15701,因为它很容易记住(只是 fromt 中的“1”
Hazelcast 端口)。
事件总线仅使用集群管理器来管理IP/端口
其他 Vertx 实例的信息以及该 Vertx 实例的注册
消费者/生产者。通信是独立完成的
集群管理器,这就是为什么您可以拥有集群管理器
配置正确并通信,但仍然没有事件总线
通讯。
如果您的两个容器都可以,则您可能不需要执行上述两个步骤
在同一主机上运行,但一旦启动,您肯定会运行
在不同的主机上运行它们。
还可能发生的情况是,当未指定 vert.x(不是 hazelcast)应采用的 IP 来通过 eventbus 进行通信时,vert.x 使用环回接口。这里的问题是,您不知道通过哪个接口进行通信(环回、具有 IP 的接口,您甚至可以有多个具有 IP 的接口)。
为了解决这个问题,我写了一次方法https://github.com/swisspush/vertx-cluster-watchdog/blob/master/src/main/java/org/swisspush/vertx/cluster/ClusterWatchdogRunner.java#L101
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)