我正在尝试探索 Aeron,我的机器中有一个由三个节点组成的集群。我正在尝试建立一个简单的模型:节点 1 中的一个频道发布者,节点 2 和节点 3 中的两个频道订阅者。
其中三个正在尝试通过如下多播地址进行通信:
我不明白附图的结果。 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
我想了解这个问题
这很可能是流量控制。多播的默认流量控制算法是
max
,这将允许慢速接收者掉线。如果您希望所有接收者都能看到所有数据,那么您应该尝试min
。您可以通过几种方式进行配置:
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