文章目录
  1. 1. 什么是Media Driver
  2. 2. Media Driver核心组件解析
    1. 2.1. Driver Conductor(驱动协调器)
    2. 2.2. Receiver(接收器)
    3. 2.3. Sender(发送器)
    4. 2.4. Client Conductor(客户端协调器)
  3. 3. Media Driver目录结构
  4. 4. 配置和运行时部署选项
  5. 5. Media Driver线程模式
    1. 5.1. Dedicated模式(适用于线上环境or资源充足的环境中)
    2. 5.2. Shared Network模式(折中场景)
    3. 5.3. Shared模式(适合开发及资源较少场景)
    4. 5.4. 扩展:C Media Driver
    5. 5.5. 获取 C Media Driver
    6. 5.6. 配置 C Media Driver
  6. 6. 下一篇

本文我们重点介绍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/)



版权声明:

原创不易,洗文可耻。除非注明,本博文章均为原创,转载请以链接形式标明本文地址。

文章目录
  1. 1. 什么是Media Driver
  2. 2. Media Driver核心组件解析
    1. 2.1. Driver Conductor(驱动协调器)
    2. 2.2. Receiver(接收器)
    3. 2.3. Sender(发送器)
    4. 2.4. Client Conductor(客户端协调器)
  3. 3. Media Driver目录结构
  4. 4. 配置和运行时部署选项
  5. 5. Media Driver线程模式
    1. 5.1. Dedicated模式(适用于线上环境or资源充足的环境中)
    2. 5.2. Shared Network模式(折中场景)
    3. 5.3. Shared模式(适合开发及资源较少场景)
    4. 5.4. 扩展:C Media Driver
    5. 5.5. 获取 C Media Driver
    6. 5.6. 配置 C Media Driver
  6. 6. 下一篇
Fork me on GitHub