Aeron:Multi-Destination-Cast

news2024/10/5 21:24:14

Multi-Destination-Cast(MDC)是一种功能,允许 Aeron 从单个 Publication 同时向多个目的地传送数据。Multiple-Destination-Cast是 Aeron 的一项高级功能,本指南将介绍如何开发一个简单示例的基本知识。

一、MDC Publications

注:

MDC Publications 能够在不支持 UDP 组播的环境中提供与 UDP 组播大致相同的行为。请注意,这不是真正的组播—数据是单独发送到每个订阅(subscription)的,但支持流量控制功能。

MDC Publications可以动态或手动模式运行。对于动态 MDC Publications,Subscription 会在运行时动态添加到Publications中。对于手动 MDC Publications,Subscription 必须显式添加到Publications中。

动态 MDC Publications的工作方式与标准 Aeron Publications非常相似,但配置是颠倒的。

TypePublicationSubscription
Standardchannel指向Subscription(Channel points to Subscription)Channel/port on localhost
Dynamic Multi-Destination-Cast PublicationChannel/port on localhostchannel指向Subscription(Channel points to Publication)

Sample Dynamic MDC Publication(示例) 

完整的multi-host示例可在 GitHub 上找到。该示例创建了一个具有动态 MDC Publication的单个publisher,以及两个订阅 MDC Publication的客户端。每个进程都位于一个专用的 Docker 容器中。

Media Driver Configuration 

Media Driver不需要任何特定配置,但是,如果您要求 Publications 能够在未连接任何 Subscriptions 的情况下发布数据,则可以选择启用 spiesSimulateConnection。示例代码如下:

final var mediaDriverContext = new MediaDriver.Context()
 .spiesSimulateConnection(true)
 .errorHandler(this::errorHandler)
 .threadingMode(ThreadingMode.SHARED)
 .sharedIdleStrategy(new SleepingMillisIdleStrategy())
 .dirDeleteOnStart(true);

 

 Publication

MDC 动态Publication使用特定的通道配置,其中至少包括:

aeron:udp?control-mode=dynamic|control=MDC_HOST:MDC_CONTROL_PORT

control-mode=dynamic 告知 Aeron 这是一个Dynamic MDC Publication。上述示例中的 MDC_HOST 必须是运行该Publication的主机(host)。在幕后,Subscriptions会使用控制端口连接到该主机,以构建运行时流程,因此控制端口必须是客户端已知的端口。

示例代码(sample code)构建Publication channel的过程如下:

final var publicationChannel = "aeron:udp?control-mode=dynamic|control=" + host
            + ":" + controlChannelPort;
final var publication = aeron.addExclusivePublication(publicationChannel, 100);

除基本配置外,还可通过通道配置流量控制策略。其中包括基于组限制的流量控制策略,即必须连接最少数量的节点,Publication才会进入连接状态。

Subscription

将MDC Subscription连接到dynamic Publication非常简单—通道配置必须包括 MDC Publication host和远程主机(host)将发布到的本地端点。最小配置如下:

aeron:udp?endpoint=LOCALHOST:0|control=MDC_HOST:MDC_CONTROL_PORT|control-mode=dynamic

与Publication一样,control-mode=dynamic(动态控制模式)告诉 Aeron 这是一个dynamic MDC connection,endpoint=LOCALHOST:0 指的是 MDC Dynamic Publication将向其发布数据的本地主机上的一个短暂端口,也可以是一个预定义端口。最后,control=MDC_HOST:MDC_CONTROL_PORT 告诉 Aeron 如何连接远程动态 MDC Publication。

示例代码( sample code )构建订阅通道的过程如下:

final mdcSubscription = aeron.addSubscription("aeron:udp?endpoint=" + host
    + ":0|control=" + mdcHost + ":" + mdcControlPort + "|control-mode=dynamic", 100);

该示例运行两个客户端实例,每个实例位于一个专用的 Docker 主机中。

Sample output

以下是通过 docker-compose up 运行的示例输出,经过简单编辑:

