如何为多播频道设置多个并发订阅者?

问题描述 投票:0回答:1

我正在尝试探索 Aeron,我的机器中有一个由三个节点组成的集群。我正在尝试建立一个简单的模型:节点 1 中的一个频道发布者,节点 2 和节点 3 中的两个频道订阅者。

其中三个正在尝试通过如下多播地址进行通信:

  • 节点 1:广播到 aeron:udp?endpoint=239.255.255.1:4300|interface=192.168.64.6|ttl=16
  • 节点 2:启动接收...通道: aeron:udp?endpoint=239.255.255.1:4300|interface=192.168.64.5|ttl=16
  • 节点 3:启动接收...通道: aeron:udp?endpoint=239.255.255.1:4300|interface=192.168.64.4|ttl=16

我不明白附图的结果。 Node 1 Publisher 正在尝试尽快发布到通道中,不幸的是 Node 2 和 Node 3 没有同时消费,一次只有一个消费数据......在下面的截图中,节点 2 总是赶上发布者,但是节点 3 收到几百条消息然后被挂起,直到节点 2 首先完成 100 万条消息。我错过了什么吗?

但是,如果我将发布者的频率降低到每秒 1 条消息,那么我可以看到订阅者节点 2 和节点 3 同时接收消息。

代码的实现: 发布者代码:https://github.com/cseblog/aeron-demos/blob/main/aeron-multicast-ping-demo/src/main/java/org/multicast/Main.java

订阅者代码:https://github.com/cseblog/aeron-demos/blob/main/aeron-multicast-pong-demo/src/main/java/org/multicast/Main.java

我想了解这个问题

distributed-system aeron
1个回答
0
投票

这很可能是流量控制。多播的默认流量控制算法是

max
,这将允许慢速接收者掉线。如果您希望所有接收者都能看到所有数据,那么您应该尝试
min
。您可以通过几种方式进行配置:

URL配置

channel: aeron:udp?endpoint=239.255.255.1:4300|interface=192.168.64.5|ttl=16|fc=min

媒体驱动程序代码配置

MediaDriver.Context ctx = new MediaDriver.Context()
    .multicastFlowControlSubscriber(new MinMulticastFlowControlSupplier())

Media Driver属性配置:

aeron.multicast.flow.control.strategy=min
© www.soinside.com 2019 - 2024. All rights reserved.