一种面向多进程异步并发通讯方法

来源 :电脑知识与技术 | 被引量 : 0次 | 上传用户:lpcumt
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘要:为了应对民航业务扩展、业务复杂度增加的趋势,分析了当前常见的多线程通讯方式,提出一种基于共享内存的多进程纯异步通信方法。建立快速、可靠、可扩展、可独立部署并完全托管的消息队列服务,在保障传输可靠性、数据一致性的情况下,降低子系统间的耦合度,实现系统间的高效通信。通过部署少量进程就可以提供系统的吞吐量,降低交易响应时间。
  关键词:多进程;异步;并发;通讯
  中图分类号:TP319      文献标识码:A
  文章编号:1009-3044(2021)27-0064-04
  1 背景
  随着民航业务板块的扩张、业务服务的增加、互联网技术的发展,企业系统平台逐步根据服务内容由集中的单体系统拆分成多个子业务系统。相较于集中式单体系统中模块间的数据交互,子业务系统间交互更为复杂, 在业务处理过程中,往往需要各业务系统之间分工合作,访问各子系统对外开放接口获取信息[1]。因此,对系统数据传输的吞吐量及可靠性也有了更高的要求。
  2 多进程通讯现状
  大部分的业务系统为保障数据的一致性,满足各业务系统间合作的需求,子系统间通常通过RPC同步调用服务,但在某些场景中,RPC同步调用的响应时间较长,造成资源的浪费,系统吞吐量下降。以AV航信查询系统为例:当用户要查询北京到洛杉矶的航班时,AV系统需要同时访问Delta、Southwest航空公司的航班信息,整合后返回给调用方。如图所示:
  假设业务处理时间为0秒,Delta响应时间为2秒,Southwest响应为3秒。那么,一个请求的响应时间为5秒。我们系统的最大并发量为3个请求,那么当并发请求数大于3时,剩余的请求只能堆积在消息队列中。其次,3个进程需要花费5秒的时间在等待應答,并且不做任何其他事情。这将导致系统的吞吐量遇到瓶颈,且系统的CPU、内存使用率低。由此可见,RPC服务调用虽然能够满足实时调用的业务场景,但针对上述异步、业务操作复杂的场景,业务系统的性能目标无法满足。
  为了提高吞吐量、降低响应时延,现有技术提出了通过增加进程个数来提高吞吐量的半同步通讯方式。该方式是在上述方案的基础上进行的改进,将两次同步调用变为异步调用[2]。可以同时发送两个请求,再获取应答。
  如上图所示,这种方案的处理时间取决于外部系统的最大响应时间,即3秒。
  然而,这种优化方案依然存在问题。首先,这种方案无法提前预估并发量。高峰期时并发量大,而低峰期时并发量很少。而在低峰期部署大量的处理进程反而会导致资源的浪费[3]。“部署多少进程合适?”的问题依然没有得到解决[4]。其次,进程在等待应答的3秒过程依然无法处理其他请求,意味着其他请求依然需要排队。
  3 多进程异步并发通讯设计
  针对上述现有技术的问题,本文提出一种基于共享内存的多进程纯异步通信方法,抽取进程状态并存储于在传输过程中动态创建的共享内存组件存储中,释放无状态进程的等待时间,建立快速、可靠、可扩展、可独立部署并完全托管的消息队列服务,在保障传输可靠性、数据一致性的情况下,降低子系统间的耦合度,实现系统间的高效通信。一方面部署少量进程即可以增加吞吐量,另一方面在等待异步应答的过程中依然可以响应其他交易请求。
  3.1 系统组成
  面向多进程的纯异步通信装置由服务消费方、异步消息交互服务和服务提供方组成。其中异步消息交互服务分为4个组件,分别是数据接入服务组件、消息队列组件、异步通信进程池和共享内存组件。
  数据接入服务组件:负责接受服务消费方各种形式的并发连接请求,并将请求放到对应的消息队列中。
  消息队列组件:面向流量峰值的处理方案,当消息涌入时,首先将请求或异步应答存放入消息队列中,再根据流量控制策略进行后续处理。
  异步通信进程池:每个进程有一个I/O线程,负责与服务提供方进行直接通信,根据消息中的参数信息,与对应的主服务端或从服务端建立连接、异步发送相关消息,接收服务提供方的应答结果,并存放至消息队列中。
  共享内存组件:共享内存组件在数据交互的过程中动态创建异步交互上下文,根据业务特征存储某组数据交互的上下文,及中间结果。
  3.2 实现原理
  面向多进程的纯异步通信方法在整个交易过程中采用完全异步的方式,没有任何阻塞点。在进程发起异步请求后,进程并不等待,而是继续处理其他请求;当异步应答回来后,再通过读取上下文,恢复现场,继续处理上次交易。
  具体进程处理过程如下图所示:
  步骤1. http接入收到请求后将请求放入消息队列
  步骤2. 进程读取消息队列后,
  1)如当前消息属性为请求,则生成全局交易号,保存原始请求报文,应用需要暂存的kv数据,以及要等待的异步应答个数等上下文数据,发起异步调用,转步骤2。
  2)如当前消息属性为应答,读取上下文。
  ①如果应答未全部接收完毕,则保存上下文,转步骤2
  ②如果应答全部接收完毕,则删除上下文,转步骤3
  步骤3.依据原始请求,及收到的全部异步应答,整合数据,返回消费者。
  注:异步应答回来后,异步通讯线程会将异步应答放入消息队列。
  4 共享内存
  实施方案的关键问题在于共享内存结构如何快速定位,在此选择了hash+链表的方式。此外,由于应用保存上下文的数据长度的不确定性,需要实现基于共享内存的slab内存分配算法。
  4.1 创建共享内存
  进程间通讯采用SysV SHM共享内存/SEM信号机制[5]。其共享内存结构如图6所示。
  1)AsynCtl:记录整个共享内存大小及hash桶偏移量   2)AsynHead:记录每个交易的流水号及原始请求信息
  3)AsynCtx:应用上下文,是一对键值对
  4)AsynData:原始数据
  注:
  BUCKETENTRY为hash桶的大小;
  每个group共用一个sem信号灯。
  4.2 基于共享内存偏移量slab内存分配算法
  AsynHead AsynCtx AsynData均采用slab内存分配算法,本slab内存分配算法实现为slab内存分配算法的偏移量实现。使用偏移量实现的原因在于每个进程attach到共享内存的逻辑地址是不一样的,因此只能采用偏移量的实现。
  多个线程间的内存实施共享时可以采用Slab原则进行管理,Slab原则的思想是将内存切割为多个槽位,属于同一页的内存切割后形成容量相等的槽位,属于不同页的内存块切割后的槽位容量可以相等也可以不相等。切割完成之后采用一个页数组记录不同的内存页所处的地址,使用另一个槽位数据记录属于同一个页面的内存槽位[6]。在寻址时先计算出槽位所属的页,然后到页数组中查找页地址,即目标槽位的基地址,最后在基地址上加上目标槽位的偏移量即可得到目标槽位的内存地址[7]。
  SLAB原则将内存空间按照容量进行分类,例如当程序申请一块容量为100KB的内存块时,内存管理器就从大小为100KB的内存块集合中随机选择一个内存块返回给申请者。当应用程序释放一块100KB大小的内存块时,内存管理器会将这块内存返回到容量为100KB的内存集合中去。当另一个程序申请一块容量为50KB大小的内存块时,内存管理器就从大小为50KB的内存集合中随机选择一个内存块返回给调用者,当程序释放内存时内存管理器也仍然将这块内存返回到50KB的内存集合中去,从而避免了内存碎片的产生。
  头部数据结构汇总了SLAB内存管理机制的基础数据,这些基础数据是内存分配、地址计算等处理的依据,SLAB头部数据结构的伪代码如下所示:
  typedef struct {
  size            min_capacity;     // 內存槽位容量最小值
  size            offset;           // 内存槽位偏移量
  Arr_page        *pgs;             // 页内存块基地址数组
  Arr_page_t      *slot;            // 内存槽位数据
  char            *head;           // 空闲内存块起始地址
  char            *tail;           // 空闲内存块结束地址
   ...
  }slab_head
  初始化过程中,对如下数据进行处理:
  pgs数组:计算pgs数组长度并设置数组成员变量初始数据;
  slot数组:计算slot数组长度并设置数组成员的变量初始数据;
  内存槽位容量最小值:根据配置设置单个内存槽位的最小容量;
  内存槽位偏移量:根据当前页的内存槽位大小设置偏移量[8]。
  当申请一页时,则将pgs数组第一个元素从free链表中分离出去。当调用者申请第二页时,内存分配器将pgs数组的第2、3位置上的元素进行合并,将合并后的页面作为一个整体移出head链表[9]。当需要回收某个内存页时,使用一个链表将所有被回收的页面连接起来,挂载到空闲内存块结束地址,并更新tail指针。
  5 结束语
  本文提出的面向多进程的纯异步通讯方法,通过部署少量进程就可以提供系统的吞吐量,降低交易响应时间。
  1)构建了一个与业务应用组件、三方服务平台完全解耦的、可被托管的消息队列服务。在消息通信的过程中,用户只需关心核心的数据传输流程,而不要求其他需要依赖的应用平台始终可用——接收到返回消息后,即可执行下一组交互,无须等待本次业务的最终结果。
  2)进程的业务处理过程完全采用异步通讯机制,没有阻塞点。系统的吞吐量仅取决于上下文的大小,通过调整上下文空间大小,即可提高系统吞吐量。
  3)提供了消息的并发处理机制。每个进程在发起异步请求后,当前交易流程中断,可继续处理其他交易请求;待异步应答回来后,继续中断的交易。
  4)自动在共享内存中生成“交易上下文”的方式,将状态存储在上下文中,构建了无状态的进程处理模型,解决了由系统拥塞导致的一系列问题。
  参考文献:
  [1] 陶志勇,王如龙,张锦.基于多进程的区域间通信方法[J].计算机系统应用,2013,22(4):174-177.
  [2] Shi J H,Zhang S L,Chang Z G.The security analysis of a threshold proxy quantum signature scheme[J].Science China Physics,Mechanics and Astronomy,2013,56(3):519-523.
  [3] 刘新强,曾兵义.用线程池解决服务器并发请求的方案设计[J].现代电子技术,2011,34(15):141-143.
  [4] 萧毅鸿,周献中,朱亮,等.基于改进层级任务网络规划的Web服务自动组合[J].江苏大学学报(自然科学版),2012,33(1):77-82.
  [5] 李朋辉,严军.多进程间的数据通讯方式的探讨[J].电脑知识与技术,2012,8(8):1821-1823.
  [6] 宋雅琴,郭志川.Nginx Slab算法研究[J].网络新媒体技术,2018,7(2):54-61.
  [7] 王峰,张智金,杨春媚,等.一种多进程并发解算差分服务器系统及其实现方法:CN106095601B[P].2019-08-30.
  [8] 涂海,郭书伟.并发和异步任务处理方法及其设备,CN111131499A[P].2020.
  [9] 王晨,刘学纵.基于系统内核与共享内存的守护进程实现研究[J].工业控制计算机,2020,33(3):115-117,121.
  【通联编辑:谢媛媛】
