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是如何发送以及接受数据的。

相关推荐
吃不胖爹13 分钟前
flutter项目如何打包,创建签名与配置签名
javascript·flutter·架构
尽兴-16 分钟前
Elasticsearch 高可用集群架构:Master 选举、Shard 分配与容灾设计
大数据·elasticsearch·架构·集群·节点·可视化工具·分片
llm大模型算法工程师weng20 分钟前
Palantir:从反恐情报到全球决策操作系统 —— 产品、公司架构与商业化深度解析
微服务·云原生·架构
小超同学你好21 分钟前
Transformer 17. Qwen 1 / Qwen 1.5 架构介绍以及与 Transformer、LLaMA 的对比
人工智能·语言模型·架构·transformer
前端双越老师23 分钟前
AI Agent 的异步任务架构
架构·agent·全栈
Agent产品评测局36 分钟前
集团型企业自动化落地,如何实现多分支统一管控?——企业级智能体架构与选型深度实测
运维·人工智能·ai·chatgpt·架构·自动化
补三补四1 小时前
大语言模型架构技术原理演进
语言模型·架构·transformer
吃不胖爹1 小时前
Flutter 基本架构与使用
javascript·flutter·架构
掘根1 小时前
【微服务即时通讯】入口网关子服务
运维·微服务·架构
英俊潇洒美少年1 小时前
Vue3 vs React18 底层架构深度对比
架构