3. Aeron发布与订阅

回顾

上一篇文章主要带大家一起阅读了MediaDriver.launch以及Aeron.connect相关源码,今天就带大家一起看下sub和pub相关的源码设计

Demo

ini 复制代码
public static void main(String[] args)
{
    final String channel = "aeron:ipc";
    final String message = "my message";
    final IdleStrategy idle = new SleepingIdleStrategy();
    final UnsafeBuffer unsafeBuffer = new UnsafeBuffer(ByteBuffer.allocate(256));
    try (MediaDriver driver = MediaDriver.launch();
        Aeron aeron = Aeron.connect();
        Subscription sub = aeron.addSubscription(channel, 10);
        Publication pub = aeron.addPublication(channel, 10))
    {
        while (!pub.isConnected())
        {
            idle.idle(); // 简单理解为阻塞即可
        }
        unsafeBuffer.putStringAscii(0, message);
        System.out.println("sending:" + message);
        while (pub.offer(unsafeBuffer) < 0)
        {
            idle.idle();
        }
        FragmentHandler handler = (buffer, offset, length, header) ->
            System.out.println("received:" + buffer.getStringAscii(offset));
        while (sub.poll(handler, 1) <= 0)
        {
            idle.idle();
        }
    }
}

Sub流程

通过上述流程图可以看到,addSub方法其实会把对应的指令写入到cncBytBuffer里,关于cncFile前一篇文章也介绍了,有不懂的可以再去回顾下。

这里把数据写入到cncFile里后,对应的命令又是谁来处理的呢?答案是:DriverConductor。 DriverConductor通过clientCommandAdapter来处理具体的命令,对应的流程如图:

这里sub有三种类型,ipcSub,spySub,netSub,分别对应进程间sub,本地mock,以及网络sub。 这里可以看到,sub通过完成后,会发送"ON_SUBSCRIPTION_READY"消息,表示当前订阅动作已经完成,ready消息在哪里接受的呢?答案是在awaitRespons方法里,会阻塞等待对应的ready消息 awaitRespons处理流程如下:

最终是在DriverEventsAdapter的onMessage方法里处理ready消息。

这其实就是aeron源码读起来比较困难的地方,并不是传统的a调用b,b调用c,很多地方都是异步的,因此,大家在阅读相关源码的时候,一定不要着急。

Pub流程

addPub方法最终也是把对应的pub指令写入到对应的cncFile里,同样,也是DriverConductor来处理对应的pub指令,对应的流程图如下: 这里pub有两种类型,ipcPub,netPub,分别对应进程间pub和网络pub,对应的ready消息处理和sub一样,也是在DriverEventsAdapter里来处理

小结

本篇文章依然是从最开始的Demo入口,分别分析了sub和pub相关流程,下一篇将会带大家一起看下aeron是如何发送以及接受数据的。

相关推荐
光影少年1 小时前
RN 架构:JS层、原生桥接层、原生渲染层 通信原理
开发语言·javascript·架构
凉、介1 小时前
ARMv8 架构下的刷 Cache 操作
c语言·笔记·学习·架构·嵌入式·arm
梦帮科技2 小时前
基于EVM架构的Web3音频确权与RNS Token智能合约设计深度解析
人工智能·python·架构·web3·区块链·音视频·智能合约
阿耶同学2 小时前
🚀 Agentic RAG:从"检索增强生成"到"智能体驱动的检索增强生成",RAG 的下一个范式
程序员·架构
KaMeidebaby2 小时前
卡梅德生物技术快报|实操手册:CXCL4 蛋白原核表达全套工艺,两步层析去除蛋白多聚体附完整电泳数据
人工智能·算法·机器学习·架构·spark
mingo_敏3 小时前
大模型Model Architecture模型架构:从Transformer到MoE,架构决定AI上限
人工智能·架构·transformer
weixin_400005603 小时前
Vision-Language-Action:LMDrive项目架构与核心算法组件
人工智能·深度学习·算法·机器学习·架构·自动驾驶
小和尚同志4 小时前
types.ts:设计理念在代码中的第一个载体
架构·领域驱动设计
会周易的程序员16 小时前
microLog 的本地日志读取接口 log_reader — 本地日志文件读取工具开发指南
linux·物联网·架构·嵌入式·日志·iot·aiot
无心水17 小时前
【全域智能营销实战】2、Spring AI 模块化架构深度解读:从 1.0 到 2.0 的演进与最佳实践
人工智能·spring·架构·harness·顶尖架构师·全域智能营销·harmess