mdc-subscriber-2_1  | 16:47:00.945 [main] INFO MultiDestinationSubscriberAgent - launching media driver
mdc-publisher_1     | 16:47:00.946 [main] INFO MultiDestinationPublisherAgent - launching media driver
mdc-subscriber-1_1  | 16:47:01.066 [main] INFO MultiDestinationSubscriberAgent - launching media driver
mdc-subscriber-2_1  | 16:47:01.082 [main] INFO MultiDestinationSubscriberAgent - connecting aeron; media driver directory /dev/shm/aeron-root
mdc-publisher_1     | 16:47:01.083 [main] INFO MultiDestinationPublisherAgent - launching aeron
mdc-subscriber-2_1  | 16:47:01.093 [main] INFO MultiDestinationSubscriberAgent - adding the subscription
mdc-subscriber-2_1  | 16:47:01.093 [main] INFO MultiDestinationSubscriberAgent - detected ip4 address as 10.1.0.3
mdc-publisher_1     | 16:47:01.093 [main] INFO MultiDestinationPublisherAgent - Media Driver directory is /dev/shm/aeron-root
mdc-publisher_1     | 16:47:01.095 [main] INFO MultiDestinationPublisherAgent - detected ip4 address as 10.1.0.2
mdc-publisher_1     | 16:47:01.107 [main] INFO MultiDestinationPublisherAgent - creating publication
mdc-subscriber-2_1  | 16:47:01.128 [mdc-subscriber] INFO MultiDestinationSubscriberAgent - starting
mdc-subscriber-1_1  | 16:47:01.162 [main] INFO MultiDestinationSubscriberAgent - connecting aeron; media driver directory /dev/shm/aeron-root
mdc-publisher_1     | 16:47:01.165 [mdc-publisher] INFO MultiDestinationPublisherAgent - Starting up
mdc-publisher_1     | 16:47:01.166 [mdc-publisher] INFO MultiDestinationPublisherAgent - appended 1
mdc-subscriber-1_1  | 16:47:01.170 [main] INFO MultiDestinationSubscriberAgent - adding the subscription
mdc-subscriber-1_1  | 16:47:01.170 [main] INFO MultiDestinationSubscriberAgent - detected ip4 address as 10.1.0.4
mdc-subscriber-1_1  | 16:47:01.201 [mdc-subscriber] INFO MultiDestinationSubscriberAgent - starting
mdc-publisher_1     | 16:47:03.167 [mdc-publisher] INFO MultiDestinationPublisherAgent - appended 2
mdc-subscriber-2_1  | 16:47:03.170 [mdc-subscriber] INFO MultiDestinationSubscriberFragmentHandler - received 2
mdc-subscriber-1_1  | 16:47:03.171 [mdc-subscriber] INFO MultiDestinationSubscriberFragmentHandler - received 2
mdc-publisher_1     | 16:47:05.167 [mdc-publisher] INFO MultiDestinationPublisherAgent - appended 3
mdc-subscriber-1_1  | 16:47:05.171 [mdc-subscriber] INFO MultiDestinationSubscriberFragmentHandler - received 3
mdc-subscriber-2_1  | 16:47:05.170 [mdc-subscriber] INFO MultiDestinationSubscriberFragmentHandler - received 3
...

注:

  • 示例使用了宽松的 IdleStrategy 配置,这就解释了为什么在append and receive之间会有 3 到 4 毫秒的间隔。

  • mdc-publisher_1 的日志条目中 appended 1,但两个客户端却没有显示相应的received 1 的日志。这是因为 mdc-publisher_1 Media Driver将 spiesSimulateConnection 设置为 true,而 mdc-subscriber-* 进程尚未连接。它们确实收到了 2。

Flow Control 

上面的例子提出了一个问题:如果 mdc-subscriber-1 开始落后于 mdc-subscriber-2mdc-publisher 应该怎么办?在 Aeron 中可以通过流量控制配置这种行为。可以在Media Driver中将流量控制配置为默认值,然后按通道进行自定义。

Flow Control Types 
TypeDescription
maxPublication将受到最快订阅(Subscription)的限制。速度慢的消费者可能会丢失数据包。这是 Aeron 的默认设置。(Publication will be limited by the fastest Subscription. Slow consumers may lose data packets. This is the default in Aeron.)
minPublication将受到最慢订阅(Subscription)的限制。(Publication will be limited by the slowest Subscription.)
taggedPublication将受到组内最慢标记订阅(Subscription)的限制(Publication will be limited by the slowest tagged Subscription within a group)

如果Publication产生数据的速度超过了流量控制策略规定的水平,Publication就会受到back pressure(背压:实际上就是常规说的堵上游)。 

MAX FLOW CONTROL 

例如,通过在通道配置中设置 fc=max 来配置最大流量控制: 

aeron:udp?control-mode=dynamic|control=MDC_HOST:MDC_CONTROL_PORT|fc=max

或者使用Media Driver Context设置默认值(注意,UDP 组播和多目的地组播(Multi-Destination-Cast)都使用 multicastFlowControlSupplier):

final var mediaDriverContext = new MediaDriver.Context()
...
 .multicastFlowControlSupplier(new MaxMulticastFlowControlSupplier())
...

MIN FLOW CONTROL

例如,通过在通道配置中设置 fc=min 来配置最小流量控制: 

aeron:udp?control-mode=dynamic|control=MDC_HOST:MDC_CONTROL_PORT|fc=min

