
消息队列后端通信【免费下载链接】aeronEfficient reliable UDP unicast, UDP multicast, and IPC message transport项目地址https://gitcode.com/gh_mirrors/ae/aeron点击查看免费下载本指南以 aeron-system-tests/scripts/provisioning/README.md 为核心结合仓库中fabfile.py、RemoteEchoTest与ProvisioningServerMain等源码系统讲解 Aeron 如何通过 Fabric v2 在远程服务器上自动部署aeron-alljar、拉起回显Echo服务并以 JMX 驱动跨主机 UDP 绑定测试。读完本文你将掌握fab五段式命令的完整用法、每个任务的底层实现、JMX 控制通道的工作方式以及排查部署问题的关键点。一、这套脚本要解决什么问题Aeron 的消息传输支持 UDP 单播、UDP 组播与 IPC 三种方式。当需要验证 Aeron 在不同操作系统、不同网络栈Bindings上的真实收发行为时最可靠的手段是跑系统级测试——尤其是让两个主机之间通过真实网络完成数据回环的RemoteEchoTest。aeron-system-tests/scripts/provisioning目录下的脚本正是为此而生它借助 Python 生态的 Fabric 部署工具 v2官方文档见 https://docs.fabfile.org把构建、上传、远程启动服务、执行测试、清理整条链路自动化使开发者只需一条命令即可在远程主机上完成一次完整的绑定测试。整个流程在 README.md 中被归纳为 5 个步骤构建一份aeron-all-version.jar将 jar 拷贝到远程服务器SSH 登录远程服务器启动一个远程资源调配服务provisioning service实例运行RemoteEchoTest停止该服务二、环境要求与运行前提脚本基于Fabric v2其底层依赖 Invoke需要先安装pip install fabric同时还需满足以下前提必须从项目根目录运行README 明确说明 It should be run from the root directory of the project因为脚本内部使用./gradlew、version.txt、aeron-all/build/libs/...等相对项目根目录的路径本机与远程主机之间已配置好 SSH 免密登录Fabric 依赖 SSH 连接执行远程命令远程主机已安装Java并在调用deploy时通过--java-home指明 JDK 目录远程主机的10000 端口可供本机访问——该端口是部署脚本指定的 JMX/RMI 远程管理端口详见下文。三、命令总览README 给出的完整用法如下$ fab -r aeron-system-tests/scripts/provisioning \ -H ip address to run the remote service on stop \ prepare-deploy \ deploy \ --java-homelocation of the java home directory on the remote server \ test \ --test-hostoptional, ip address of the host running RemoteEchoTest \ --aeron-diroptional, path to an already running media driver参数说明参数含义是否必填-r aeron-system-tests/scripts/provisioning指定 Fabric 任务task所在目录即 fabfile.py必填-H ip远程服务器的 IP 地址测试服务将运行在此主机上必填stop先清理远程主机上可能残留的旧服务进程pkill建议prepare-deploy本地构建 jarclean:aeron-all:jar必填deploy --java-home路径上传 jar 并远程启动 provisioning 服务必填test本地执行RemoteEchoTest必填--test-hostip可选运行测试的主机 IP默认自动推断可选--aeron-dir路径可选指向一个已运行的 media driver 目录不填则测试内嵌启动 driver可选可以看到命令将stop、prepare-deploy、deploy、test四个任务串联等价于旧进程清场 → 构建 → 部署 → 测试的完整流水线。每个任务的实现细节如下。四、任务逐层拆解源码级fabfile.py基于 Invoke 的task()装饰器定义了 4 个任务外加一个辅助的version任务。4.1 prepare-deploy本地构建 aeron-all jartask() def prepare_deploy(c): local(./gradlew --consoleverbose clean, env {JAVA_HOME: /home/mike/opt/jdk/jdk8}) local(./gradlew --consoleverbose :aeron-all:jar, env {JAVA_HOME: /home/mike/opt/jdk/jdk8})该任务在本机执行 Gradle Wrapper先clean再构建:aeron-all:jar子模块产物位于aeron-all/build/libs/aeron-all-version.jar。需要注意两点脚本中的JAVA_HOME是作者本机的/home/mike/opt/jdk/jdk8这是硬编码的开发环境路径实际使用时应按本机 JDK 位置修改或改为从环境变量读取jar 的版本号来自仓库根目录的 version.txt当前为1.54.0-SNAPSHOTdeploy任务正是读取该文件确定上传文件名。4.2 version探测远程 Java 主版本deploy内部会先调用{java_home}/bin/java -version再通过parse_version正则从输出首行解析主版本号def parse_version(version_string): g re.search(version \(.*)\\.(.*)\\..*\, version_string) ... if (g.group(1) 1): version int(g.group(2)) # 如 1.8.0_xxx → 8 else: version int(g.group(1)) # 如 17.0.x → 17 return version该逻辑兼容 Java 8 时代的1.8.x命名法与 Java 9 的17.x命名法解析出的版本号决定是否需要在启动命令中追加 JVM 参数见下节。4.3 deploy上传 jar 并远程启动服务task() def deploy(c, java_homeNone, provisioning_hostNone): ... command [ {}/bin/java.format(java_home), -Dcom.sun.management.jmxremote, -Dcom.sun.management.jmxremote.authenticatefalse, -Dcom.sun.management.jmxremote.sslfalse, -Dcom.sun.management.jmxremote.port10000, -Djava.rmi.server.hostname{}.format(provisioning_host), -cp ./provisioning/aeron-all-1.38.0-SNAPSHOT.jar, io.aeron.samples.echo.ProvisioningServerMain, /dev/null ./provisioning/log 21, ] if (8 java_version): command.insert(1, --add-opens java.base/jdk.internal.miscALL-UNNAMED) ... c.run(rm -rf provisioning) c.run(mkdir -p provisioning) c.put(aeron-all/build/libs/aeron-all-{}.jar.format(lines[0]), provisioning/.) c.run( .join(command)) c.run(sleep 2 ; pgrep -f io.aeron.samples.echo.ProvisioningServerMain)deploy的完整动作链为解析远程 Java 版本若主版本 8Java 9 及以上在命令首部插入--add-opens java.base/jdk.internal.miscALL-UNNAMED——这是 Aeron 使用的 Agrona 底层库访问 JDK 内部 API 所需在远程主机的家目录下rm -rf provisioning并重建该目录将本机aeron-all/build/libs/aeron-all-version.jar版本取自 version.txt上传到远程provisioning/.用nohup风格的写法 /dev/null ./provisioning/log 21 在后台启动主类io.aeron.samples.echo.ProvisioningServerMain日志重定向到./provisioning/logsleep 2后通过pgrep -f校验进程确实存活若进程未拉起则该任务报错退出。JMX 远程管理参数是整套远程控制机制的关键含义如下JVM 参数作用-Dcom.sun.management.jmxremote启用 JMX 远程管理-Dcom.sun.management.jmxremote.authenticatefalse关闭认证测试场景-Dcom.sun.management.jmxremote.sslfalse关闭 SSL测试场景-Dcom.sun.management.jmxremote.port10000暴露 RMI 注册端口 10000-Djava.rmi.server.hostnameip指定 RMI 服务对外通告的主机名/IP防止多网卡下地址推断错误⚠️版本一致性提示从当前仓库源码看deploy中上传的 jar 文件名取自version.txt但启动命令里-cp的 jar 名硬编码为aeron-all-1.38.0-SNAPSHOT.jarfabfile.py 第 50 行。若version.txt版本与硬编码值不一致-cp会指向不存在的文件导致服务启动失败实际使用时需保持两者同步。4.4 test在本地运行 RemoteEchoTesttask() def test(c, provisioning_hostNone, test_hostNone, aeron_dirNone): ... command [ ./gradlew, -Daeron.test.system.binding.remote.host{}.format(provisioning_host), --consoleverbose, :aeron-system-test:test, --tests, *RemoteEchoTest, ] if (not test_host is None): command.insert(1, -Daeron.test.system.binding.local.host{}.format(test_host)) if (not aeron_dir is None): command.insert(1, -Daeron.test.system.aeron.dir{}.format(aeron_dir)) local( .join(command))测试任务在本机通过 Gradle 执行:aeron-system-test:test只运行匹配*RemoteEchoTest的用例并通过三个系统属性向测试传递运行参数系统属性默认行为作用aeron.test.system.binding.remote.host必填-H指定远程 provisioning 服务所在主机aeron.test.system.binding.local.host不传则由测试根据远程 IP 自动选择本机网卡本机参与通信的 IPaeron.test.system.aeron.dir不传则测试内嵌启动 MediaDriver复用已运行的 media driver 目录需要说明的是Gradle 侧测试模块的完整任务名是:aeron-system-tests:test见 settings.gradle 中aeron-system-tests模块声明fabfile 中的:aeron-system-test:test与实际模块名存在拼写差异实际运行时建议核对本仓库的 Gradle 模块名。4.5 stop清理远程服务task() def stop(c): c.run(pkill -f io.aeron.samples.echo.ProvisioningServerMain, warnTrue)用pkill -f精确匹配进程命令行中包含主类名io.aeron.samples.echo.ProvisioningServerMain的进程warnTrue表示即使没有匹配到进程如首次运行也不视为失败。该任务通常在deploy之前执行确保不会与上一次遗留的服务进程冲突。五、远程服务端ProvisioningServerMain 剖析远程主机上启动的ProvisioningServerMain位于 aeron-samples/src/main/java/io/aeron/samples/echo/ProvisioningServerMain.java它同时扮演三个角色内嵌 MediaDriver若未设置aeron.dir系统属性则调用MediaDriver.launchEmbedded()在远程主机内嵌启动驱动并把 driver 目录传给 Aeron 客户端Aeron 客户端Aeron.connect(context)连接本地 driverJMX 服务端通过StandardMBean(provisioning, ProvisioningMBean.class)将 Provisioning 注册到平台 MBean ServerObjectName 为io.aeron:typeProvisioning,nametesting常量见 ProvisioningConstants.java。服务主体是一个 Agrona AgentroleName为EchoProvisioningServer其doWork()每次轮询做两件事pollProvisioningQueue()消费ManyToOneConcurrentArrayQueueProvisioningMessage中的控制消息CreateEchoPair/RemoveAllEchoPairspollEchoPairs()对每个已创建的EchoPair调用poll()完成收到请求消息 → 原样回写的回环转发。createEchoPair(correlationId, subChannel, subStreamId, pubChannel, pubStreamId)是 JMX 暴露的核心操作它会为请求通道创建Subscription、为响应通道创建ConcurrentPublication并将二者封装为EchoPair同时为每个 pair 注册EchoMonitorMBeanObjectName 形如io.aeron:typeEchoPair,namecorrelationId用于上报getFragmentCount()等监控指标。六、客户端RemoteEchoTest 如何与远程服务协作测试类位于 aeron-system-tests/src/test/java/io/aeron/RemoteEchoTest.java标注了BindingsTest该注解定义于 aeron-test-support/src/main/java/io/aeron/test/BindingsTest.java说明它属于专门验证网络绑定行为的系统测试。beforeAll阶段的连接策略体现了整个机制的优雅之处若设置了aeron.test.system.binding.remote.host即远程部署模式测试通过如下 JMX URL 连接远程服务service:jmx:rmi:///jndi/rmi://remoteHost:10000/jmxrmi并通过JMX.newMBeanProxy获得ProvisioningMBean与EchoMonitorMBean的本地代理若未设置远程主机纯本地开发场景则直接在当前 JVM 内ProvisioningServerMain.launch(...)并连接平台 MBean Server测试仍可完整运行——这为不依赖远程环境的日常验证提供了便利。测试包含两个用例shouldHandleSingleUnicastEchoPair10 秒超时构建一对 UDP 单播通道请求端点为remoteHost:24324、响应端点为localHost:24325stream id 分别为 1001/1002通过 JMX 调用createEchoPair(1, ...)创建回环对随后本机向远程发布随机数据并订阅回传数据最终校验EchoMonitorMBean.getFragmentCount() 0且收发内容完全一致shouldHandleTenUnicastEchoPairs20 秒超时循环创建 10 对 echo pair请求端口 24300–24309、响应端口 24400–24409并发跑完同样的随机数据回环校验用于验证多通道并发下的可靠性。测试使用 1 MiB 随机源数据SOURCE_DATA_LENGTH 1024 * 1024通过Publication.offer按随机长度分片发送、Subscription.poll收取并比对且所有通道都显式设置了rejoin(false)、linger(0)、termLength(1 16)保证通道生命周期可控、资源可回收。七、与 CMake 测试体系的关联除 Fabric 脚本外这套系统测试也可由 CMake 驱动运行。在 aeron-system-tests/CMakeLists.txt 中当开启AERON_SYSTEM_TESTS时会注册名为java_system_tests_c_media_driver的测试目标它通过 Gradle Wrapper 执行:aeron-system-tests:cleanTest与:aeron-system-tests:test并通过-Daeron.test.system.aeronmd.path传入 C 语言版 Media Driver 的可执行文件路径验证 Java 客户端与 C driver 的组合。这也解释了为何test任务中的--aeron-dir参数同样支持指向已运行的 media driver。八、实操注意事项JAVA_HOME 硬编码prepare_deploy中JAVA_HOME写死为作者本机路径实际使用请改为本机 JDK 8 及以上版本路径远程 JDK 必须 8deploy会解析远程 Java 版本Java 9 会自动追加--add-opensJava 8 则无需jar 版本一致性version.txt中的版本号决定上传文件名而-cp中的 jar 名在 fabfile 中是硬编码的两者不一致会导致远程启动失败防火墙/安全组确保本机能访问远程 10000 端口JMX/RMI 注册否则RemoteEchoTest的JMXConnectorFactory.connect会连接超时SSH 免密Fabric 通过 SSH 执行远程命令需提前配置密钥认证复用外部 driver若远程已运行独立的 MediaDriver可先设置aeron.dir再启动ProvisioningServerMain其launch逻辑只在未设置该属性时才内嵌启动 driver端口占用测试用例使用 24300–24325 区间的固定端口若与其他进程冲突需调整通道配置。九、相关文件索引README本文依据Fabric 任务实现RemoteEchoTest 测试类远程服务主类Provisioning 核心逻辑JMX 常量定义版本文件系统测试的 CMake 集成这套脚本的价值在于把跨主机绑定验证从手工操作手动构建、scp、ssh 启动、跑测试、kill 进程压缩为一条fab命令同时通过 JMX 控制通道把远程服务的生命周期与本地测试的执行过程解耦——无论是 CI 流水线中多主机绑定矩阵验证还是本地临时搭建跨机回环环境都能直接复用。赞分享消息队列后端通信【免费下载链接】aeronEfficient reliable UDP unicast, UDP multicast, and IPC message transport项目地址https://gitcode.com/gh_mirrors/ae/aeron点击查看免费下载相关推荐xberg 平台支持矩阵深度解析15 种绑定在 7 大平台上的构建覆盖与已知缺口xberg 平台支持矩阵深度解析15 种绑定在 7 大平台上的构建覆盖与已知缺口 导读 xberg 是一个以 Rust 为核心的 polyglot 文档智能项后端AI 应用NLP终极指南利用Fay框架构建智能虚拟导游系统终极指南利用Fay框架构建智能虚拟导游系统 在当今数字旅游时代 智能虚拟导游 、 实时景点查询 和 多模态交互 已成为提升游客体验的关键技术。Fay框架作为Carbanak银行木马模拟计划金融威胁防御测试完整清单Carbanak银行木马模拟计划金融威胁防御测试完整清单 Carbanak银行木马模拟计划是一个基于真实攻击技术的开源威胁模拟方案专为金融机构设计用于测试上一篇SDRPlusPlus配置文件加密工具命令行界面与密钥管理下一篇CrossDesk安全机制全面剖析保障远程连接的数据传输安全创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考