【atis源码详解】【游戏正版授权源码】【月金龙公式源码】流控官网源码_流控官网源码是什么
1.Rocketmq 5.0 任意时间定时消息(RIP-43) 原理详解 & 源码解析
2.免费串口调试助手 开源 C#
3.有没有免费的流控流控上网行为管理系统和软路由系统推荐。
4.移知——ARM教育官方授权培训合作企业
5.PolarDB-X 源码解读(七):私有协议连接的官网官网一生(CN篇)
Rocketmq 5.0 任意时间定时消息(RIP-43) 原理详解 & 源码解析
延迟消息,又称定时消息,源码源码其核心在于消息到达消息队列服务端后不会立即投递,流控流控而是官网官网在特定时间点投递给消费者。这种机制在当前互联网环境中有着广泛的源码源码atis源码详解需求,尤其在电商、流控流控网约车等场景中,官网官网用户下单后可能不会立即付款,源码源码订单也不会一直处于开启状态,流控流控需要一定时间后进行回调,官网官网以关闭订单。源码源码此时,流控流控使用分布式定时任务或消息队列发送延迟消息是官网官网更轻量级的选择。
延迟消息与定时消息在实现效果上相同,源码源码都是指消息在经过一段时间后才会被投递。在RocketMQ 4.x中,仅支持通过设定延迟等级来支持个固定延迟时间。然而,这种方案的局限性在于无法支持任意时间的定时,且最大定时时间仅为2小时,性能也难以满足需求。因此,许多公司开始自研任意时间定时消息,扩展最大定时时长。
在RocketMQ 5.x中,开源了支持任意时间的定时消息。与4.x的延迟消息相比,5.x的定时消息在实现机制上完全不同,互不影响。在5.x客户端中,构造消息时提供了3个API来指定延迟时间或定时时间。
任意时间定时消息的实现存在一些难点,例如任意的定时时间、定时消息的存储和老化、以及大量定时消息的极端情况等。为了解决这些问题,RIP-引入了TimerWheel和TimerLog两个存储文件,以实现任意时间的定时功能。TimerWheel是一个时间轮的抽象,表示投递时间,它保存了2天(默认)内的所有时间窗。TimerLog则是定时消息文件,保存定时消息的索引,以链表结构存储。通过这两个文件,可以有效地实现任意时间的定时功能。
此外,RIP-还设计了定时任务划分和解耦的机制,将定时消息的保存和投递分为多个步骤,每个步骤都由一个服务线程来处理。通过使用生产-消费模式,实现了任务的解耦和流控,确保了系统的稳定性和性能。
在源码解析方面,RIP-中引入了TimerWheel和TimerLog两个文件,以及TimerEnqueueGetService、TimerEnqueuePutService、TimerDequeueGetService、TimerDequeueGetMessageService、TimerDequeuePutMessageService等组件,实现了定时消息的保存和投递功能。
免费串口调试助手 开源 C#
工业控制类软件在Windows平台下,使用C#语言进行开发,既方便又快捷。在工控领域中,串口通讯是一种非常常见的需求。因此,我花费时间开发了一个通用的串口调试助手工具,并将工控调试中常用的功能集成在上面,以方便用户进行调试。源码已经在gitee上开源,界面采用wpf实现,游戏正版授权源码源码地址为:
接下来,我将简单介绍一下已实现的功能。
程序功能主要分为以下四大块:
1. 串口通讯
2. TCP通讯
3. 小工具
4. 支持中英文双语切换
5. 检查版本更新
6. 曲线显示读取的值。
一、串口通讯
串口通讯详细功能:
1. 支持手动刷新串口设备列表。
2. 支持流控。
3. 接收发送编码方式同时支持ASCII和HEX方式。
4. 在ASCII模式下,可设置结束符,如回车换行等。
5. 在HEX模式下,支持自动计算标准ModbusRTU的CRC。
6. 发送支持循环发送。
7. 接收区显示支持显示发送和显示接收,并可设置发送和接收的字符串颜色。
8. 接收区显示支持显示发送和接收的时间,时间格式可自定义。
9. 底部显示串口状态,总接收字节数和总发送字节数。各字节数可手动清零。
. 接收区字符串可一键清空。
. 记录发送历史,支持记录最新的条历史记录。
. 可将接收区显示的字符实时保存到本地txt文档。
. 可将读取到的值以实时曲线的形式显示出来。
二、TCP通讯
TCP通讯详细功能:
1. 支持TCP Client/TCP Server。
2. 在TCP Server模式下,可显示当前连接客户端列表。
3. TCP通讯采取异步方式通讯。
4. 支持串口通讯功能中的3-项。
5. 不支持TCP连接断开的自动侦测。
三、小工具
包含的小工具介绍:
1. 通用校验方法中包含常用的LRC、XOR、CheckSum、FCS、Modbus-CRC等校验的计算。
2. 数据转换包含整数和小数与进制HEX的转换。
3. 与base互转。
4. 数据采集中常用的模拟量与工程量转换计算。
5. ASCII码表。
6. C#颜色对照表。
7. 拾取屏幕颜色。该功能使用鼠标hook实现。通过hook技术可实现拦截或修改键盘鼠标等的操作,有这方面需求的可参考。
四、检查更新
1. 检查更新方式:
利用gitee作为更新检查的服务器,将版本号和下载连接写在gitee项目文件中,实现自动检查更新并提供下载连接的功能。
五、相关开源项目
1. 跨平台(Linux/Windows)串口通讯源码开源连接:
xuyuanbao/BaoYuanSerial: A GUI Serial Debug Tool for Linux/Microsoft Window (github.com)
有没有免费的上网行为管理系统和软路由系统推荐。
路由系统、又称RouterOS,已经是一个非常开源的技术了。不管是在LINUX系统上的,还是在windows系统上的,都很很多这样的开源项目,技术简单,结构也非常单一。而随着时代发展,后期又加上了***和基础的包过滤防火墙,也都是开源成熟的项目。大部分厂家也是在这些项目上修修改改,包装包装打造成一个商业产品销售给用户。(当然产品的商业价值和技术价值也没有啥可比性)。但是近十年来,随着上网行为管理需求的迅猛发展,从网页过滤到协议过滤,以及内网安全的需要。单纯的月金龙公式源码路由系统已经不能满足用户的需要,很多的路由器网关都开始带有上网行为管理和防火墙模块,第二代防火墙(Next
Generation
Firewall)的概念也应运而生。但是真正做到第二代防火墙的厂家不多,很多路由厂商也乱入,但是效果怎么样,各家都有一说。
今天介绍的是国内外几款免费的上网行为管理系统、防火墙和路由系统。以免费的为主,因为是免费的,所以多少有缺憾,要么是功能,要么是授权数。待我慢慢道来。
1. PFsense
一个老牌的opensource的防火墙系统,官网地址大家自己找,软件免费,硬件收费。
系统的特点是路由和防火墙功能比较强大,而且集成了入侵检测、漏洞扫描等模块,当然路由和限速这些基础功能都是妥妥的。缺点是上网行为管理功能比较薄弱,不能进行应用过滤和网址库过滤。众所周知,国外的软件,界面很复杂。照老外的说法,没个degree,都不好意思去配置。
另外,PFsense还有收费培训和服务,也可以直接买他们的硬件,价格还算适中。产品也是开源的,源码都公开了。(语言好像已经有了中文版,但是不确定,我的信息来自他们官网)良心产品,靠服务和硬件生存,没有License限制,也没有功能限制。
2. Routeros
路由系统的先锋了,号称路由系统占有率第一位。出自东欧的小国家,所以价格很低廉,市场上充斥了很多破解版,其实正版价格已经很低廉了(可以低到忽略价格)。
只是不是我们国家本土产品,可能服务跟不上。ROS系统几乎没有什么升级维护的工作,系统很稳定,只要上网方式没有什么革命性的更改,那就一直能用。
ROS的路由功能大概是全世界研究的最彻底的了,缺点就是界面狂复杂,它的配置完全可以在大学开一门功课。在西方和东南亚非常受欢迎,各种技术讨论论坛也异常火爆。就是配置复杂的有点扯蛋了。
总体来说,是个好产品,对于网吧、小区宽带这种宽带运营的网络用着蛮好。缺点是没有网页过滤、应用过滤这些上网行为管理的功能,只有基础防火墙模块。也可以限速,路由功能和***做的很稳定。网管一旦掌握,也是把利器。
3. Sophos
这个是宜昌交友app源码个全球化的产品,大厂家,大品牌。家庭版本是免费的,支持用户。路由、***、防火墙模块,尤其是防御功能、网关杀毒这块做的很好,也有协议过滤模块和网址库过滤。软件和硬件都可以提供。优势还是在杀毒和防火墙。欧洲的安全老厂家,价格不用想,不在天上也在云端。
4. Untangle
十年以上的老产品了。重点是上网行为管理和防火墙、杀毒功能。家庭版本$一年,用户。(别指望家庭版本可以用在企业里,他们号称可以检测到是什么环境在用,一旦违规会停掉了,估计软件里面有什么检测工具啥的)。软件和硬件都可以提供。
不过价格就算对于美国本土用户,也是非常昂贵的。硬件销售是硬件的价格加上软件价格,软件价格那是天上的价格,服务也一般。
产品扎实,各种协议管理,网络安全,路由模式,防火墙模块,杀毒都有。除了价格以外(用户的软件License,一年近刀),对于企业选择全方位专业的上网行为管理网关和下一代防火墙,真的是个好选择。
5. WFilter-NGF
也是十年以上的老产品了,本土研发,走国际路线,国内市场推广能力不强,用户大部分在国外。专门研究网络监控和协议分析。专注上网行为管理功能,在Web过滤和协议过滤等上网行为管理的方面做的很扎实。产品的界面有点类似上面的untangle。缺点是没有网关杀毒和主动防御功能。服务不错,有问必答,还可以远程协助配置。软件和硬件方案都可以提供。他们的公司名字非常有趣,值得一提的是,WFilter还有windows的旁路上网行为管理软件。不想添加硬件的话,是上网行为管理的一个可选方案。价格中等吧,性价比高。用户全功能免费,对于人以内的小企业来说,个人觉得是不二之选。
5. 爱快路由系统
本土产品,软件全免费,靠卖硬件挣钱。免费版本各种坊间传闻都有,就不一一表了。基本的路由功能都有,不过上网行为管理做的比较鸡肋。爱快的tiktok随机播源码系统个人认为比较偏向做局域网无线部署方案。企业管理这块不怎么来事。但是好在系统是免费的,这个比较受欢迎。
6. 国内还有维盟,海蜘蛛,和爱快也都是大同小异,还有一家pandbit,侧重流控的路由系统,就不一一介绍了,仁者见仁。
总结一下,分为“路由系统”和“上网行为管理/防火墙系统”两大系列。如果只是要做路由,那么ROS从性能,稳定性上真的很不错的选择。如果是企业用上网行为管理和下一代防火墙;语言没有问题的话,可以看看untangle和sophos以及WFilter-NGF;追求中文版的话,那么WFilter-NGF一定是个最好的选择。
还有一点要说一下:路由系统,比如ROS差不多是一个一次性软件了,买了就直接用了,几乎不需要升级和更新。但是上网行为管理的“协议过滤”和“网址库过滤”,都是需要升级服务的,这就是为什么很多上网行为管理软件按年收费,国内大品牌的上网行为管理设备后续还要每年收服务费的原因。如果选择上网行为管理产品,一定要考虑后续服务的质量和费用。
移知——ARM教育官方授权培训合作企业
移知作为ARM中国教育官方授权的培训合作企业,在去年已经达成合作协议,正式成为ARM教育官方认证的培训机构。作为IC行业内的佼佼者,ARM芯片架构授权覆盖全球,苹果、联发科、高通等公司的芯片设计都离不开ARM技术。掌握ARM技术,能让你在相关领域成为具有竞争力的专业人士,满足行业需求并发挥重要作用。
移知教育是目前唯一被ARM认证并公布在官网的教育培训机构,作为芯片设计领域的服务平台,移知教育聚焦于芯片设计行业,位于全国集成电路中心重镇——上海张江,能够辐射全国,为准备从事芯片设计的学生提供入行培训,为工程师提供在职提升的课程。成立至今,移知教育已拥有+位讲师,+付费学员,最高人同时在线学习的记录,并获得上万名学员及多个知名企业的认可。
移知教育精心打磨了众多ARM系列课程,每一门课程都经过移知教育创始人、ARM中国资深技术顾问——团长的严格审核,所有课程均获得ARM专业资质评估,并通过系列课程学习,完成并通过测试考核,学员可以获得ARM技术培训认证证书。课程内容涵盖从AMBA入门之APB及AHB总线实战,到AMBA进阶之AXI总线实战,再到AMBA高阶之ACE及CHI总线,直至Armv8-A和Armv9-A处理器架构、Arm CoreSight架构、Arm Cortex-M3 MCU芯片前端设计及软硬件验证、Arm Cortex-M3 MCU芯片UVM验证、Arm Cortex-M3 MCU芯片中端及DFT流程等,满足不同层次的需求。
对于初学者,AMBA入门之APB及AHB总线实战推荐指数为★★★★★,适应人群包括需要从事芯片设计的数字前端和验证工程师以及需要从事FPGA开发的工程师。课程从系统设计的角度帮助大家理解APB和AHB协议,涵盖协议的时钟和时序要求、地址映射机制、总裁机制及性能优化等相关内容,并通过实际项目教会大家如何设计可靠的总线接口。
进阶的AMBA进阶之AXI总线实战推荐指数同样为★★★★★,适应人群包括一致性总线相关工程师、数字芯片设计工程师和数字芯片验证工程师。课程全面解读AXI总线协议,帮助学习者快速定位实际问题,解决面试和项目中的常见难题,并通过案例模块提供AXI接口的视线,理解RTL源代码。
对于高阶学习者,AMBA高阶之ACE及CHI总线推荐指数为★★★★★,适应人群同样包括一致性总线相关工程师、数字芯片设计工程师和数字芯片验证工程师。课程从协议出发,由浅入深系统全面地介绍CHI的协议分层、流控和各项特性,帮助学员深入了解CHI协议。
对于处理器架构爱好者,Armv8-A和Armv9-A处理器架构推荐指数为★★★★★,适应人群包括Armv8-A和Armv9-ASoC架构师、前端设计和验证工程师,以及Armv8-A和Armv9-A SoC芯片的软件开发工程师和相关产品的项目经理、产品经理。课程从基础知识开始,逐步深入,覆盖了Armv8-A和Armv9-A处理器架构的方方面面,帮助大家加深对概念的理解,并提供宝贵的实践经验。
Arm CoreSight架构推荐指数为★★★★★,适应人群包括芯片设计工程师、芯片验证工程师、软件开发工程师和系统架构工程师。课程围绕Cortex-A系列的CoreSight架构,从基本原理讲起,再深入到具体每个组件的行为特征,最后讲到整个CoreSight的子系统设计和搭建,帮助企业工程师清晰理解CoreSight架构。
Arm Cortex-M3 MCU芯片前端设计及软硬件验证推荐指数为★★★★★,适应人群包括在做模块或IP级别的设计、还不了解SoC全芯片设计方法、还不知道SoC全芯片验证方法的学习者。此课程通过入门级别的MCU作为学习起点,让您掌握一个入门级SOC设计的思路和技巧。
Arm Cortex-M3 MCU芯片UVM验证推荐指数为★★★★★,适应人群包括刚接触验证的同学、项目负责人、需要做后仿验证的工程师和验证环境的负责人。课程为具有简单基础的验证工程师,以及想要学习MCU芯片项目验证管理的学员打造,通过理论+实验代码多个维度,让学员掌握先进的MCU验证方法学和验证思路。
Arm Cortex-M3 MCU芯片中端及DFT流程推荐指数为★★★★★,适应人群包括芯片前端设计工程师、芯片中端工程师、芯片DFT工程师和芯片后端工程师。本课程由年+资深工程师带队,结合企业需求精心研发,通过真实的MCU芯片项目,学员可以一起做项目,掌握全芯片的代码质量检查、综合、一致性检查和DFT流程,以及实际项目中端流程中出现的问题及调试方法。
还有更多体验课及公开课等你加入,移知教育提供名师汇集、教学质量与学习效果保证的课程体系,讲师团队来自行业一线大公司及研究机构,拥有年以上从业经验,知识领域涵盖了IC行业从SOC架构到IP生态,以及IC设计的前端和后端,可测试性设计(DFT),固件系统等,保证课程的高质与实用性。此外,移知教育还拥有一支强大的IT团队,确保线上直播系统的稳定运行及自主研发的直播系统、EDA云实训环境等技术支持。
PolarDB-X 源码解读(七):私有协议连接的一生(CN篇)
通过前文的介绍,大家基本了解了一条SQL在polardbx-sql中的解析和执行流程。由于polardbx-sql是无状态的计算节点,真正数据需要从存储节点传输到计算节点,这部分工作由私有协议完成。本文将详细介绍从发送请求到存储节点,接收返回数据的完整流程,重点在于私有协议连接的生命周期和关键代码解析。
概述
为了提高数据节点本地计算能力,同时减少网络数据传输量,计算节点会尽可能下推计算内容。一个逻辑表可能需要多个物理分片,因此计算节点与存储节点的请求会话数量会随着分片数增加而增加。传统MySQL协议+连接池架构已不能满足PolarDB-X的需求,因此私有协议在这一需求场景下应运而生。
如图所示,私有协议采用连接与会话分离的RPC协议设计理念,支持多个会话在同一个TCP通道中并行运行,具备流控机制、全双工响应式工作模式和高吞吐、可扩展等特性。
更多关于私有协议解决上述问题的设计详情,可以参考《PolarDB-X私有协议设计》一文。本文主要从代码层面详细描述私有协议的工作流程。
我们将从计算节点和存储节点两个角度完整解析私有协议连接的生命周期。篇幅限制,本文仅关注计算节点上私有协议的处理,存储节点部分将在后续文章中详细说明。
计算节点
计算节点作为私有协议的客户端,负责发送下推请求,并接收返回的数据。
网络层框架
PolarDB-X私有协议网络层采用定制化Reactor框架实现,基于Java的NIO,改进自polardbx-sql中的Reactor框架。网络层初始化时,设置CPU核心数的2倍(上限为)作为NIOProcessor,每个Reactor使用独立的堆外内存池作为收发包缓冲,总缓冲内存大小限制为堆内存大小的%。
NIO接收的包直接调用注册的处理函数,发送数据仅写入send buf,网络写入由单独线程完成。线程优先写入TCP send buf,当无法写入时,注册OP_WRITE事件等待可写后再写入剩余内容。
数据包的编码和解码在NIOClient中实现。为实现最佳性能,解包流程直接在堆外内存上进行,使用protobuf对流直接解析,将结果放入堆内。堆外内存被切分为KB chunk,每个Reactor独占一个chunk,连续解析和复用,最大化接收、解析效率。对于特大包,额外构造堆内大buffer接收和解析,回退标志在定时任务中重置,连续s无超大包时释放堆内内存,恢复高性能堆外KB buffer接收。
请求发送集成在NIOClient中,writer优先尝试写入发送缓冲队列尾部的buffer,不足时新申请buffer填充并追加到队尾。buffer来自预分配的堆外缓冲池,超过chunk大小时分配堆内buf进行序列化。
同时,NIOClient负责TCP连接的建立和断开资源释放,作为独立的底层网络资源管理实现。
连接及会话
网络层之后,我们聚焦连接与会话分离的具体实现。通过剥离连接及收发包的具体实现,连接和会话的管理变得更加清晰简洁。
首先,一个TCP连接的逻辑抽象结构在XClient中实现,为避免误解,取名为client与JDBC中的Connection区别。该类管理TCP连接和并行运行的会话,负责TCP完整生命周期的管理、认证鉴权,并维护公共信息。其中,workingSessionMap记录了连接上并行运行的所有会话映射关系,可快速通过会话ID找到对应的会话抽象结构XSession。
XSession提供了所有会话相关的请求函数和信息存储,包括执行计划请求、SQL查询请求、SQL更新请求、TSO请求、会话变量处理、数据包处理及异步唤醒等。
连接池及全局单例管理器
为了提高性能,TCP连接和会话的复用必不可少。由于连接和会话的解绑,连接池不仅缓存了到计算节点的TCP连接,也缓存了到计算节点的会话。
XClientPool管理到一个存储节点的连接池,通过IP,端口,用户名三元组唯一确定目标存储节点,同时存储该节点的全部TCP连接(XClient)和建立的会话(XSession)。
XClientPool实现存储节点会话获取,对应JDBC接口中的getConnection,同时实现连接和会话生命周期管理、连接探活、会话预分配等功能。实现单个存储节点连接池后,XConnectionManager维护目标存储节点三元组到实例连接池的映射,管理定时任务线程池,实现定时探活、会话&连接最长生命控制以及连接池预热等功能。
JDBC兼容层
新的SQL协议层对上层使用者要求较高,为了提高开发效率,私有协议提供兼容JDBC的使用方法,实现从JDBC平滑切换至私有协议,并支持协议热切换。
JDBC兼容层代码目录在compatible目录下,Connection继承在XConnection文件中。提供包括DataSource、Connection、Statement、PreparedStatement、ResultSet、ResultSetMetaData在内的大部分常用接口函数实现,不支持的函数会明确抛出异常避免误用。
整体关系
至此,私有协议计算节点端的大部分结构已说明完成。给出一个整体的关系图。
私有协议连接的一生(CN视角)
了解了私有协议各层实现后,我们以发到存储节点的请求为例,完整梳理执行流程。绕开计算节点复杂流程,直接运行代码示例(注:需将com.alibaba.polardbx.rpc.XConfig#GALAXY_X_PROTOCOL设置为true)。
直接运行playground看到预期的select 1的结果。接下来,我们深入跟踪说明。
数据源初始化
要使用私有协议,需要初始化对应存储节点的XDataSource。构造过程中,XDataSource会到XConnectionManager注册新的实例连接池,已存在的连接池引用计数加一。
获取Connection
当需要执行查询时,首先获取会话。无论是显式开启事务还是使用auto commit事务,会话都是执行请求的最小上下文。通过XDataSource的getConnection方法获取到对应存储节点的会话。XDataSource根据存储的IP,端口,用户名三元组查找到XConnectionManager中的连接池,在最高并发检查后,会话获取逻辑在XClientPool实现。首先尝试在空闲会话池中拿会话,通过重置检查和初始化后返回给调用者。大部分场景下,ConcurrentLinkedQueue提供较好的并发性能。
在代码场景下,数据源刚新建,后台定时任务未运行,流程进入连接创建流程。会有一把大锁锁住连接池,在TCP连接未达上限且没有超时的情况下,快速新建一个XClient占坑。若超限,则进入busy waiting循环。真正的TCP connect(waitChannel)在锁外被调用,首先client以阻塞模式带超时方式connect,然后切换为非阻塞模式,round robin策略注册到NIOProcesser上,返回时,TCP连接已建立。
为了兼顾安全和性能,连接鉴权在TCP建连后只用做一次,会话创建不需要鉴权。鉴权在initClient中完成,发送SESS_AUTHENTICATE_START_VALUE包,后续校验由回调完成。认证采用标准的MySQL认证流程,server端返回challenge值,库名、用户名和加盐hash后的密码返回给MySQL即可完成认证。
至此,到存储节点的TCP连接已建立,创建会话是一个异步流程。在创建新XClient时,XConnection已new好,通过下断点跟进去可看到newXSession流程,分配session id,设置状态为init,将XSession绑定到XConnection上。
最后,XConnection经过初始化(重置auto commit状态)、重置默认DB、默认字符集(lazy操作)和统计信息记录,返回给用户使用。
发送查询请求
拿到初始化好的兼容JDBC的Connection,为了简化流程,直接调用XConnection中的execQuery。XConnection的execQuery包装了XSession的execQuery,执行前执行了设置流式模式。
首先记录调用信息进行统计,进入关键的initForRequest流程。XSession初始化流程lazy,仅分配session id,设置状态为Init,真正创建session时发送SESS_NEW给server,绑定新session和session id。如果session已复用,则状态为Ready。
执行字符集更改的lazy操作,session可能在其他请求中切换字符集,根据目标字符集和当前字符集对比,决定是否发送额外的字符集更改请求。
经过一系列变量设置、lazy DB设置和protobuf包构造,请求发送到存储节点执行。发送后,同步生成XResult负责结果解析,同时XResult按照请求顺序依次拉链表,确保结果与请求一一对应。
请求流水线结构如下图所示,处理完成前序请求后,才能解析后续结果。
接收结果集
请求已发送到存储节点执行,拿到XResult,通过XResult收集查询结果集。XResult与发送请求一一对应,存储节点处理也是在会话上排队进行,不会影响流水线上其他请求的返回,保证流水线正常工作。
首先,查看结果集处理的状态机,主要状态包括获取元数据、获取数据行、获取额外信息等,顺序固定,根据请求类型,部分环节可能被省略。报错处理贯穿整个状态机,任何报错信息都会导致状态机进入错误处理环节。
对于非流式数据读取,请求结束时主动调用finishBlockMode将所有数据读出并缓存到rows中。对于流式执行的情况,结果集状态机消费数据包队列由XResult的next函数推动,内部函数internalFetchOneObject递归调用前序XResult,消费前序请求结果,从数据包队列中消费并推动状态机流转。
对于查询,首先收到RESULTSET_COLUMN_META_DATA包,表示返回数据列定义,一个包表示一列。元数据包后,收到包含数据行的RESULTSET_ROW包,一个包对应一行。数据行传输完成后,server端发送RESULTSET_FETCH_DONE标示数据发送完成。请求结束前,NOTICE包用于告知客户端rows affected等信息。最后,SQL_STMT_EXECUTE_OK包标示请求结束。
至此,完整请求处理完成,控制台应显示查询结果。
总结
本文详细描述了私有协议连接流程中的关键点和关键数据结构,相信通过本文描述,大家掌握了私有协议连接流程的基本点,在调试和修改使用中能够更加得心应手。虽然本文篇幅较长,但实际使用中涉及更多高级特性的使用,如多请求流水线、流控、执行计划传输、chunk结果集传输等。通过本文,我们对私有协议连接流程有了深入理解,为在实际场景中应用提供坚实基础。