如何配置 Vert.x 事件总线以跨 Docker 容器集群工作?

2023-11-25

在我当前的设置中,我使用 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 集群 并正确通信(因此您的集群管理器没问题);然而, 事件总线无法与您的其他泊坞窗通信 由于以下一项或多项原因导致的情况:

  1. 它正在尝试使用不正确的 IP 地址连接到其他节点(即 Docker 实例上的专用接口的 IP,而不是 公开映射的一个)
  2. 它正在尝试在 Docker 未配置为转发的端口上进行通信(如果您未指定,事件总线将选择动态端口) 一)

你需要做的是:

  1. 告诉 Vertx 其他节点用于与每个实例通信的 IP 地址(使用 -cluster-host [命令行] , setClusterPublicHost [VertXOptions] 或“vertx.cluster.public.host” [系统属性]选项)
  2. 明确告诉 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(使用前将#替换为@)

如何配置 Vert.x 事件总线以跨 Docker 容器集群工作? 的相关文章

  • 如何在“Docker for Windows”中启用docker远程API

    I have 适用于 Windows 的 Docker 桌面1 12 1 stable 内部版本 7135 安装在我的 Windows 10 计算机上 我想使用以下方式访问 docker远程API https docs docker com
  • Play框架运行应用程序问题

    每当我尝试运行使用以下命令创建的新 Web 应用程序时 我都会收到以下错误Play http www playframework org Error occurred during initialization of VM Could no
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • 非生产模式下的 Elasticsearch docker 容器可消除 vm.max_map_count=262144 要求

    如何配置 elasticsearch docker 容器 elasticsearch 7 5 0 以使用更少的资源并在非生产模式下运行 我想在 Jenkins 和我的桌面上运行容器 并且满足以下要求这个弹性文档 https www elas
  • Final字段的线程安全

    假设我有一个 JavaBeanUser这是从另一个线程更新的 如下所示 public class A private final User user public A User user this user user public void
  • JAXb、Hibernate 和 beans

    目前我正在开发一个使用 Spring Web 服务 hibernate 和 JAXb 的项目 1 我已经使用IDE hibernate代码生成 生成了hibernate bean 2 另外 我已经使用maven编译器生成了jaxb bean
  • 在同一个 nginx 服务器块上公开多个 api uri

    Goal 我的目标是在同一个 nginx 服务器上设置多个后端 api 容器 http localhost 80 api account gt 调用 http account service 9000 http localhost 80 a
  • 多个 Maven 配置文件激活多个 Spring 配置文件

    我想在 Maven 中构建一个环境 在其中我想根据哪些 Maven 配置文件处于活动状态来累积激活多个 spring 配置文件 目前我的 pom xml 的相关部分如下所示
  • Liferay ClassNotFoundException:DLFileEntryImpl

    在我的 6 1 0 Portal 实例上 带有使用 ServiceBuilder 和 DL Api 的 6 1 0 SDK Portlet 这一行 DynamicQuery query DynamicQueryFactoryUtil for
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • 如何在控制器、服务和存储库模式中使用 DTO

    我正在遵循控制器 服务和存储库模式 我只是想知道 DTO 在哪里出现 控制器应该只接收 DTO 吗 我的理解是您不希望外界了解底层域模型 从领域模型到 DTO 的转换应该发生在控制器层还是服务层 在今天使用 Spring MVC 和交互式
  • 如何从指定日期获取上周五的日期? [复制]

    这个问题在这里已经有答案了 如何找出上一个 上一个 星期五 或指定日期的任何其他日期的日期 public getDateOnDay Date date String dayName 我不会给出答案 先自己尝试一下 但是 也许这些提示可以帮助
  • 在mockito中使用when进行模拟ContextLoader.getCurrentWebApplicationContext()调用。我该怎么做?

    我试图在使用 mockito 时模拟 ContextLoader getCurrentWebApplicationContext 调用 但它无法模拟 here is my source code Mock org springframewo
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O

随机推荐