Aeron CookBook学习之路-MediaDriver概览
本文我们重点介绍Aeron核心组件中的Media Driver(媒体驱动)。、
在继续之前,读者应该熟悉代理和空闲策略部分。由于我们是按照顺序进行学习,因此关于代理与空闲策略(Agents & Idle Strategies),将在下一篇文章讲解。
什么是Media Driver
Media Driver (媒体驱动程序) 组件负责管理通过UDP 或 IPC(这两种方式我们成为Media)发送和接收数据,用于任何活动的发布和/或订阅场景。
Media Driver很灵活,它可以通过修改配置以适应大多数场景,包括但不限于:具有很小延迟的高性能场景,乃至对资源要求极为宽松的低资源环境。
虽然Media Driver在概念上类似于分布式消息代理(消息队列的broker,比如kafka、RocketMQ的broker组件),但它缺少一些broker所具备的功能。 因此最好将 Aeron 的Media Driver与消息代理broker区别对待(但是可以类比进行理解)。
下图显示了构成嵌入在应用程序中的Media Driver的核心组件。
图
可以看到,发布与订阅均借助Media Driver实现,而Media Driver之间通过Media进行通讯(UDP或者IPC)
Media Driver核心组件解析
Driver Conductor(驱动协调器)
Driver Conductor 接受来自 Aeron 客户端内发布者和订阅者的命令,并协调Media Driver的操作。此外,Driver Conductor 还负责名字解析任务(类比域名解析);
Receiver(接收器)
Receiver管理连接Media Driver的所有数据接收过程。数据传输轮询器(Data Transport Poller)接收 UDP 数据,并使用 Java NIO 与操作系统的网络栈进行交互。
除了从媒体(IPC/UDP)接收数据外,Receiver还管理接收到的images(快照),根据需要发送 NAK 和状态消息。
Sender(发送器)
发送者管理媒体(IPC/UDP)上的数据传输。
Client Conductor(客户端协调器)
Client Conductor负责与Driver Conductor进行通信。
Media Driver目录结构
对于生产环境而言,Media Driver目录文件夹应位于 \dev\shm 路径下。 您需要确保文件系统有足够的存储空间来存储所有镜像(images)和发布内容。
有关更多详细信息,请参阅 发布和订阅 (https://aeroncookbook.com/aeron/publications-subscriptions/#implications-on-devshm)。
图
上图中展示了一个Media Driver文件夹,其中打开了一个 IPC 发布内容。 Media Driver文件夹包含以下内容:
- blank.template:它是一个空的日志缓冲区文件,对于一个新的发布过程具备复制支持
- cnc.dat: 这是在 Aeron 客户端和Media Driver之间共享的 命令-控制内存映射文件。 同时它也是 AeronStat 读取的 Aeron 计数器的所在位置。
- images (文件夹) :此文件夹包含所有远程发布的打开镜像(image)
- loss-report.dat:该文件存储了 Aeron 丢包的所有详细信息。 对于了解一段时间内的网络行为很有用。 LossStat 工具用于读取它的内容。
- Publications(文件夹):此文件夹包含所有打开的发布日志缓冲区。
配置和运行时部署选项
Media Driver可以嵌入在进程中运行或在进程外运行。 当进程用完时,您可以使用 Java 或 C 版本的Media Driver。
除了Media Driver,在 Aeron源代码中还发现了另外两个变体:
- LowLatencyMediaDriver:在示例文件夹中可以找到,它使用低延迟的最佳设置来设置MediaDriver
- JavaTestMediaDriver:在测试文件夹中可以找到。通过引入损失能力设置MediaDriver
Media Driver线程模式
在Media Driver中选择正确的资源分配,应当考虑进程中可用的资源和性能要求。
如果将超出可用资源的资源过度分配给 Aeron 进程可能对应用程序的稳定性和性能非常不利。(系统资源需要对Aeron进行合理分配)
Dedicated模式(适用于线上环境or资源充足的环境中)
在专用线程模式(ThreadingMode.DEDICATED)下,Media Driver 将使用 3 个线程,每个线程都有特定的空闲策略:
- Sender线程(使用 senderIdleStrategy策略);
- Receiver线程(使用receiverIdleStrategy策略);
- Driver Conductor线程(使用conductorIdleStrategy策略)。
这是默认的线程模式,最好在关注性能且系统有足够资源的场景下使用。
如果要进一步提高性能,请将线程绑定(pin)到特定的 CPU 核心上。
Shared Network模式(折中场景)
运行在Shared Network模式下(ThreadingMode.SHARED_NETWORK) 将线程数减少到两个:
- Sender 和 Receiver 被安排在一个复合代理中( [sender-receiver线程],使用 sharedNetworkIdleStrategy策略);
- Driver Conductor(driver-conductor线程,使用conductorIdleStrategy策略)
Shared模式(适合开发及资源较少场景)
运行在共享模式 (ThreadingMode.SHARED) 下,将线程数减少到一个。
复合代理托管了 Sender、Receiver 和 Conductor 代理。
这可以看作是线程dump中的 [sender-receiver-driver-conductor]线程,并利用了 Media Driver Context 中定义的 sharedIdleStrategy策略。 这最适合开发或运行在可用资源较少的运行环境中。
扩展:C Media Driver
通过用 C 语言编写Media Driver,Real Logic 可以尽可能多地控制Media Driver运行的硬件和操作系统,并且它允许团队从 Java 虚拟机和垃圾收集器中删除对性能敏感的组件。
从 Java 方面来看,使用 C Media Driver通常是透明的。 开发者所需要做的就是将自己的 Aeron 客户端指向 C Media Driver 的文件夹,理论上,一切都会像以前一样工作。
与在独立模式下运行的 Java Media Driver一样,如果多个 Aeron 客户端都在同一台物理机器上,C Media Driver可以与它们一起运行。
获取 C Media Driver
C 媒体驱动程序必须从源代码构建(因操作系统而异):
https://aeroncookbook.com/cookbook-content/build-macos-cpp-driver/
https://aeroncookbook.com/cookbook-content/build-ubuntu-cpp-driver/
https://aeroncookbook.com/cookbook-content/build-windows-cpp-driver/
构建完成会同时构建几个 C语言 版本的 Aeron Sample Tools(AeronStat、ErrorStat、LossStat)。
配置 C Media Driver
默认情况下,C 媒体驱动程序运行需要以下条件:
- 具有繁忙自旋线程(busy spin thread)优先级的三个线程(sender, receiver, driver conductor线程)
- 十秒驱动程序超时
- 16mb缓冲区长度。
如果需要覆盖设置,通常有两个选择:
- 从文件或 URL 加载参数
- 使用 -D 参数(与 Java 中相同)通过命令行传入参数,将 .更换为 _。例如
- -Daeron.driver.timeout=30000 (C版本的支持点号)
- -Daeron_driver_timeout=30000(java版本的传参不支持点号)
下一篇
代理与空闲策略 (https://aeroncookbook.com/agrona/agents-idle-strategies/)
版权声明:
原创不易,洗文可耻。除非注明,本博文章均为原创,转载请以链接形式标明本文地址。