其他文献
摘要:高校校园网络运行中,计算机网络运维与实际工作质量、效果密切相关。新时期,互联网技术水平不断提高,广泛应用于实际教学工作中。而校园网络运行则直接关系到学校日常教学工作质量与效率,对教学服务效果也有很大的影响。基于此,针对高校计算机网络运维及发展趋势相关知识,本文从以下几方面进行了简单地分析。  关键词:高校计算机;网络运维;发展趋势  中图分类号:TP393 文献标识码:A  文章编号:1
随着教育信息化2.0和VR时代的到来,为落实“教育信息化2.0行动计划”和“中国教育现代化2035”,教育者要抓住新机遇,积极研究、探索、实践、创新教学模式,提升教育信息化水平和教学效果.梳理了VR/AR技术的基本概念和发展历程,介绍了高校VR/AR专业设置,结合作者所在学校基于VR/AR的虚拟现实实验室建设和虚拟现实实验实践教学,分析探讨了VR/AR技术对高校虚拟实验教学的推动作用、教学模式的创新实践,提出了未来基于VR/AR多节点教学模式的研究和发展方向.
摘要:近年来无人车发展迅猛,国家对公共道路上测试的无人车又做了法律法规的限制,因此提高并扩建各地方级测试场的测试场地、设备和测试水平,对于推动自动驾驶技术迭代速度,产业的高速发展都起到了重要的作用,但如何保障试验场内车辆安全地进行测试,该文从场地的软硬件设备保障、突发事件的预案措施和数据安全性三点提出了相应的建议。  关键词:智能网联技术;车辆测试场;安全性  中图分类号:TP3 文献标识码:
摘要:随着5G大规模建设,在NSA/SA双模方式和LTE频段共存的背景下,4G/5G的网络协同互操作优化是网络优化的重要环节,也是提高5G网络指标性能的重要保障。该文从LTE锚点规划原则出发,叙述影响5G NR网络性能和用户感知的NSA/SA双模方式问题,并综述了相关解决策略。  关键词:LTE;NR;协同;互操作  中图分类号:TP311 文献标识码:A  文章编号:1009-3044(2
摘要:随着学术网络平台的文献数量不断增长,快速高效的在众多质量参差不齐的文献中找到适合自己研究领域的高质量文献,对学术研究具有重要的意义。文中首先对传统的PageRank算法的原理、基本思想以及其发展历程进行分析;然后在对比了链接网路与引文网络的相似性和差异性后提出将链接网络中的PageRank算法应用到引文网络中;最后对PageRank算法在引文网络中的应用进行研究分析。研究发现,传统的Page
针对基于OpenCPU的NB-IoT模块上作为兼任主处理器和数据传输功能时具有的内存压力,该文设计一种嵌入式脚本Lua脚本语言实现NB-IoT模块的内存优化方案。通过该方案,利用Lua脚本语言中自动内存管理和增量垃圾回收的特点弥补C语言的短板,从而优化内存空间,节省NB-IoT模块资源的消耗,降低功耗。
摘要:随着时代的进步和科技的发展,油田企业早已改变传统的工作模式,网络管理为现代油田企业工作的主流形式。提高生产效率与劳动效率,提高资源管控率,降低资源浪费、人力成本浪费,则是目前油田企业所追求的目标。但目前我国油田企业网络系统还处于初步发展阶段,相应设施与管理制度存在不成熟,往往会因为油田企业网络出现问题造成不必要的损失。该文将从实际出发,探讨关于油田企业网络维护与优化策略,完善油田企业网络系统
中国电信安徽分公司企业内网不仅承载了内部支撑管理系统和生产系统,而且承载了办公终端.随着互联网技术的快速发展,各种网络病毒和威胁不断涌现,对网络安全防护提出了更高的要求.因此,安徽分公司的企业内网优化改造迫在眉睫.本文从网络结构优化、办公终端安全管理、IP地址管理三个方面提出了改造方案并实施了部署,进一步提升了安徽分公司企业内网的安全性,在电信运营商中具有一定的推广意义.
当前,企业PLM系统知识库存在数据权限维护困难、数据备份困难、数据溯源不清晰等问题,本文提出了运用区块链技术构建PLM系统的知识库模型.首先,分析了目前PLM系统知识库存在的弊端;然后,阐述了区块链技术优势及其应用价值;最后,描述了如何构建基于区块链的PLM系统知识库模型,提升了企业全生命周期管理的效率、产品的可溯源性以及可靠性,为企业产品的研发与生产管理提供信息化支撑.
该文对基于高质量理念的安徽中烟网络规划进行了研究,阐述了面向高质量发展的企业网络规划的原则.围绕安徽中烟企业网络中涉及的广域网、智能园区、数据中心等要素进行了现状分析和研究,在此基础上进行了技术架构初步设计,对安徽中烟及类似企业具有一定的参考价值.