Aeron:Multi-Destination-Cast

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.mzph.cn/news/854901.shtml

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

相关文章

MAP REDUCE

大数据处理框架概念 定义:由一系列组件构成,负责对数据系统中的数据进行计算。组件: 处理引擎:实际执行数据操作的独立组件。处理框架:包含多个协同工作的组件。 框架与引擎的区别 引擎:单一的&#xf…

NV-Embed论文阅读笔记

这是NVIDIA的一篇论文,LLM通常使用的是GPT的decoder范式作为一个生成模型,文章探讨如何利用这样的decoder生成模型来实现BERT这样的encoder的功能,即提取有效的embedding。现有的方法提取embedding的方式无非是 1 mean pooling; 2…

计算机相关专业是否仍是“万金油”的选择?

亲爱的朋友们: 2024 年高考已然落幕,数百万高三学子站在了人生的重要十字路口,面临着选择大学专业这一关键抉择。在这个节点上,计算机相关专业是否还能被称为“万金油”的选择呢? 相信大家都知道,在最近这几…

经典神经网络(11)VQ-VAE模型及其在MNIST数据集上的应用

经典神经网络(11)VQ-VAE模型及其在MNIST数据集上的应用 我们之前已经了解了PixelCNN模型。 经典神经网络(10)PixelCNN模型、Gated PixelCNN模型及其在MNIST数据集上的应用 今天,我们了解下DeepMind在2017年提出的一种基于离散隐变量(Discrete Latent va…

celery骚操作之把任务写在类中可能造成的问题

celery注册异步函数是模块级别的,也就是同个模块不能有同名函数,比如搞个骚操作,将celery任务写在类中如下(注意这个静态方法是个特殊的装饰器,他实际是个描述器,他必须写在最上面) 实际注册的任务是apps.business.tas…

3D视觉引导机器人提升生产线的自动化水平和智能化程度

随着智能化技术的不断发展,汽车制造企业正积极寻求提升智能化水平的途径。富唯智能的3D视觉引导机器人抓取技术为汽车制造企业提供了一种高效、智能的自动化解决方案。 项目目标 某汽车制造企业希望通过引入智能化技术提升生产线的自动化水平和智能化程度。他们希望…

python错题(3)

round四舍五入 title()把单词首字母大写 all() 函数用于判断给定的可迭代参数 iterable 中的所有元素是否都为 TRUE,如果是返回 True,否则返回 False。 元素除了是 0、空、None、False 外都算 True 。空元组、空列表返回值为True,这里要特…

2023数A题——WLAN网络信道接入机制建模

A题——WLAN网络信道接入机制建模 思路:该题主要考察的WLAN下退避机制建模仿真。 资料获取 问题1: 假设AP发送包的载荷长度为1500Bytes(1Bytes 8bits),PHY头时长为13.6μs,MAC头为30Bytes,MA…

是否可以外链代发?

当然是可以的,代发外链是一种有效的提升网站SEO排名和流量的方法。通过在高质量的网站上发布包含你网站链接的内容,可以提高你网站的权重和可信度。而在所有代发外链的方式中,GPB外链无疑是最好的选择。 GPB外链,每一条GPB外链都是…

【UE4】角色御剑飞行的蓝图实现

沉沉更鼓急,渐渐人声绝 吹灯窗更明,月照一天雪 UE4简单的实现御剑飞行的功能 契子✨ 所谓的御剑飞行的原理就跟 《御板》 飞行的原理差不多,不过是在人物脚上插把剑在飞行的时候显示出来罢了。简单来讲就是只要渲染做的足够牛,土鸡…

App上架和推广前的准备

众所周知,App推广的第一步是上架各大应用下载市场,然后才是其他推广渠道。所以本文主要分两部分,第一部分主要介绍的是上架各大应用市场方面的准备,第二部分主要介绍的是其他渠道推广方面的准备。 一、App上架前的准备 1.1 上架…

Servlet基础(续集2)

HttpServletResponse web服务器接收到客户端的http的请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,代表响应的一个HttpServletResponse 如果要获取客户端请求过来的参数:找HttpServletRequest如果要给客户端…

【前端面试】二叉树递归模板和题解

递归模板和步骤 递归题目的通用步骤递归模板总结1. 树的遍历(DFS)2. 二叉树的最大深度3. 二叉树的最近公共祖先 递归题目的记忆技巧 递归题目的通用步骤 明确递归函数的功能:确定递归函数的输入参数和返回值,明确函数的功能。基准…

如何在本地部署ChatTTS? 完美部署 简单几步 cpu gpu cuda

前言 最近,24-05-27号,github上出现了一个新项目,ChatTTS。该项目提供了一个文本转语音(Text To Speech)的开源方案,同时支持中文和英文。在官网的演示视频中,可以看到合成效果高度接近真人。 到目前(06-04)为止,已经有18.3k的star。 那我们就来看看这个模型的基本…

63、上海大学:MSConvNet-多尺度卷积神经网络解码大鼠运动疲劳数据[攒劲的模型来喽]

1、介绍&#xff1a; 文章&#xff1a;<A multiscale convolutional neural network based on time-frequency features for decoding rat exercise fatigue LFP >&#xff0c;本文由上海大学于2024.4.8日发表于<Biomedical Signal Processing and Control >&…

语音翻译软件app排名来啦,这些工具让旅游畅通无阻

#这个夏天我们一定要去看海# 出国旅行时&#xff0c;语言障碍常常是最让人头疼的问题之一。 特别是在像缅甸这样英语并不普及的国家&#xff0c;基本的日常交流&#xff0c;比如用餐或问路&#xff0c;都可能成为难题。 然而&#xff0c;随着技术的进步&#xff0c;现在有了…

全功能知识付费小程序源码系统 界面支持万能DIY装修 带完整的安装代码包以及搭建部署教程

系统概述 在当今数字化时代&#xff0c;知识付费已经成为一种重要的商业模式。为了满足市场对于便捷、高效、个性化的知识付费解决方案的需求&#xff0c;小编给大家分享一款全功能知识付费小程序源码系统。这一系统不仅具备界面支持万能 DIY 装修的独特优势&#xff0c;还配备…

游戏开发丨基于PyGame的消消乐小游戏

文章目录 写在前面PyGame消消乐注意事项系列文章写在后面 写在前面 本期内容&#xff1a;基于pygame实现喜羊羊与灰太狼版消消乐小游戏 下载地址&#xff1a;https://download.csdn.net/download/m0_68111267/88700193 实验环境 python3.11及以上pycharmpygame 安装pygame…

Cocos2dlua棋牌Lua解密

点击上方↑↑↑蓝字[协议分析与还原]关注我们 “ 介绍使用libcocos2dlua.so库的游戏的解密分析方法。” Cocos2dlua是一款流行的游戏引擎&#xff0c;常用于开发棋牌游戏。为了保护游戏代码&#xff0c;Cocos2dlua通常会对游戏脚本lua文件进行加密&#xff0c;生成Luac文件&…

电脑已删除的文件在回收站找不到怎么办?数据恢复办法分享!

电脑中的数据已经成为了我们生活和工作的重要部分。无论是珍贵的照片、重要的文档&#xff0c;还是日常的工作文件&#xff0c;我们都希望能够妥善保存很久。 然而&#xff0c;误删除文件的情况时有发生&#xff0c;而当我们急切地打开回收站试图找回这些文件时&#xff0c;却…