可设置的其他选项包括组大小。下面的示例用 g:/5 设置了 5 个组。组大小控制着Publication的连接状态—例如,如果组大小为 5,则只有当 5 个Subscriptions连接时,Publication才会被视为已连接。这样,系统就可以在至少有 5 个已连接Subscriptions的情况下运行,其中最慢的Subscriptions将为所有已连接Subscriptions设定速度。

aeron:udp?control-mode=dynamic|control=MDC_HOST:MDC_CONTROL_PORT|fc=min,g:/5

这也可以在Media Driver Context中进行默认设置(此处将组大小设置为 5):

final var mediaDriverContext = new MediaDriver.Context()
...
 .multicastFlowControlSupplier(new MinMulticastFlowControlSupplier())
 .flowControlGroupMinSize(5)
...

TAGGED FLOW CONTROL

有时,您需要在Multi-Destination-Cast中进行更精细的控制,例如,您可能有一组用户不应该丢失数据包,但您也可能连接了不受数据丢失影响的其他用户,您不希望这些接受数据丢失的用户用最小流量(min)控制策略拖住所有Subscriptions用户。标记流量控制策略可以实现这一点。

以下配置将 Publication 信道的流量控制设置为标记(tagged),组设置为 101

aeron:udp?control-mode=dynamic|control=MDC_HOST:MDC_CONTROL_PORT|fc=tagged,g:101

要让Subscription加入带有 101 标签的流量控制(从而受到流量控制,就像最小策略一样),需要对 gtag 进行如下设置:

aeron:udp?endpoint=LOCALHOST:0|control=MDC_HOST:MDC_CONTROL_PORT|control-mode=dynamic|gtag=101

如果Subscription需要加入同一个 MDC Publication,但不担心数据丢失(即不受流量控制),则可以删除 gtag

aeron:udp?endpoint=LOCALHOST:0|control=MDC_HOST:MDC_CONTROL_PORT|control-mode=dynamic

以下是设置Media Driver默认值的等效方法:

final var mediaDriverContext = new MediaDriver.Context()
...
 .multicastFlowControlSupplier(new TaggedMulticastFlowControlSupplier())
 .flowControlGroupTag(101)
...

 

与最小(min)流量控制策略一样,标记(tagged)流量控制也可设置最小分组规模。在本例中,标签设置为 101,组大小设置为 5

aeron:udp?control-mode=dynamic|control=MDC_HOST:MDC_CONTROL_PORT|fc=tagged,g:101/5

 See Also

  • Multiple Destinations in the Aeron Wiki
  • Flow and Congestion Control in the Aeron Wiki
  • Flow Control in Aeron by Michael Barker

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1830361.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习中的监督学习介绍

In this post well go into the concept of supervised learning, the requirements for machines to learn, and the process of learning and enhancing prediction accuracy. 在这篇文章中,我们将深入探讨监督学习的概念、机器学习的要求以及学习和提高预测准确…

Proxmox VE (PVE) 教学 (3) | 在 Proxmox VE 中安装与配置 OpenWrt

