我有两个在集群中运行的 vertx 微服务,并使用内部云中的无头服务(链接)相互通信。每当我进行滚动部署时,我都会面临服务内的连接问题。当我分析日志时,我可以看到旧节点/pod 正在从集群列表中删除,但事件总线没有删除它并在循环的基础上使用它。
以下是部署前的成员组信息
Member [192.168.4.54]:5701 - ace32cef-8cb2-4a3b-b15a-2728db068b80 //pod 1
Member [192.168.4.54]:5705 - f0c39a6d-4834-4b1d-a179-1f0d74cabbce this
Member [192.168.101.79]:5701 - ac0dcea9-898a-4818-b7e2-e9f8aaefb447 //pod 2
Run Code Online (Sandbox Code Playgroud)
当部署开始时,pod 2 从成员列表中删除,
[192.168.4.54]:5701 [dev] [4.0.2] Could not connect to: /192.168.101.79:5701. Reason: SocketException[Connection refused to address /192.168.101.79:5701]
Removing connection to endpoint [192.168.101.79]:5701 Cause => java.net.SocketException {Connection refused to address /192.168.101.79:5701}, Error-Count: 5
Removing Member [192.168.101.79]:5701 - ac0dcea9-898a-4818-b7e2-e9f8aaefb447
Run Code Online (Sandbox Code Playgroud)
并添加了新成员,
Member [192.168.4.54]:5701 - ace32cef-8cb2-4a3b-b15a-2728db068b80
Member [192.168.4.54]:5705 - f0c39a6d-4834-4b1d-a179-1f0d74cabbce this
Member [192.168.94.85]:5701 - 1347e755-1b55-45a3-bb9c-70e07a29d55b //new pod
All migration tasks …Run Code Online (Sandbox Code Playgroud) 有谁知道在 Quarkus 测试中监视 Vert.x 事件总线的方法吗?理想情况下,我想断言,在服务层中的方法期间,我们将事件发送到正确的地址,但有人知道这是否可能吗?
如果我只是尝试使用@InjectMock我会收到以下错误
io.vertx.core.eventbus.impl.EventBusImpl@5769679b is not a normal scoped CDI bean, make sure the bean is a normal scope like @ApplicationScoped or @RequestScoped
Run Code Online (Sandbox Code Playgroud) 我对事件总线/ Hazelcast 的工作原理缺乏一点了解。
想象一下消费者和生产者 Verticle 通过集群 EB 进行通信的情况。消耗部分是进行CPU/内存/IO密集型计算。
当在某个时刻由于负载而消费者无法立即处理消息时,会发生什么?
消息是否会在环形缓冲区内排队并最终在稍后处理(考虑到 NettySingleThreadEventLoop根据vert.x 中事件总线的大小限制为 20 亿条)?达到上限后会被丢弃吗?
一般来说,只要集群中没有组件崩溃, EB 中的消息是否可以被认为是持久的并且具有传递保证?
我第一次接触Vertx的EventBus,我意识到有两种提交消息的方法。使用了send或publish方法。我想问:使用这两种方法之间的实际区别是什么?在什么情况下它们分别使用?