Neta 网络框架技术内幕 - 协议栈
Neta 是一个帮助用户轻松开发高性能和高可扩展网络应用程序的网络应用框架。它提供了一个抽象的异步双工编程模型,并工作在 Java AIO 之上。
协议栈
无论是单工器还是双工器它们都是 Handler,多个 Handler 会像多层夹心饼干一样叠在一起组成 ProtoStack。 下图中展示了在单工器和双工器不同视角下 ProtoStack 的样貌,虽然看上去有点不同但是它们指代的都是同一个东西。
消息在 ProtoStack 中传递遵循如下规则:
上行消息
会被放入 ProtoStack 底部的 RCV_UP 或 Decoder 的 SRC 端点中,事件传播路径自底向上,当抵达顶部后会调转方向重新回到底部。下行消息
会被放入 ProtoStack 顶部的 SND_UP 或 Encoder 的 SRC 端点中,事件传播路径自顶向下。- 无论是
上行消息
还是下行消息
最终的终点都是 ProtoStack 的底部输出节点(SND_DOWN 或 DST)
事件流转
事件按照状态分为:常规、异常两类,它们通常按照如下方式进行流转。
- 常规事件:会通过 Handler 的 onMessage 传播处理。如果 Handler 处理期间发生报错则会转换为异常事件并进入对应的 onError 开启异常传播过程。
- 异常事件:会通过 Handler 的 onError 传播处理。在处理过程中可以通过 ProtoExceptionHolder 的 clear 方法清除异常状态使其恢复常规事件传播过程。
流转控制
流转控制是指事件在一个方向上传播过程中,当一个 Handler 执行完毕后决定下一个 Handler 是谁的过程。 通常情况使用的都是顺序执行,这就是常见的 Pipeline 结构。
在 Neta 中包含顺序在内一共提供了 8 种不同的行为模式,无论事件的状态是常规还是异常都可以使用它们。
public ProtoStack onMessage(PipeContext context, ProtoRcvQueue<ByteBuf> src, ProtoSndQueue<String> dst) { ... return ProtoStack.Next; // <--- keep execution sequence }
下面为不同流转控制的行为方式
Next
- 表示当 Handler 执行后会按照预定的顺序执行下一个 Handler。
Retry 行为
- 重试此方法调用。相当于自身递归调用,使用它可以避免递归的发生这会让 JIT 有更多机会来优化代码。
Again 行为
- 在当前传播方向上当事件传播完毕后,回到这个方向的起点重新开始(如果遇到 Interrupt 那么将不会重新开始)
- 对于上行消息起点是 ProtoStack 底部的 Handler。
- 对于下行消息起点是 ProtoStack 顶部的 Handler。
Back 行为
- 在当前传播方向上当事件传播完毕后,返回当前节点重新开始(如果遇到 Interrupt 那么将不会重新开始)
Restart 行为
- 中断后续的事件传播,并回到当前传播方向的起始位置重新开始。
- 对于上行消息起点是 ProtoStack 底部的 Handler。
- 对于下行消息起点是 ProtoStack 顶部的 Handler。
Skip 行为
- 继续执行但是跳过下一个 Handler。
Exit 行为
- 中断事件传播,并跳过所有 Handler直达末尾。
如果在上行事件传播过程中使用 Exit 行为,那么在进入下行处理的时候会从 Exit 处开始向下传播而非 ProtoStack 的顶部。
对于上行消息 Exit 意味着,结束上行传播阶段进入下行传播阶段。而下行传播阶段会从 Exit 位置开始。
Interrupt 行为
- 中断管道事件传播并抛出错误。
结尾
- 项目地址:https://gitee.com/zycgit/neta
- 在 https://gitee.com/zycgit/neta/issues 递交反馈问题(建议在这里先记录问题方便跟踪)
文章列表

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
PHP 8.3.4 发布
PHP 8.3.4 现已发布,这是一个错误修复版本。具体更新内容包括: Core: 修复 ZTS 持久资源在关闭时崩溃的问题。 Curl: 修复由于 libcurl 8.6.0 中的字符串更改而导致测试失败的问题。 Fileinfo: 修复了错误GH-13344(finfo::buffer(): Failed identify data 0:(null), backport)。 FPM: 修复了错误#75712(php-fpm 中的 getenv 不应读取 $_ENV、$_SERVER)。 GD: 修复了错误GH-12019(检测系统 gd 库中的图像格式)。 MySQLnd: 修复了错误GH-11950([mysqlnd] 修复了如果已设置 CR_SERVER_GONE_ERROR,则不会将 CR_MALFORMED_PACKET 设置为错误)。 PDO: 修复各种 PDORow 错误。 PGSQL: 修复了错误GH-13354(pg_execute/pg_send_query_params/pg_send_execute 通过引用传递空值)。 SPL: 修复了错误GH-13531(...
- 下一篇
OpenAI 的组织形态、决策机制与产品构建
与ChatGPT面世后的疑惑类似,视频生成大模型Sora发布之后,人们依然在问同样的问题:为什么OpenAI能做出这样的创新成果? 要知道,世界上不乏人才密集、有钱、有数据的公司,但能持续做出划时代产品的团队寥寥无几。可以肯定的是,除了OpenAI团队中关键少数的技术远见,这些重量级产品的实现 与他们的组织运作密不可分。 那么,这些人到底是如何被组织起来的,他们有什么样的组织形态和文化? 在Lenny Rachitsky主持的最新播客节目中,OpenAI开发者关系主管Logan Kilpatrick从内部视角深入讲述了OpenAI的运作机制以及决策模式。此外,他还就人们如何在工作和生活中运用ChatGPT、GPTs以及GPT-5前瞻做了介绍。 Logan目前主要支持开发者利用OpenAI的API和ChatGPT进行开发的工作。加入OpenAI之前,Logan曾担任苹果的机器学习工程师,并为NASA的开源政策提供建议。 (以下内容由OneFlow编译发布,转载请联系授权。视频:https://www.youtube.com/watch?v=XkMbkWG2ca4) 来源 |Lenny's...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Hadoop3单机部署,实现最简伪集群
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7设置SWAP分区,小内存服务器的救世主