4.Aeron数据发送与接收

回顾

上一篇文章主要带大家一起阅读了添加发布者与添加订阅者命令的执行过程,今天就继续带大家从demo入手,分析发布者发布数据以及订阅者接收数据相关流程

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();
        }
    }
}

pub数据

上面就是发布者发布数据的流程,可以看到,最终是把数据写入到底层的termBuffer里,那么数据是在哪里被真正发送出去的呢?

不知道大家是否还记得分析MediaDriver的时候曾提过Reciver线程与Sender线程,故名思义,一个负责接受数据,一个负责发送数据。

查看send线程执行流程如下:

可以看到Sender线程会遍历当前所有的newWorkPublication,调用起send方法进行数据发送,底层其实是调用nio的相关api进行数据发送。

poll数据

poll数据的流程看起来比较简单,其实就是不断的从对应的buffer里获取数据,然后调用自定义的FragmentHandler进行数据的解析,那对应的buffer里的数据是从哪里获取的呢?答案当然是MediaDriver里的Receiver线程做的,其处理流程如下:

可以看到底层其实也是通过nio的相关方法进行数据获取。

小结

本篇文章主要带大家一起阅读了下Aeron的数据发送和接收相关流程,aeron的内部很多机制,都是基于发布与订阅功能实现的,因此,理解相关流程还是很重要的,后面将会为大家代码AeronArchive与replay相关的流程分析。

相关推荐
SmartBrain2 分钟前
AI算法工程师面试:大模型和智能体知识(含答案)
人工智能·算法·语言模型·架构·aigc
2501_9371931412 分钟前
TV 电视影视大全:全终端流畅观影技术解析
android·源码·源代码管理·机顶盒
Tadas-Gao1 小时前
大模型幻觉治理新范式:SCA与[PAUSE]注入技术的深度解析与创新设计
人工智能·深度学习·机器学习·架构·大模型·llm
PKUMOD1 小时前
论文导读 | 在长上下文及复杂任务中的递归式语言模型架构
人工智能·语言模型·架构
梦想的旅途21 小时前
Python 开发企微第三方 API:RPA 模式下外部群主动调用实现
架构·企业微信·rpa
梦想的旅途21 小时前
RPA 架构下的企微非官方 API:外部群主动调用的技术实现与优化
架构·企业微信·rpa
查无此人byebye2 小时前
阿里开源Wan2.2模型全面解析:MoE架构加持,电影级视频生成触手可及
人工智能·pytorch·python·深度学习·架构·开源·音视频
汪碧康2 小时前
一文讲解kubernetes的gateway Api的功能、架构、部署、管理及使用
云原生·容器·架构·kubernetes·gateway·kubelet·xkube
Blossom.1182 小时前
从单点工具到智能流水线:企业级多智能体AI开发工作流架构实战
人工智能·笔记·python·深度学习·神经网络·架构·whisper
梵得儿SHI2 小时前
实战项目落地:微服务拆分原则(DDD 思想落地,用户 / 订单 / 商品 / 支付服务拆分实战)
spring cloud·微服务·云原生·架构·微服务拆分·ddd方法论·分布式数据一致性