大家好,很长时间没有更新这个系列了。最近正在开发新项目,刚刚想起来我是不是还有一个什么专栏没更新。 本期的网络配置背景同于前两期的描述( 详见https://www.hestudio.net/category/proxmox-ve/ ),这一期只是对网络配置的扩展,也就是安装软路由,实现网络配置的更多功…

计算机网络:1概述

概述 因特网 网络、互连网(互联网)与因特网的区别与关系 若干节点和链路互连形成网络,若干网络通过路由器互连形成互连网,世界上最大的互连网是互联网(因特网Internet)。 因特网发展的三个阶段 因特网…

【挑战100天首通《谷粒商城》】-【第一天】【10 番外篇】 解决docker 仓库无法访问 + MobaXterm连接VirtualBox虚拟机

文章目录 课程介绍 1、解决docker 仓库无法访问 2、 MobaXterm连接VirtualBox虚拟机 Stage 1:下载MobaXterm选择适合你的版本 Stage 2:vagrant ssh 连接,开启ssh访问 Stage 2-1:su获取root账号权限,输入密码(默认vagra…

C语言笔记第15篇:文件操作

1、为什么使用文件? 如果没有文件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运行程序,是看不到上次程序的数据的,如果要将数据进行持久化…

Java 集合框架:LinkedList 的介绍、使用、原理与源码解析

大家好,我是栗筝i,这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 014 篇文章,在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验,并希望进…

【漏洞复现】畅捷通T+ App_Code.ashx 远程命令执行漏洞

免责声明: 本文内容旨在提供有关特定漏洞或安全漏洞的信息,以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步,并非出于任何恶意目的。阅读者应该明白,在利用本文提到的漏洞信息或进行相关测…

什么是加密算法,有什么不同类型?

加密算法是一种数学函数或程序,它能够将原始的、可读的数据(也称为“明文”)转换为一种不可读的代码形式(称为“密文”)。这种转换是通过特定的算法和密钥来实现的,目的是保护数据的机密性和完整性&#xf…

HTML表单深度解析:构建互动的网页界面

表单是HTML中用于收集用户输入信息的重要元素&#xff0c;是网页与用户交互的关键组件。以下是一个典型的HTML表单示例&#xff0c;我们将会详细解析其中的各个元素及属性含义。 <form action"https://xx.xxx.xx/search" target"_self" method"ge…

CDN简介

CDN 的基本概念 CDN&#xff08;Content Delivery Network&#xff09;&#xff0c;即内容分发网络。 CDN是一种分布式网络架构&#xff1a;它由分布在不同地理位置的服务器组成网络&#xff0c;这些服务器协同工作以提供内容服务。 内容分发的核心目标 确保用户能够快速、可…

WordPress管理员后台登录地址修改教程,WordPress admin登录地址文件修改方法

我们使用WordPress时&#xff0c;管理员后台登录默认地址为“域名/wp-login.php”或“域名/wp-admin”&#xff0c;为了安全&#xff0c;一般会把此地址改掉&#xff0c;防止有人恶意来攻击咱的WordPress&#xff0c;今天出个WordPress后台登录地址修改教程&#xff0c;修改之后…

[oeasy]python0021_宝剑镶宝石_爱之石中剑_批量替换_特殊字符_特殊颜色

继续运行 &#x1f94b; 回忆上次内容 上次 运行了 game.py分析了 game.py也大致读懂了 game.py 这个 程序 可以进一步 进行修改吗&#xff1f;&#xff1f; 添加爱心 可以 把这个 ❤ 选中并复制 再粘贴到 虚拟机右侧的 剪贴板 然后 回到 游戏程序 进行修改和粘贴 按方向键h…

2024广州光亚展参展记录

参展总结 智控面板外观设计百家齐放&#xff0c;但始终逃不出几大设计元素的组合&#xff08;各种尺寸的屏、不同规则的按键切分、不同材质的面板材质&#xff09;&#xff1b;互联互通的趋势明显&#xff0c;接入米家、小度、涂鸦、HomeKit平台成为众多厂商的首选&#xff1b;…

JavaFX BorderPane布局

BorderPane布局顶部&#xff0c;底部&#xff0c;左&#xff0c;右或中心区域中的子节点。每个区域只能有一个节点。BorderPane的顶部和底部区域允许可调整大小的节点占用所有可用宽度。 左边界区域和右边界区域占据顶部和底部边界之间的可用垂直空间。 默认情况下&#xff0c…

一二三应用开发平台应用开发示例(3)——生成库表及后端代码

生成库表 前端页面的配置&#xff0c;也就是视图功能&#xff0c;我们先放一放&#xff0c;来看看生成库表和后端代码。 关闭实体配置界面&#xff0c;回到实体列表&#xff0c;勾选“文件夹”实体&#xff0c;点击“生成库表”&#xff0c;并确定。 系统提示成功后&#xff…

【Linux应用】Linux系统的设备管理——Udev

1.udev概述 udev是 Linux2.6内核里的一个功能&#xff0c;它替代了原来的 devfs&#xff0c;成为当前 Linux 默认的设备管理工具&#xff0c;能够根据系统中的硬件设备的状态动态更新设备文件&#xff0c;包括设备文件的创建&#xff0c;删除等。 udev以守护进程的形式运行&am…

python基础 002 - 1 基础语法

1 标识符&#xff08;identifier&#xff09;&#xff0c;识别码&#xff0c;表明身份 身份证&#xff0c;ID 定义&#xff1a;在编程语言中标识符就是程序员自己规定的具有特定含义的词&#xff0c;比如类名称、属性名称、变量名等&#xff0c; 在Python 中&#xff0c;pyt…

教学资源共享平台的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;老师管理&#xff0c;用户管理&#xff0c;成绩管理&#xff0c;教学资源管理&#xff0c;作业管理 老师账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用…

数组元素的内存地址计算【数据结构与算法C#版】

数组元素被存储在连续的内存空间中&#xff0c;这意味着计算数组元素的内存地址非常容易。给定数组内存地址&#xff08;首 元素内存地址&#xff09;和某个元素的索引&#xff0c;我们可以使用下方图 所示的公式计算得到该元素的内存地址&#xff0c;从而直接 访问该元素。 观…

python数据分析--- ch12-13 python参数估计与假设检验

python数据分析--- ch12-13 python参数估计与假设检验 1. Ch12--python 参数估计1.1 参数估计与置信区间的含义及函数版1.1.1 参数估计与置信区间的含义1.1.2 参数估计函数版1.1.3 参数估计函数版 1.2 Python单正态总体均值区间估计1.2.1 方差 σ 2 \sigma^2 σ2已知1.2.2 方差…