CN115412500B - 支持负载均衡策略的异步通信方法、系统、介质及设备 - Google Patents
支持负载均衡策略的异步通信方法、系统、介质及设备 Download PDFInfo
- Publication number
- CN115412500B CN115412500B CN202210686084.3A CN202210686084A CN115412500B CN 115412500 B CN115412500 B CN 115412500B CN 202210686084 A CN202210686084 A CN 202210686084A CN 115412500 B CN115412500 B CN 115412500B
- Authority
- CN
- China
- Prior art keywords
- event
- layer
- protocol
- processing
- networker
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 102
- 238000004891 communication Methods 0.000 title claims abstract description 64
- 238000012545 processing Methods 0.000 claims abstract description 269
- 230000004044 response Effects 0.000 claims abstract description 91
- 238000004806 packaging method and process Methods 0.000 claims abstract description 27
- 230000006870 function Effects 0.000 claims description 130
- 230000008569 process Effects 0.000 claims description 66
- 230000000903 blocking effect Effects 0.000 claims description 40
- 238000003860 storage Methods 0.000 claims description 13
- 239000002699 waste material Substances 0.000 abstract description 14
- 238000005516 engineering process Methods 0.000 abstract description 6
- 238000013461 design Methods 0.000 description 18
- 230000006855 networking Effects 0.000 description 12
- 238000007726 management method Methods 0.000 description 11
- 238000012544 monitoring process Methods 0.000 description 11
- 230000001360 synchronised effect Effects 0.000 description 7
- 230000001960 triggered effect Effects 0.000 description 6
- 230000009286 beneficial effect Effects 0.000 description 4
- 230000007246 mechanism Effects 0.000 description 4
- 238000005520 cutting process Methods 0.000 description 3
- 238000009826 distribution Methods 0.000 description 3
- 240000002044 Rhizophora apiculata Species 0.000 description 2
- 238000004458 analytical method Methods 0.000 description 2
- 230000002457 bidirectional effect Effects 0.000 description 2
- 230000005540 biological transmission Effects 0.000 description 2
- 230000000977 initiatory effect Effects 0.000 description 2
- 230000003993 interaction Effects 0.000 description 2
- 239000000463 material Substances 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 238000006467 substitution reaction Methods 0.000 description 2
- 238000013459 approach Methods 0.000 description 1
- 230000003139 buffering effect Effects 0.000 description 1
- 238000004364 calculation method Methods 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 238000012217 deletion Methods 0.000 description 1
- 230000037430 deletion Effects 0.000 description 1
- 238000000151 deposition Methods 0.000 description 1
- 238000010586 diagram Methods 0.000 description 1
- 238000005538 encapsulation Methods 0.000 description 1
- 239000012634 fragment Substances 0.000 description 1
- 238000005304 joining Methods 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 230000011664 signaling Effects 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 238000011282 treatment Methods 0.000 description 1
- 239000011800 void material Substances 0.000 description 1
- 230000002618 waking effect Effects 0.000 description 1
Classifications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L47/00—Traffic control in data switching networks
- H04L47/10—Flow control; Congestion control
- H04L47/12—Avoiding congestion; Recovering from congestion
- H04L47/125—Avoiding congestion; Recovering from congestion by balancing the load, e.g. traffic engineering
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L47/00—Traffic control in data switching networks
- H04L47/10—Flow control; Congestion control
- H04L47/20—Traffic policing
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L47/00—Traffic control in data switching networks
- H04L47/70—Admission control; Resource allocation
- H04L47/72—Admission control; Resource allocation using reservation actions during connection setup
- H04L47/726—Reserving resources in multiple paths to be used simultaneously
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L67/00—Network arrangements or protocols for supporting network services or applications
- H04L67/01—Protocols
- H04L67/02—Protocols based on web technology, e.g. hypertext transfer protocol [HTTP]
Landscapes
- Engineering & Computer Science (AREA)
- Computer Networks & Wireless Communication (AREA)
- Signal Processing (AREA)
- Computer And Data Communications (AREA)
Abstract
本发明属于通信技术领域,尤其涉及支持负载均衡策略的异步通信方法、系统、介质及设备。该方法包括:根据文件描述符创建链接,将处理流程包装成外部事件,将外部事件发送至最优networker的第一OS内核层进行事件唤醒,通过最优networker的第一网络栈层以及第一协议处理层对外部事件进行处理,得到HTTP消息,发送至第一业务处理层;创建协议应答实例并发送至所述第一协议处理层中,将所述HTTP消息以及协议应答实例包装成应答外部消息,将应答外部消息发送至事件框架层,事件框架层对应答外部消息进行处理。通过本发明能够达到满足其个性化的网络I/O需求定制,解决传统的网络应用程序的线程资源浪费问题的效果。
Description
技术领域
本发明属于通信技术领域,尤其涉及支持负载均衡策略的异步通信方法、系统、介质及设备。
背景技术
传统的网络通信应用程序中,通常采用的是阻塞式I/O模型。每个线程独自完成一个socket连接的数据读取或者数据写出操作。如果当前socket连接暂时没有数据可读,则线程就阻塞在read/recv操作上;或者网卡写缓冲区满,则线程就阻塞在write/send操作上。而在阻塞的这段时间内,没法将该线程分配给其他的socket连接使用,从而造成线程资源浪费。
当今的网络通信应用程序中,为了解决上述线程资源浪费的问题,大多基于I/O多路复用技术进行网络通信模块的设计。例如,libevent是一个基于I/O多路复用技术的事件处理框架,但并没有实现多线程协同处理的机制。再如,nginx是一个优秀的HTTP和反向代理web服务器,但其网络通信模块属于多进程的I/O多路复用,其抢占连接的处理方式,并不适用于多线程的网络通信应用程序中。尤其是在一个复杂业务系统的网络通信中,例如网络存储领域,很多通信框架本身无法深入的考虑到业务系统的网络I/O需求痛点。
发明内容
本发明所要解决的技术问题是提供支持负载均衡策略的异步通信方法、系统、介质及设备。
本发明解决上述技术问题的技术方案如下:一种支持负载均衡策略的异步通信方法,包括:
步骤1,根据主networker的OS内核层监听到的数据流判断是否调用主networker的事件框架层对所述数据流进行处理,若判断结果为是,则根据所述数据流的文件描述符,在所述事件框架层的事件库中匹配相应的处理流程;
步骤2,在主networker的网络栈层中,根据所述文件描述符创建链接,将所述处理流程包装成外部事件,将所述外部事件以及所述链接发送至最优networker的第一OS内核层进行事件唤醒,通过最优networker的第一网络栈层以及第一协议处理层对从主networker派发的外部事件以及所述链接进行处理,在所述第一协议处理层中将处理结果拼装成HTTP消息,发送至所述最优networker的第一业务处理层,所述最优networker通过负载均衡策略选定;
步骤3,在所述第一业务处理层中,创建协议应答实例并发送至所述第一协议处理层中,通过所述第一网络栈层将所述HTTP消息以及所述协议应答实例包装成应答外部消息,将所述应答外部消息发送至所述事件框架层,所述事件框架层对所述应答外部消息进行处理。
本发明的有益效果是:通过负载均衡策略使得不同使用场景的应用程序,可选择不同的负载均衡策略,从而满足其个性化的网络I/O需求定制,通过将时间包装并由最优networker来处理的方式解决传统的网络应用程序的线程资源浪费问题。
在上述技术方案的基础上,本发明还可以做如下改进。
进一步,所述OS内核层具体包括:
设置I/O事件接口以及等待I/O事件接口。
进一步,所述步骤2具体为:
在所述网络栈层中,根据所述文件描述符建立非阻塞client_socket并分配内存池,在所述内存池中创建协议链接,将所述协议链接与所述非阻塞client_socket关联,对所述协议链接设置数据读取回调函数、数据写出回调函数以及错误通知回调函数,并对所述非阻塞client_socket设置超时时间,将所述协议链接放入所述协议处理层中的协议服务的链接队列中,通过所述负载均衡策略确定所述最优networker,将所述非阻塞client_socket作为参数设置F08,所述F08为启动客户套接字读事件回调函数,通过所述事件框架层,将所述启动客户套接字读事件回调函数包装成所述外部事件,将所述外部事件加入到最优networker的事件库的外部事件队列中,判断所述最优networker的线程是否为当前线程,如果判断结果为是,则向所述的最优networker的第一事件框架层的第一事件库的通知事件写入8字节的数据,所述第一事件框架层执行事件通知处理回调函数,如果判断结果为否,则所述第一网络栈层执行所述启动所述F08,通过预设超时原则判断所述非阻塞client_socket是否超时,若是,则执行所述错误通知回调函数,若否,则执行所述数据读取回调函数,并更新所述非阻塞client_socket的最后访问时刻,所述第一协议处理层执行所述数据读取回调函数,并将处理结果拼装成HTTP消息,发送至所述最优networker的第一业务处理层,所述最优networker通过负载均衡策略选定。
进一步,所述步骤3具体为:
在所述第一业务处理层中,通过消息接收回调函数,直接对所述HTTP消息进行处理,或将所述HTTP消息派发至应用程序自实现线程池进行处理,调用建立协议应答实例接口,在所述第一协议处理层中建立协议应答实例,通过所述第一业务处理层递交所述协议应答实例,所述第一协议处理层对所述协议应答实例以及所述HTTP消息进行封装,得到应答外部消息,所述事件框架层对所述应答外部消息进行处理。
进一步,还包括:
当信号处理器获取退出信号时,所述信号处理器将条件变量的广播通知发送至等待接口,所述业务处理层通过所述等待接口获取所述条件变量的广播通知,并调用所述协议处理层的停止协议服务接口,所述协议处理层依次进行停止协议服务的监听器队列、停止网络栈、释放网络栈以及释放协议服务。
本发明解决上述技术问题的另一种技术方案如下:一种支持负载均衡策略的异步通信系统,包括:
判断模块,用于根据主networker的OS内核层监听到的数据流判断是否调用主networker的事件框架层对所述数据流进行处理,若判断结果为是,则根据所述数据流的文件描述符,在所述事件框架层的事件库中匹配相应的处理流程;
派发模块,用于在主networker的网络栈层中,根据所述文件描述符创建链接,将所述处理流程包装成外部事件,将所述外部事件以及所述链接发送至最优networker的第一OS内核层进行事件唤醒,通过最优networker的第一网络栈层以及第一协议处理层对从主networker派发的外部事件以及所述链接进行处理,在所述第一协议处理层中将处理结果拼装成HTTP消息,发送至所述最优networker的第一业务处理层,所述最优networker通过负载均衡策略选定。
本发明的有益效果是:通过负载均衡策略使得不同使用场景的应用程序,可选择不同的负载均衡策略,从而满足其个性化的网络I/O需求定制,通过将时间包装并由最优networker来处理的方式解决传统的网络应用程序的线程资源浪费问题。
进一步,所述OS内核层具体包括:
设置I/O事件接口以及等待I/O事件接口。
进一步,所述派发模块具体用于:
在所述网络栈层中,根据所述文件描述符建立非阻塞client_socket并分配内存池,在所述内存池中创建协议链接,将所述协议链接与所述非阻塞client_socket关联,对所述协议链接设置数据读取回调函数、数据写出回调函数以及错误通知回调函数,并对所述非阻塞client_socket设置超时时间,将所述协议链接放入所述协议处理层中的协议服务的链接队列中,通过所述负载均衡策略确定所述最优networker,将所述非阻塞client_socket作为参数设置F08,所述F08为启动客户套接字读事件回调函数,通过所述事件框架层,将所述启动客户套接字读事件回调函数包装成所述外部事件,将所述外部事件加入到最优networker的事件库的外部事件队列中,判断所述最优networker的线程是否为当前线程,如果判断结果为是,则向所述的最优networker的第一事件框架层的第一事件库的通知事件写入8字节的数据,所述第一事件框架层执行事件通知处理回调函数,如果判断结果为否,则所述第一网络栈层执行所述启动所述F08,通过预设超时原则判断所述非阻塞client_socket是否超时,若是,则执行所述错误通知回调函数,若否,则执行所述数据读取回调函数,并更新所述非阻塞client_socket的最后访问时刻,所述第一协议处理层执行所述数据读取回调函数,并将处理结果拼装成HTTP消息,发送至所述最优networker的第一业务处理层,所述最优networker通过负载均衡策略选定。
进一步,所述处理模块具体用于:
在所述第一业务处理层中,通过消息接收回调函数,直接对所述HTTP消息进行处理,或将所述HTTP消息派发至应用程序自实现线程池进行处理,调用建立协议应答实例接口,在所述第一协议处理层中建立协议应答实例,通过所述第一业务处理层递交所述协议应答实例,所述第一协议处理层对所述协议应答实例以及所述HTTP消息进行封装,得到应答外部消息,所述事件框架层对所述应答外部消息进行处理。
进一步,还包括:
停止模块,用于当信号处理器获取退出信号时,所述信号处理器将条件变量的广播通知发送至等待接口,所述业务处理层通过所述等待接口获取所述条件变量的广播通知,并调用所述协议处理层的停止协议服务接口,所述协议处理层依次进行停止协议服务的监听器队列、停止网络栈、释放网络栈以及释放协议服务。
本发明解决上述技术问题的另一种技术方案如下:一种存储介质,所述存储介质中存储有指令,当计算机读取所述指令时,使所述计算机执行如上述任一项所述的一种支持负载均衡策略的异步通信方法。
本发明的有益效果是:通过负载均衡策略使得不同使用场景的应用程序,可选择不同的负载均衡策略,从而满足其个性化的网络I/O需求定制,通过将时间包装并由最优networker来处理的方式解决传统的网络应用程序的线程资源浪费问题。
本发明解决上述技术问题的另一种技术方案如下:一种电子设备,包括上述存储介质、执行上述存储介质内的指令的处理器。
本发明的有益效果是:通过负载均衡策略使得不同使用场景的应用程序,可选择不同的负载均衡策略,从而满足其个性化的网络I/O需求定制,通过将时间包装并由最优networker来处理的方式解决传统的网络应用程序的线程资源浪费问题。
附图说明
图1为本发明一种支持负载均衡策略的异步通信方法的实施例提供的流程示意图;
图2为本发明一种支持负载均衡策略的异步通信系统的实施例提供的结构框架图。
具体实施方式
以下对本发明的原理和特征进行描述,所举实例只用于解释本发明,并非用于限定本发明的范围。
如图1所示,一种支持负载均衡策略的异步通信方法,包括:
步骤1,根据主networker的OS内核层监听到的数据流判断是否调用主networker的事件框架层对所述数据流进行处理,若判断结果为是,则根据所述数据流的文件描述符,在所述事件框架层的事件库中匹配相应的处理流程;
步骤2,在主networker的网络栈层中,根据所述文件描述符创建链接,将所述处理流程包装成外部事件,将所述外部事件以及所述链接发送至最优networker的第一OS内核层进行事件唤醒,通过最优networker的第一网络栈层以及第一协议处理层对从主networker派发的外部事件以及所述链接进行处理,在所述第一协议处理层中将处理结果拼装成HTTP消息,发送至所述最优networker的第一业务处理层,所述最优networker通过负载均衡策略选定;
步骤3,在所述第一业务处理层中,创建协议应答实例并发送至所述第一协议处理层中,通过所述第一网络栈层将所述HTTP消息以及所述协议应答实例包装成应答外部消息,将所述应答外部消息发送至所述事件框架层,所述事件框架层对所述应答外部消息进行处理。
在一些可能的实施方式中,通过负载均衡策略使得不同使用场景的应用程序,可选择不同的负载均衡策略,从而满足其个性化的网络I/O需求定制,通过将时间包装并由最优networker来处理的方式解决传统的网络应用程序的线程资源浪费问题。
需要说明的是,为便于对本方案的理解,现将本方案的整体思路进行概述,之后再进行详细说明。
本发明设计了一种支持负载均衡策略的异步通信系统。
由于不同的服务端网络应用程序,其对网络I/O性能的关注点也不同,有侧重于高并发的,有侧重于低延迟的,有侧重于高吞吐的。因此,本发明设计了3种负载均衡策略,不同使用场景的应用程序,可选择不同的负载均衡策略,从而满足其个性化的网络I/O需求定制。
a.加权最小连接调度策略,适用于消息数据量不大、网络连接较多的网络应用程序;
b.快速处理策略,适用于业务逻辑耗时不长、需要快速处理的网络应用程序;
c.加权最小流量调度策略,适用于承载消息数据量较大的网络应用程序。
本发明设计了一种基于I/O多路复用技术的多线程协同处理框架。
为了解决传统的网络应用程序的线程资源浪费问题,需要分清线程资源浪费的4个阶段:①当无新连接接入时,②当对端网络数据没到来时,③应用程序处理耗时的业务时,④当应答消息写出繁忙时。
所以,本发明基于I/O多路复用技术设计出了一种高效的多线程协同处理框架,会根据应用程序设置的负载均衡策略,建立对应的线程处理模型,从而保障了当线程在出现这4类问题时,可跳出对当前事件的处理,转而处理其他事件,达到线程资源的充分利用。而多种事件类型的设计,也保障了多个线程之间能够更有效的协作处理事件。
本发明设计了多类助于提升网络I/O性能的功能模块。
设计了支持3种组网模式的网络协议栈:基础的POSIX组网、内核旁路的DPDK组网、内核旁路的RDMA组网。对于内核旁路的组网模式,减少了内核态的内存拷贝,大大提升了网络I/O的性能。
设计了内存池,用于解决在程序运行中向系统频繁申请小片内存的问题。创建内存池时,将会向操作系统申请一个大的内存块。程序在后续向内存池申请内存时,会将大的内存块按需切割后进行分配。这减少了系统调用次数,提升了性能。
设计了缓冲区,用单个缓冲区承载一个小的消息帧,将多个不连续的缓冲区连接成缓冲区链来承载整个消息,从而减少了内存拷贝,进一步提升了性能。
总体架构设计了4个层次,由下往上,包括事件框架层、网络栈层、协议处理层、业务处理层。其中,
OS内核层,由操作系统提供I/O事件的操作接口与I/O事件通知机制;
事件框架层,由异步通信系统定义了3类事件,设计并实现了3类事件的操作接口及事件队列的处理机制;
网络栈层,由异步通信系统定义网络通信的细节,设计并实现了多线程协同处理框架、网络栈、负载均衡策略等功能模块;
协议处理层,由异步通信系统或应用程序定义网络协议的格式,负责网络协议解析与消息的封装,并负责完成消息的递送;
业务处理层,由应用程序来实现,负责设置与启动异步通信系统,以及处理收到的消息等。
为了解决线程资源浪费问题,需要充分利用线程在空闲时阻塞的这段时间。例如,网络栈内的一个工作线程在读取客户端连接a的数据,当读取完客户端连接a在网卡缓冲区的数据时,就可以挂起这个客户端连接a,开始处理下一个客户端连接b的数据,直至客户端连接a有新数据到来时再排队处理。
I/O多路复用技术(见表2)通常提供两类接口:一类是设置I/O事件接口,用于向OS内核层的I/O事件关注队列中添加、修改或删除文件描述符,由操作系统来监听文件描述符的I/O变化。另一类是等待I/O事件接口,如果当前没有可用的事件,则阻塞调用线程;如果操作系统监听到文件描述符的I/O变化,则阻塞的调用线程就会继续运行,并获得到I/O事件就绪队列中的文件描述符。
由于触发I/O事件是在OS内核层,所以本发明设计了多层的回调函数的实现方法(见下表),下一层为上一层提供回调函数接口定义,上一层负责按照下一层的回调函数接口定义完成回调函数的实现。在启动异步通信系统时,进行自上层向下层的回调函数的设置。在触发I/O事件时,就会由下层往上层,依次执行上层的回调函数,来完成在单个线程内的处理流程。设计了多线程协同处理框架,使网络通信在多个线程之间能够更高效的协作处理。
异步通信系统设计了各层级的回调函数,其中,事件回调函数由事件框架层进行接口定义,由网络栈层进行实现;连接回调函数由网络栈层进行接口定义,由协议处理层进行实现;消息回调函数由协议处理层进行接口定义,由业务处理层进行实现。各类回调函数概述如下:
表1
事件框架层,事件库模块内,实现了对event_base(事件库)的管理、对event_driver的管理、对3类事件(见表4所示)的管理、对定时器的管理,并对上层提供相应事件的设置接口、以及3类事件的统一处理接口。
event_driver,设计了两类主要的接口,一类是设置文件描述符事件(fd_event)的接口,包括添加、修改、删除fd_event等接口;另一类是等待文件描述符事件(fd_event)接口。这两类接口封装了多种操作系统支持的I/O复用接口,对上层屏蔽掉了I/O复用接口在多个操作系统之间的差异性。
rbtree-timer,基于红黑树算法实现的事件定时器,实现了设置事件定时器、取消事件定时器、处理事件超时等功能,用于解决I/O事件的超时问题,如网络栈层的socket连接超时。当设置了事件定时器后,会通过event_driver在等待I/O事件接口上设置等待超时时间;当超过了这个时间后,阻塞在等待I/O事件接口上的线程会被操作系统调度(OS内核层),使其继续运行。
网络栈层,包含多线程协同处理框架、网络栈(network_stack)、负载均衡策略等主要功能模块:
负载均衡策略模块内,实现了对加权最小连接调度、快速处理、加权最小流量调度这3种策略的管理,详见实施例1。
多线程协同处理框架,基于I/O多路复用技术设计了各个层级之间的回调函数接口;设计了各类事件与线程之间的交互方式(见表4所示),用于通过事件处理机制来完成线程与线程之间或线程内部的工作;设计了2种线程模型,分别是主从线程模型、多主线程模型,会在添加监听服务流程里,由网络栈根据负载均衡策略去创建对应的线程模型。
网络栈模块内,实现了对network_stack的管理、3类网络栈实现(见表3所示)的管理、工作者(worker)的管理、连接监听器的管理、socket连接的管理等主要功能。其中,
network_stack,封装了传输层及以下的通信细节,形成了统一的socket接口,并提供3种组网模式的选择;同时支持IPv4、IPv6和本地通信,支持同时监听多个IP及端口;可通过network_stack来管理应用程序内的所有网络通信。
每个工作者(worker),独自管理着多线程框架内的一个工作线程,负责在工作线程内执行自己的工作,即调用事件框架层的事件处理接口来处理事件队列。当I/O事件触发时,会自下向上依次回调上一层设置的回调函数,从而完成工作。
协议处理层,根据异步通信系统或应用程序定义的网络协议格式,负责将收到的数据按照网络协议格式解析出来,封装成消息,并转递至上层(业务处理层);也负责将上层需要发送的数据按照网络协议格式封装成消息,向下递送至网络栈层,并由网络栈层发送出去。
异步通信系统内扩展实现了HTTP/1.1协议服务,包括HTTP/1.1协议解析器、流量控制等主要功能。
支持应有程序自行扩展实现应用层网络协议。
通用模块,包含内存池、缓冲区等主要功能模块:
内存池,实现了内存池管理、内存池扩增、内存分配等主要功能。创建内存池时,将会向操作系统申请一个大小为pool_size的内存块,用于后续的分配,并计算出可分配大小max_alloc的值,其计算方法为:
max_alloc=min((pool_size-pool_hdr_size),(page_size-1))
其中,pool_size为内存池的块大小,pool_hdr_size为内存池结构体所占用的头部大小,page_size为系统的内存页大小。
当程序向内存池申请大小为m_size的内存时,若m_size<=max_alloc且内存池有可用空间时,会从内存池的内存块进行切割分配;若m_size<=max_alloc且内存池的剩余空间不足时,会再次扩增一块大小为pool_size的内存块,并加入内存池链表,同时用新的内存块进行切割分配;若m_size>max_alloc时,会直接向操作系统申请一块大小为m_size的内存块,分配给程序使用。
同时,内存池每次为程序分配的内存地址都会按16字节对齐,以提升CPU的寻址效率。
内存池的适用场景,尤其适用于在一个较短的周期内频繁申请大量的小块内存的场景,例如在一个网络连接的一次请求与应答的周期内,申请了很多小块的内存,包括为结构体、类等所申请的内存。这会大大减少向系统申请内存时的系统调用次数、同时减少内存碎片,从而提升性能。
缓冲区,实现了缓冲数据块、数据块指针、数据块指针链表等主要功能。
缓冲数据块,包含原始数据在内存的位置及原始数据大小。
数据块指针,指向缓冲数据块某一段的内存位置,包含偏移量及实际数据大小。
数据块指针链表,将多个不连续的数据块指针连接成链表。
缓冲区的适用场景,尤其适用于避免内存拷贝的场景,如协议消息在各个层级的传递,原始的缓冲区数据块并不需要拷贝,只需数据块指针进行拷贝,大大提升了I/O性能。
本发明的异步通信系统的处理流程分为启动异步通信系统、接收消息流程、派发消息流程、停止异步通信系统这4类。
一、启动异步通信系统
1、创建与启动流程设计
异步通信系统的启动,是由应用程序所在的业务处理层发起的,具体处理流程如下:
(主线程)业务处理层:环境初始化设置。应用程序通过异步通信系统的环境初始化接口,可以设置选用的组网模式(见表3):POSIX网络栈、或者RDMA网络栈、或者DPDK网络栈。可以设置负载均衡策略:加权最小连接调度策略、或者快速处理策略、或者加权最小流量调度策略。还可以设置网络栈中工作者(worker,每个工作者管理着网络栈中一个工作线程)的数量。以及设置其它网络配置参数。
(主线程)业务处理层:设置F01(消息接收回调函数)。应用程序需按照协议处理层的消息回调函数接口定义来实现F01,并将F01作为参数传递给启动协议服务接口。
(主线程)协议处理层:启动协议服务。启动协议服务接口将创建协议服务(如HTTP协议服务),并将F01与该协议服务关联起来。进一步地,启动协议服务接口会分为2个子步骤处理:①创建网络栈,②启动网络栈。
①创建网络栈,处理流程描述如下:
(主线程)网络栈层:创建网络栈及工作者。如果网络栈尚未创建过,会跟据环境初始化设置的组网模式,创建一个具体的网络栈实现(如POSIX网络栈实现);如果网络栈已创建过,则会直接返回已创建好的网络栈。进一步地,网络栈实现会根据环境初始化设置的工作者数量(n_workers),创建n_workers个工作者(worker),并将这些worker放入工作者队列。进一步地,每个worker会分别调用事件框架层的接口创建一个由其管理的事件库(event_base)。
(主线程)事件框架层:为工作者创建事件库。event_base(事件库)用来管理各类事件(见表4),event_base会根据当前操作系统支持的I/O复用接口(见表2),创建一个对应的事件驱动(event_driver)的实现,事件驱动实现会创建一个通知事件(也是一个文件描述符事件)并设置F12(事件通知处理回调函数),用于外部线程对该event_base所在线程发起I/O事件通知;进一步地,event_base会创建基于红黑树算法的定时器,用于存放设置超时时间的事件(event);进一步地,event_base会创建外部事件队列,用于存放外部线程向其派发的外部事件。
当网络栈创建成功后,主线程的流程将从事件框架层向上层逐层返回结果。
②启动网络栈,处理流程描述如下:
(主线程)网络栈层:启动网络栈及网络栈实现。此处需进一步解释:网络栈,是指统一的抽象接口;网络栈实现,是指3类组网模式中的一种具体实现。启动网络栈时,会根据应用程序设置的组网模式进而启动对应的网络栈实现。进一步地,网络栈实现会为每个worker创建一个由其管理的线程,每个worker只负责在自己管理的线程内进行工作。
(worker)网络栈层:每个worker的线程将一直循环执行事件框架层的处理事件函数,直至worker的状态变更为停止中状态。
(worker)事件框架层:处理事件队列。执行处理事件函数,将处理event_base内的各类事件,会依次处理文件描述符事件队列、定时器(事件定时队列)、外部事件队列。当各类事件队列都处理完毕后,计算出红黑树上的最小结点时间与当前操作系统时间的差值,并将该差值更新为等待I/O事件接口的超时等待时间,worker的线程会阻塞在OS内核层的等待I/O事件接口上;当I/O事件触发或者等待超时时,便会从等待I/O事件接口上继续执行。
(worker)事件框架层:对文件描述符事件(fd_event)队列的处理,会通过event_driver的等待fd_event事件接口去调用事件驱动实现(如epoll_driver)的等待fd_event事件函数,进而调用当前操作系统的等待I/O事件接口(如Linux系统的epoll_wait函数)来等待I/O事件的就绪通知。当I/O事件触发时,阻塞在等待I/O事件接口的调用线程就会继续运行,并获得到I/O事件就绪队列中的文件描述符,event_base将对就绪的文件描述符队列依次执行事件回调函数,从而完成对fd_event队列的处理。(文件描述符事件会在后面流程中设置)。
(worker)事件框架层:对事件定时队列的处理,是在处理完文件描述符事件队列后,将继续处理事件定时队列。其处理方式是从红黑树上找到最小时间的结点,如果该结点的时间小于或等于操作系统当前时间,即认为超时事件的结点,并将这个超时事件的结点从红黑树上移除。进一步地,执行该超时事件的事件回调函数。进一步地,重复这个流程,直至处理完当前周期内超时的事件。(定时事件会在接收消息流程中设置)。
(worker)事件框架层:对外部事件队列的处理,是在处理完前2种事件队列后,将继续处理外部事件队列。其处理方式是遍历外部事件队列中的事件,依次执行事件回调函数,直至处理完当前周期内的外部事件队列。(线程之间的交互通过外部事件,在后面的流程中会描述)。
当网络栈启动成功后,n_workers个工作线程均阻塞在OS内核层的等待I/O事件接口上,直至被I/O事件唤醒或者等待超时,才开始继续工作。而启动网络栈的主线程会继续向下执行,流程会从网络栈层向上逐层返回至业务处理层。
2、添加监听服务流程设计
当异步通信系统启动成功后,由应用程序发起添加监听服务流程:
(主线程)业务处理层:设置监听服务地址。应用程序通过调用协议处理层的添加监听服务接口来设置服务地址,需设置IP地址和端口号等参数。
(主线程)协议处理层:添加监听服务。添加监听服务接口将设置F02(协议连接初始化回调函数,F02会在新的客户端连接接入时,由网络栈层调用),并将该协议服务做为F02的参数,再将F02及业务处理层设置的服务地址信息一起传递至网络栈监听接口。
(主线程)网络栈层:创建连接监听器抽象实例。网络栈监听接口会创建连接监听器的抽象实例(conn_listener_t),并进一步调用网络栈实现(如POSIX网络栈实现)的监听函数,为conn_listener_t创建具体实现。
(主线程)网络栈层:创建连接监听器具体实现。网络栈实现的监听函数会分成3个子步骤处理:①创建连接监听器具体实现(conn_listener_impl),并为conn_listener_impl创建服务套接字队列(server_socket队列),②创建多线程处理模型,③创建、派发、启动服务套接字(server_socket)。
其中,②创建多线程处理模型,处理流程描述如下:
(主线程)网络栈层:创建多线程处理模型。根据在环境初始化设置的负载均衡策略,会创建不同的多线程处理模型。具体创建方法为:
对于加权最小连接调度策略(LB_WLC_SCHED)和加权最小流量调度策略(LB_WLF_SCHED),网络栈实现会创建主从线程模型,即从工作者队列中选择末尾一个worker作为主worker,其它worker作为从worker。(后续,这个主worker负责接收及派发客户端socket连接,并负责少量的处理客户端socket连接的网络I/O数据;多个从worker负责处理客户端socket连接的网络I/O数据)。
对于快速处理策略(LB_FAST_PROC),会创建多主线程模型,即工作者队列中的所有worker均作为主worker。快速处理策略只支持在Linux 3.9内核以上使用,OS内核层负责使多个主worker的工作线程进行相对均衡的触发I/O事件。(后续,这些主worker直接负责接收客户端socket连接,并处理客户端socket连接的网络I/O数据)。
③创建、派发、启动服务套接字(server_socket),处理流程描述如下:
(主线程)网络栈层:创建服务套接字(server_socket)。对于主从线程模型,会在唯一的主worker上创建服务套接字;对于多主线程模型,则会依次在多个主worker上创建服务套接字。
(主线程)网络栈层:派发服务套接字(server_socket)。设置F06(启动服务套接字监听回调函数),并将server_socket做为F06的参数,再将F06与其参数通过同步派发外部事件接口派发至主worker去执行。
(主线程)事件框架层:执行同步派发外部事件。将回调函数与参数包装进外部事件中,再将外部事件加入到目标worker的事件库的外部事件队列中。进一步地,如果目标worker的线程不是当前线程,则向目标worker的事件库的通知事件写入8字节的数据,使目标worker的线程触发I/O事件。进一步地,通过条件变量等待主worker的执行结果。
(主worker)事件框架层:因I/O事件触发,依次处理各类事件队列。进一步地,执行F12(事件通知处理回调函数)去消费掉这8字节的数据。进一步地,执行外部事件回调函数F06。
(主worker)网络栈层:执行F06(启动服务套接字监听)。F06分为2个子步骤处理:①执行网络监听(如创建socket、执行bind、执行listen等操作),②通过fd_event设置接口为server_socket中fd_event的读事件设置F07(服务套接字接收连接回调函数,F07会在新的客户端连接接入时,由事件框架层调用)与参数server_socket,并通过fd_event启动接口进行启动。
(主worker)事件框架层:设置并启动fd_event的读事件。通过fd_evnet设置接口,将回调函数与参数设置到fd_event上。进一步地,通过fd_event启动接口调用OS内核层的设置I/O事件接口。进一步地,通过OS内核层的设置I/O事件接口向I/O事件关注队列中添加文件描述符。
(主worker)事件框架层:当F06执行完成后,通过条件变量唤醒主线程。
(主线程)事件框架层:主线程被唤醒,从同步派发外部事件接口处继续执行,并向上层逐层返回结果。
(主线程)网络栈层:将启动成功的服务套接字加入conn_listener_impl的服务套接字队列,并将连接监听器抽象实例(conn_listener_t)返回给协议处理层。
(主线程)协议处理层:将连接监听器(conn_listener_t)加入监听器队列,并向业务处理层返回处理结果。
(主线程)业务处理层:当添加监听服务成功后,应用程序需按照下列3个步骤处理:①通过异步通信系统提供的信号处理器,注册退出信号。②调用信号处理器的等待接口,等待用户发起退出信号,③主线程被唤醒后,发起停止异步通信系统流程。
此时,异步通信系统启动完成,主线程阻塞在信号处理器的等待接口上,网络栈的工作线程阻塞在OS内核层的等待I/O事件接口上。
二、接收消息流程设计
接收消息流程分为2个阶段:派发连接阶段和数据读取/协议解析/消息入队阶段。
1、派发连接阶段
当新的客户端连接接入时,会触发网络栈中主worker线程的I/O事件,进入派发连接阶段:
(主worker)事件框架层:处理文件描述符事件队列。事件驱动实现从等待I/O事件接口获得到I/O事件就绪队列中的文件描述符,并对就绪的文件描述符执行事件回调函数F07。
(主worker)网络栈层:执行F07(服务套接字接收连接)。F07分成5个子步骤处理:①接收客户端连接文件描述符,②建立非阻塞client_socket(客户端套接字)并分配内存池,③执行F02(协议连接初始化),将client_socket传递至协议处理层,④寻找最优worker,⑤将client_socket派发至最优worker去处理。
其中,子步骤③,处理流程描述如下:
(主worker)协议处理层:执行F02(协议连接初始化)。F02分成4个子步骤处理:①在client_socket的内存池中创建协议连接,并与client_socket建立关联,②为该协议连接设置F03(协议连接的数据读取回调函数)、F04(协议连接的数据写出回调函数)、F05(错误通知回调函数)这三类回调函数,③为该client_socket设置超时时间,④将该协议连接放入协议服务的连接队列。
子步骤④,处理流程描述如下:
(主worker)网络栈层:寻找最优worker。寻优逻辑为:①对于主从线程模型,将通过负载均衡策略(加权最小连接调度或加权最小流量调度)算法的计算,得出最小数值的即为最优worker,②对于多主线程模型,最优worker就是自身。
子步骤⑤,处理流程描述如下:
(主worker)网络栈层:设置F08(启动客户套接字读事件回调函数),并将client_socket做为F08的参数,再将F08与其参数通过异步派发外部事件接口派发至最优worker去执行。
(主worker)事件框架层:执行异步派发外部事件。将回调函数与参数包装进外部事件中,再将外部事件加入到目标worker的事件库的外部事件队列中。进一步地,如果目标worker的线程不是当前线程,则向目标worker的事件库的通知事件写入8字节的数据,使目标worker的线程触发I/O事件。
(主worker)事件框架层:继续处理其它2类事件队列,计算并更新等待I/O事件接口的超时等待时间,等待I/O事件的下一次唤醒。
2、数据读取/协议解析/消息入队阶段
当主worker派发client_socket至最优worker时,会触发最优worker线程的I/O事件,进入启动客户套接字读事件阶段:
(最优worker)事件框架层:因I/O事件触发,依次处理各类事件队列。进一步地,执行F12(事件通知处理回调函数)去消费掉这8字节的数据。进一步地,执行外部事件回调函数F08。
(最优worker)网络栈层:执行F08(启动客户套接字读事件)。F08将通过fd_event设置接口为client_socket中fd_event的读事件设置F09(客户套接字读处理回调函数,F09会在客户端的网络数据到来时,由事件框架层调用)与参数client_socket,并通过fd_event启动接口进行启动。
(最优worker)事件框架层:设置并启动fd_event的读事件。通过fd_evnet设置接口,将回调函数与参数设置到fd_event上。进一步地,通过fd_event启动接口调用OS内核层的设置I/O事件接口。进一步地,通过OS内核层的设置I/O事件接口向I/O事件关注队列中添加文件描述符。
(最优worker)网络栈层:F08还将协议连接初始化时为该client_socket设置的超时时间,与client_socket的fd_event一同递送给fd_event的添加定时器接口。
(最优worker)事件框架层:为fd_event设置定时。将超时时间与当前系统时间相加,计算得出fd_event的超时时刻,设置到fd_evnet的读事件上,并将该读事件加入到定时器中。
(最优worker)事件框架层:继续处理各类事件队列,计算并更新等待I/O事件接口的超时等待时间,等待I/O事件的下一次唤醒。
当客户端的网络数据到来时,会触发最优worker线程的I/O事件,进入数据读取阶段:
(最优worker)事件框架层:因I/O事件触发,处理文件描述符事件队列。进一步地,执行fd_event的读回调函数F09。
(最优worker)网络栈层:执行F09(客户套接字读处理)。如果client_socket的fd_evnet的读事件有超时标记,则通过client_socket的最后访问时刻与协议连接初始化时设置的超时时间,计算出下次超时时刻:
下次超时时刻=最后访问时刻+超时时间,预设超时原则
如果下次超时时刻小于或等于系统当前时间,即认为client_socket超时。若超时,则执行F05(错误通知回调函数);否则,执行F03(协议连接的数据读取回调函数)并更新该client_socket的最后访问时刻。
(最优worker)协议处理层:执行F03(协议连接的数据读取)。F03分成3个子步骤处理:①通过调用网络栈层的接收数据接口来读取数据,②将读取到的数据按照网络协议格式解析成协议请求消息,③若协议请求消息解析完成,则将协议请求消息通过F01递送给业务处理层;若未解析完成,则直接返回,等待I/O事件下一次唤醒后继续解析所述第一协议处理层执行所述数据读取回调函数,。
(最优worker)业务处理层:执行F01(消息接收),由业务处理层进行消息派发或业务处理。
(最优worker)事件框架层:继续处理各类事件队列,计算并更新等待I/O事件接口的超时等待时间,等待I/O事件的下一次唤醒。
当等待I/O事件接口由于等待超时而被唤醒时,表示定时器有超时的client_socket需要处理了:
(最优worker)事件框架层:处理事件定时队列。从红黑树上找到最小时间的事件。进一步地,如果该事件的超时时刻小于或等于操作系统当前时间,即认为超时的事件,将这个超时的事件从红黑树上移除,并将该事件设置超时标记;进一步地,执行fd_event的读回调函数F09。
(最优worker)网络栈层:执行F09(客户套接字读处理)。按照上述数据读取阶段执行F09的流程,会进一步执行F05(错误通知)。
(最优worker)协议处理层:执行F05(错误通知)。F05会分成2个子步骤处理:①将与client_socket关联的协议连接从协议服务的连接队列中移除,②通过网络栈层的接口关闭client_socket。
(最优worker)网络栈层:关闭client_socket,分成3个子步骤处理:①通过fd_event的删除定时器接口删除该client_socket在fd_event上的定时器,②通过fd_event的禁用接口禁用该client_socket的fd_event,③关闭该client_socket及释放内存池。
(最优worker)事件框架层:如果fd_event上设置了定时器,则删除该定时器。
(最优worker)事件框架层:禁用fd_event。进一步地,通过OS内核层的设置I/O事件接口从I/O事件关注队列中移除文件描述符。
(最优worker)事件框架层:继续处理各类事件队列,计算并更新等待I/O事件接口的超时等待时间,等待I/O事件的下一次唤醒。
三、派发消息流程设计
派发消息流程分为2个阶段:消息派发/业务处理/封装应答/应答入队阶段和数据写出阶段。
1、消息派发/业务处理/封装应答/应答入队阶段
协议请求消息由协议处理层通过F01(消息接收回调函数)转递至业务处理层。业务处理层可采用如下两种方式进行处理:
方式1,在F01内,直接完成处理消息、业务处理等业务逻辑。这种快速处理的方式适用于业务处理耗时非常少的应用程序中,比如echo服务器;不适合业务处理耗时过长的应用程序,因为F01是在网络栈worker的线程上被回调执行的,会导致占用worker的处理网络I/O数据的时间。
方式2,在F01内,将接收到的协议请求消息,派发到由应用程序自实现的线程池的消息队列内,由应用程序的线程来处理。
应用程序自实现线程池时,需要保证同一client_socket的消息按序接收及按序处理。可通过下述方法:
线程与消息队列的一对一匹配,即一个线程关联一个消息队列;将同一client_socket的协议请求消息固定派发到同一个消息队列。对于每一个client_socket,异步通信系统会为其分配一个conn_id(连接唯一标识),通过协议消息的获取连接信息接口即可获取到conn_id,在F01内可通过conn_id与thread_num(自实现的线程数量),计算出queue_id(消息队列序号):
queue_id=conn_id%thread_num
从而将同一client_socket的协议请求消息,派发至固定的消息队列。
当应用程序通过方式1或方式2处理完协议请求消息后,将通过下述流程派送协议应答消息:
业务处理层:调用建立协议应答实例接口,获取与协议请求消息对应的协议应答实例。
协议处理层:建立协议应答实例。协议处理层从协议请求消息中获取到所关联的协议连接,建立与该协议连接关联的协议应答实例,并将协议应答实例返回给业务处理层。
业务处理层:递交应答数据。将需要发送给客户端的应答数据与协议应答实例,通过递送应答信息接口递送给协议处理层。
协议处理层:封装协议应答消息并入队。将协议应答实例与应答数据,按照网络协议格式,封装成协议应答消息。进一步地,将协议应答消息放入到同一协议连接的消息派发队列。进一步地,调用网络栈层的接口启动派发应答消息通知。
网络栈层:启动派发应答消息通知。设置F10(启动客户套接字写事件回调函数),并将client_socket做为F10的参数,再将F10与其参数通过异步派发外部事件接口派发至client_socket对应的worker(即3.2.2节的最优worker)去执行。
事件框架层:执行异步派发外部事件。
2、数据写出阶段
(最优worker)事件框架层:因I/O事件触发,依次处理各类事件队列。进一步地,执行F12(事件通知处理回调函数)去消费掉这8字节的数据。进一步地,执行外部事件回调函数F10。
(最优worker)网络栈层:执行F10(启动客户套接字写事件)。F10将通过fd_event设置接口为client_socket中fd_event的写事件设置F11(客户套接字写处理回调函数,F11会在网卡的写缓冲区未满时,由事件框架层调用)与参数client_socket,并通过fd_event启动接口进行启动。
(最优worker)事件框架层:设置并启动fd_event的写事件。通过fd_evnet设置接口,将回调函数与参数设置到fd_event上。进一步地,通过fd_event启动接口调用OS内核层的设置I/O事件接口。进一步地,通过OS内核层的设置I/O事件接口从I/O事件关注队列中修改文件描述符。
当fd_event的写事件启动后,只要在网卡的写缓冲区未满时,OS内核层就会触发文件描述符的I/O事件。
(最优worker)事件框架层:因I/O事件触发,依次处理各类事件队列。进一步地,执行文件描述符事件的回调函数F11。
(最优worker)网络栈层:执行F11(客户套接字写处理回调函数)。F11分为3个子步骤处理:①更新该client_socket的最后访问时刻,②写出该client_socket缓冲区的数据(即上一次未发送完的协议应答消息数据),③通过调用F04取出需要发送的协议应答消息。
(最优worker)协议处理层:执行F04(协议连接的数据写出)。F04将会从与client_socket关联的协议连接的消息派发队列中,依次取出需要发送的协议应答消息,将其放入client_socket的缓冲区中。
(最优worker)网络栈层:循环写出client_socket缓冲区的数据,在写出该client_socket缓冲区的数据过程中,出现网卡的写缓冲区满或者网络繁忙时,将直接返回,等待文件描述符的I/O事件再次触发。当client_socket的缓冲区的数据都已经写出(即消息派发队列为空)时,调用事件框架层的fd_event的禁用写事件接口。
(最优worker)事件框架层:禁用该socket连接的fd_event的写事件。进一步地,通过OS内核层的设置I/O事件接口从I/O事件关注队列中修改文件描述符。
(最优worker)事件框架层:继续各类事件队列,计算并更新等待I/O事件接口的超时等待时间,等待I/O事件的下一次唤醒。
四、停止异步通信系统
当用户发起退出信号时,开始以下处理流程:
信号处理器:捕获到退出信号,并发起条件变量的广播通知。
(主线程)业务处理层:从信号处理器的等待接口上收到条件变量的广播通知,主线程被唤醒,继续执行,调用协议处理层的停止协议服务接口。
(主线程)协议处理层:停止协议服务,分为4个子步骤处理:①停止该协议服务的监听器队列,②停止网络栈,③释放网络栈,④释放该协议服务。
①停止该协议服务的监听器队列,处理流程描述如下:
(主线程)协议处理层:遍历监听器队列中的conn_listener_t,依次通过网络栈层的接口进行停止。
(主线程)网络栈层:遍历conn_listener_impl的服务套接字队列中的server_socket,并设置F13(停止服务套接字监听回调函数),依次将F13与参数server_socket通过同步派发外部事件接口派发至主worker去执行。
(主线程)事件框架层:执行同步派发外部事件。进一步地,同步派发外部事件接口通过条件变量等待主worker的执行结果。
(主worker)事件框架层:因I/O事件触发,依次处理各类事件队列。进一步地,调用外部事件的回调函数F13。
(主worker)网络栈层:执行F13。F13将调用事件框架层的fd_evnet禁用接口。
(主worker)事件框架层:禁用server_socket中fd_event的读事件,通过OS内核层的设置I/O事件接口,从I/O事件关注队列中删除server_socket的文件描述符。
(主worker)网络栈层:在fd_evnet禁用之后,F13将关闭server_socket的文件描述符,并释放server_socket的内存空间。
(主worker)事件框架层:当F13执行完后,通过条件变量唤醒主线程。
(主线程)事件框架层:主线程被唤醒,从同步派发外部事件接口处继续执行,并向上层逐层返回结果。
②停止网络栈,处理流程描述如下:
(主线程)协议处理层:调用网络栈层的停止网络栈接口。
(主线程)网络栈层:停止网络栈。网络栈实现将遍历工作者队列中的worker,并设置F14(停止网络工作回调函数),依次将F14与参数worker通过异步派发外部事件接口派发至worker去执行。
(主线程)事件框架层:执行异步派发外部事件。
(主线程)网络栈层:停止网络栈接口会等待所有worker线程的退出。
(worker)事件框架层:因I/O事件触发,依次处理各类事件队列。进一步地,调用外部事件的回调函数F14。
(worker)网络栈层:执行F14。F14将更改当前worker的运行状态为停止中状态。当worker在停止中状态时,将不再继续执行事件框架层的处理事件函数,进而使worker的线程退出。
(主线程)网络栈层:当网络栈的所有worker线程退出后,从停止网络栈接口处继续执行,并向上层逐层返回结果。
③释放网络栈,处理流程描述如下:
(主线程)协议处理层:调用网络栈层的释放网络栈接口。
(主线程)网络栈层:释放网络栈内所有worker的内存空间,再释放网络栈及网络栈实现的内存空间。
(主线程)事件框架层:释放事件库及事件驱动所占用的内存空间。
④释放该协议服务,处理流程描述如下:
(主线程)协议处理层:释放该协议服务所占用的内存空间。
至此,异步通信系统关闭完成。
实施例1,本发明设计了3类负载均衡策略,应用程序可根据需要设置适合的负载均衡策略:
负载均衡策略1,加权最小连接调度(LB_WLC_SCHED),适用于消息数据量不大、网络连接较多的服务端网络应用程序。
加权最小连接调度的处理流程描述如下:
①(主线程)业务处理层:在环境初始化设置时,通过环境初始化接口设置主worker与从worker的权重值(主worker权重值应设置成小于从worker的权重值,以保证从worker可以优先处理网络I/O数据)。
②(主worker)网络栈层:在派发连接阶段的子步骤④中,主worker通过LB_WLC_SCHED寻找最优worker时,其算法的伪代码如下:
LB_WLC_SCHED(wokrs)
1 min_id=0
2 min_cnt=wokrs[min_id]->ref_cnt
3 for id=min_id+1to id<n_wokrs
4 if min_cnt==0
5 return wokrs[min_id]
6 elseif min_cnt*wokrs[id]->weight>wokrs[id]->ref_cnt*wokrs[min_id]->weight
7 min_id=id
8 min_cnt=wokrs[min_id]->ref_cnt
9 return wokrs[min_id]
该算法概述为:算法入参wokrs(网络栈的worker队列),将wokrs的第一个worker做为当前最小worker,其连接计数做为当前最小值(min_cnt),依次用wokrs中的worker与当前最小worker进行比较:如果(当前最小值与比较worker的权重值的乘积)大于(比较worker的连接计数与当前最小worker的权重值的乘积),则将比较的worker做为新的当前最小worker。继续下次循环,直至找出wokrs中的最小worker,即为最优worker。
③(最优worker)网络栈层:在执行F08(启动客户套接字读事件)时,最优worker将增加其连接计数值(连接计数是LB_WLC_SCHED算法的计算要素,也是网络栈中用来衡量某一worker繁忙程度的依据)。
④(最优worker)网络栈层:当收到client_socket关闭通知或者出现错误时,最优worker将减少其连接计数值。
加权最小连接调度策略,解决了按客户端连接数量进行在多个worker之间均衡分配连接的问题。而权重值的引入,解决了主worker在无新的客户端连接接入时,又可处理处理现有客户端连接的网络I/O数据;而当新接入的客户端连接较多时,主worker由于较小的权重值,将在相对较少的时间内处理现有客户端连接的网络I/O数据,不至于影响接收新客户端连接的速度。
负载均衡策略2,快速处理模式(LB_FAST_PROC),适用于业务逻辑耗时不长、需要快速处理的服务端网络应用程序。
快速处理模式的实现,只支持在Linux 3.9内核以上使用,依赖于其SO_REUSEPORT特性实现的。该特性允许在多进程或多线程中将多个IPv4或IPv6地址绑定到相同的端口,由Linux内核层面实现负载均衡,从而减少了线程之间的上下文切换,达到快速处理的目的。
负载均衡策略3,加权最小流量调度(LB_WLF_SCHED),适用于承载消息数据量较大的服务端网络应用程序。
LB_WLF_SCHED与LB_WLC_SCHED区别之处在于:LB_WLC_SCHED在网络栈层实现,由网络栈层更新worker的连接计数值;而LB_WLF_SCHED需要协议处理层介入,是一种基于信用的双向流量控制,由协议处理层提供预读数据量、预写数据量,并告知网络栈层分别更新其计数值。
加权最小流量调度的处理流程如下:
①(主线程)业务处理层:在环境初始化设置时,通过环境初始化接口设置主worker与从worker的权重值(主worker权重值应设置成小于从worker的权重值,以保证从worker可以优先处理网络I/O数据)。还可以设置worker的待写数据量阈值,使worker在遇到大量数据未写出时,暂缓处理新客户端连接的网络I/O数据。
②(主worker)网络栈层:在派发连接阶段的子步骤④中,主worker通过LB_WLF_SCHED寻找最优worker时,其算法的伪代码如下:
LB_WLF_SCHED(wokrs)
1 min_id=0
2 min_rd_cnt=wokrs[min_id]->rd_cnt
3 forid=min_id+1to id<n_wokrs
4 ifwokrs[id]->disable
5 continue
6 else min_rd_cnt/wokrs[min_id]->weight>wokrs[id]->rd_cnt/wokrs[id]->weight
7 min_id=id
8 min_rd_cnt=wokrs[min_id]->rd_cnt
9 returnwokrs[min_id]
该算法概述为:算法入参wokrs(网络栈的worker队列),将wokrs的第一个worker做为当前最小worker,其待读数据量做为当前最小值(min_rd_cnt),依次遍历wokrs中worker,如果worker存在禁用标记,则跳过对该worker的比较。进一步地,用worker与当前最小worker进行比较:如果(当前最小值除以当前最小worker权重值)大于(比较worker的待读数据量值除以比较worker权重值),则将比较worker做为新的当前最小worker。继续下次循环,直至找出wokrs中的最小worker,即为最优worker。
在数据读取阶段,通过下述方式使worker的待读数据量值得到实时更新:
(最优worker)协议处理层:执行F03(协议连接的数据读取)时,在子步骤②中,解析协议消息头完成后,将解析出的协议消息体的长度值,递送至更新待读数据量接口。
(最优worker)网络栈层:增加当前worker的待读数据量统计。
(最优worker)协议处理层:执行F03(协议连接的数据读取)时,在子步骤③中,将已读取的消息体的长度值,递送至更新待读数据量接口。
(最优worker)网络栈层:减少当前worker的待读数据量统计。
在封装应答、应答入队阶段,通过下述方式使worker的待写数据量值得到实时更新:
协议处理层:在封装协议应答消息并入队后,将协议应答消息的长度值,递送至更新待写读数据量接口。
(最优worker)网络栈层:增加当前worker的待写数据量统计,若待写数据量的统计值超过应用程序设置的待写数据量阈值时,将当前worker设置禁用标记。
在数据写出阶段,通过下述方式使worker的待写数据量值得到实时更新:
(最优worker)网络栈层:在执行F11(客户套接字写处理回调函数)时,减少当前worker的待写数据量统计,若待写数据量的统计值低于应用程序设置的待写数据量阈值时,将当前worker移除禁用标记。
加权最小流量调度策略,解决了按数据的双向流量进行在多个worker之间均衡分配连接的问题。当网络栈中某个worker的预读或预写超量的时候,主worker都会将新连接派发至其它worker,达到负载均衡的目的;而随着这个worker的数据流写出,又会取消其禁用标记,再次被调度来处理网络I/O数据。
实施例2,本发明的处理流程,关键在于分析出了由于网络I/O阻塞导致线程空闲的4个位置点,并基于这4个位置点,设计出了4个阶段的处理流程:
阶段1,派发连接。对于派发新连接,其异步处理在于:①无新连接时,即accept发生EAGIN时,线程不会被阻塞,会继续处理各类事件队列中的事件。②当处理网络数据且recv/send发生EAGIN时,也会继续处理各类事件队列中的事件。
阶段2,数据读取/协议解析/消息入队。阶段2的异步处理在于:①当处理网络数据且recv发生EAGIN时,线程不会被阻塞,会继续处理各类事件队列中的事件。例如:客户端只发送了半个消息报文,而5秒后才会发后半个消息报文,而阶段2的处理会将已接收的半个消息报文读入缓冲区,转而处理其它连接的消息,直至5秒后,后半个消息报文到来才会处理。
阶段3,消息派发/业务处理/封装应答/应答入队。阶段3属于业务处理层的异步处理,由应用程序选择方式1或方式2进行实现。对于方式2,由应用程序建立一个业务处理线程池,这使异步处理系统与应用程序之间,达到互不影响的目的,即不会因业务处理时间长,导致占用线程时间过长,而影响阶段2。
阶段4,数据写出。阶段4的异步处理在于:①当处理网络数据且write发生EAGIN时,线程不会被阻塞,会继续处理各类事件队列中的事件。例如:向客户端发送应答消息报文时,本端的网卡的发送缓冲区已满,这会使异步通信系统挂起该连接的消息发送,转而处理其它连接的读事件,待发送缓冲区可写入时,会被内核I/O事件再次唤醒,从而继续之前的发送。
这4个异步处理的阶段,使异步通信系统的执行网络I/O处理的线程达到最大化利用率,从而提升了网络I/O性能。
实施例3,为了使本技术领域的人员能更好的理解本方案,将结合实际的示例来做说明具体实施方式,本发明的具体实施方式不限于此。
以在Linux操作系统上,应用程序集成异步通信系统内置的HTTP协议服务为例进行说明,具体步骤如下:
第一步,进行异步通信系统的环境初始化:设置组网模式,设置负载均衡策略,设置网络参数等。
heyio_env_config_t env_cfg;//环境配置结构体
memset(&env_cfg,0,sizeof(heyio_env_config_t));//清空环境配置结构体
env_cfg.ntk_opts.mode=POSIX_NETWORK;//设置组网模式
env_cfg.ntk_opts.n_workers=3;//设置工作者数量
env_cfg.lb_opts.method=LB_WLC_SCHED;//设置负载均衡策略为加权最小连接
strcpy(env_cfg.log_opts.pathname,"/var/log/heyio.log");//设置日志路径
env_cfg.log_opts.level=LOGLV_INFO;//设置日志级别
if(heyio_env_init(&env_cfg)==-1){//执行环境初始化设置return-1;}
第二步,设置F01(消息接收回调函数)并启动协议服务。
按照协议处理层的消息接收接口定义,选用消息派发阶段的方式1来实现消息接收回调函数:
static void http_msg_recv_handler(http_request_t*req,void*arg){structBUSINESS*my_business=arg;//从协议请求信息req中获取协议应答实例resp http_response_t*resp=http_request_get_response(req);//向协议处理层递交应答数据
http_response_send(resp,HTTP_OK,http_headers,http_body);}
启动HTTP协议服务,并设置F01与自定义参数my_business:
http_server_t*http_srv=
http_server_start(http_msg_recv_handler,my_business);
if(http_srv==NULL){goto failed;}
第三步,执行添加监听服务。网络栈内支持同时监听多个不同的服务地址,所以可通过http_server_add_listening函数多次添加不同的IP及端口。
struct socket_address sock_addr;//网络地址结构体
memset(&sock_addr,0,sizeof(struct socket_address));//清空网络地址结构体
sock_addr.family=PF_INTERNET;//设置网络地址类型
strcpy(sock_addr.inet_addr.host,"172.18.234.120");//设置IP地址
sock_addr.inet_addr.port=8080;//设置端口号
if(http_server_add_listening(http_srv,&sock_addr)==-1){//执行添加监听服务
goto failed;}
此时,添加监听服务完成后,HTTP协议服务及网络栈即进入了正常工作状态。
第四步,通过信号处理器注册退出信号:
register_signal_handler(SIGQUIT);//向系统注册退出信号
register_oneshot_signal_handler(SIGINT);//向系统注册中断信号
register_oneshot_signal_handler(SIGTERM);//向系统注册终止信号
signal_handler_wait();//等待信号通知
此时,主线程阻塞在信号处理器的等待信号接口上,
第五步,当收到用户从键盘发起的退出信号时,主线程将从等待信号接口处继续执行,调用停止协议服务接口:
http_server_stop(http_srv);
停止协议服务接口将完成停止网络栈、停止协议服务一系列操作。
至此,实施示例介绍完毕。
在本发明的协议处理层上,开发人员可以通过异步通信系统提供的能力,扩展出多种传输层以上的自定义网络协议。
表2
表3
表4
优选地,在上述任意实施例中,所述OS内核层具体包括:
设置I/O事件接口以及等待I/O事件接口。
优选地,在上述任意实施例中,所述步骤2具体为:
在所述网络栈层中,根据所述文件描述符建立非阻塞client_socket并分配内存池,在所述内存池中创建协议链接,将所述协议链接与所述非阻塞client_socket关联,对所述协议链接设置数据读取回调函数、数据写出回调函数以及错误通知回调函数,并对所述非阻塞client_socket设置超时时间,将所述协议链接放入所述协议处理层中的协议服务的链接队列中,通过所述负载均衡策略确定所述最优networker,将所述非阻塞client_socket作为参数设置F08,所述F08为启动客户套接字读事件回调函数,通过所述事件框架层,将所述启动客户套接字读事件回调函数包装成所述外部事件,将所述外部事件加入到最优networker的事件库的外部事件队列中,判断所述最优networker的线程是否为当前线程,如果判断结果为是,则向所述的最优networker的第一事件框架层的第一事件库的通知事件写入8字节的数据,所述第一事件框架层执行事件通知处理回调函数,如果判断结果为否,则所述第一网络栈层执行所述启动所述F08,通过预设超时原则判断所述非阻塞client_socket是否超时,若是,则执行所述错误通知回调函数,若否,则执行所述数据读取回调函数,并更新所述非阻塞client_socket的最后访问时刻,所述第一协议处理层执行所述数据读取回调函数,并将处理结果拼装成HTTP消息,发送至所述最优networker的第一业务处理层,所述最优networker通过负载均衡策略选定。
优选地,在上述任意实施例中,所述步骤3具体为:
在所述第一业务处理层中,通过消息接收回调函数,直接对所述HTTP消息进行处理,或将所述HTTP消息派发至应用程序自实现线程池进行处理,调用建立协议应答实例接口,在所述第一协议处理层中建立协议应答实例,通过所述第一业务处理层递交所述协议应答实例,所述第一协议处理层对所述协议应答实例以及所述HTTP消息进行封装,得到应答外部消息,所述事件框架层对所述应答外部消息进行处理。
优选地,在上述任意实施例中,还包括:
当信号处理器获取退出信号时,所述信号处理器将条件变量的广播通知发送至等待接口,所述业务处理层通过所述等待接口获取所述条件变量的广播通知,并调用所述协议处理层的停止协议服务接口,所述协议处理层依次进行停止协议服务的监听器队列、停止网络栈、释放网络栈以及释放协议服务。
需要说明的是,信号处理器属于独立的模块,用于接收停止信号,并唤醒应用程序的主线程。
如图2所示,一种支持负载均衡策略的异步通信系统,包括:
判断模块100,用于根据主networker的OS内核层监听到的数据流判断是否调用主networker的事件框架层对所述数据流进行处理,若判断结果为是,则根据所述数据流的文件描述符,在所述事件框架层的事件库中匹配相应的处理流程;
派发模块200,用于在主networker的网络栈层中,根据所述文件描述符创建链接,将所述处理流程包装成外部事件,将所述外部事件以及所述链接发送至最优networker的第一OS内核层进行事件唤醒,通过最优networker的第一网络栈层以及第一协议处理层对从主networker派发的外部事件以及所述链接进行处理,在所述第一协议处理层中将处理结果拼装成HTTP消息,发送至所述最优networker的第一业务处理层,所述最优networker通过负载均衡策略选定;
处理模块300,用于在所述第一业务处理层中,创建协议应答实例并发送至所述第一协议处理层中,通过所述第一网络栈层将所述HTTP消息以及所述协议应答实例包装成应答外部消息,将所述应答外部消息发送至所述事件框架层,所述事件框架层对所述应答外部消息进行处理。
在一些可能的实施方式中,通过负载均衡策略使得不同使用场景的应用程序,可选择不同的负载均衡策略,从而满足其个性化的网络I/O需求定制,通过将时间包装并由最优networker来处理的方式解决传统的网络应用程序的线程资源浪费问题。
优选地,在上述任意实施例中,所述OS内核层具体包括:
设置I/O事件接口以及等待I/O事件接口。
优选地,在上述任意实施例中,所述派发模块200具体用于:
在所述网络栈层中,根据所述文件描述符建立非阻塞client_socket并分配内存池,在所述内存池中创建协议链接,将所述协议链接与所述非阻塞client_socket关联,对所述协议链接设置数据读取回调函数、数据写出回调函数以及错误通知回调函数,并对所述非阻塞client_socket设置超时时间,将所述协议链接放入所述协议处理层中的协议服务的链接队列中,通过所述负载均衡策略确定所述最优networker,将所述非阻塞client_socket作为参数设置F08,所述F08为启动客户套接字读事件回调函数,通过所述事件框架层,将所述启动客户套接字读事件回调函数包装成所述外部事件,将所述外部事件加入到最优networker的事件库的外部事件队列中,判断所述最优networker的线程是否为当前线程,如果判断结果为是,则向所述的最优networker的第一事件框架层的第一事件库的通知事件写入8字节的数据,所述第一事件框架层执行事件通知处理回调函数,如果判断结果为否,则所述第一网络栈层执行所述启动所述F08,通过预设超时原则判断所述非阻塞client_socket是否超时,若是,则执行所述错误通知回调函数,若否,则执行所述数据读取回调函数,并更新所述非阻塞client_socket的最后访问时刻,所述第一协议处理层执行所述数据读取回调函数,并将处理结果拼装成HTTP消息,发送至所述最优networker的第一业务处理层,所述最优networker通过负载均衡策略选定。
优选地,在上述任意实施例中,所述处理模块300具体用于:
在所述第一业务处理层中,通过消息接收回调函数,直接对所述HTTP消息进行处理,或将所述HTTP消息派发至应用程序自实现线程池进行处理,调用建立协议应答实例接口,在所述第一协议处理层中建立协议应答实例,通过所述第一业务处理层递交所述协议应答实例,所述第一协议处理层对所述协议应答实例以及所述HTTP消息进行封装,得到应答外部消息,所述事件框架层对所述应答外部消息进行处理。
优选地,在上述任意实施例中,还包括:
停止模块,用于当信号处理器获取退出信号时,所述信号处理器将条件变量的广播通知发送至等待接口,所述业务处理层通过所述等待接口获取所述条件变量的广播通知,并调用所述协议处理层的停止协议服务接口,所述协议处理层依次进行停止协议服务的监听器队列、停止网络栈、释放网络栈以及释放协议服务。
本发明解决上述技术问题的另一种技术方案如下:一种存储介质,所述存储介质中存储有指令,当计算机读取所述指令时,使所述计算机执行如上述任一项所述的一种支持负载均衡策略的异步通信方法。
在一些可能的实施方式中,通过负载均衡策略使得不同使用场景的应用程序,可选择不同的负载均衡策略,从而满足其个性化的网络I/O需求定制,通过将时间包装并由最优networker来处理的方式解决传统的网络应用程序的线程资源浪费问题。
本发明解决上述技术问题的另一种技术方案如下:一种电子设备,包括上述存储介质、执行上述存储介质内的指令的处理器。
在一些可能的实施方式中,通过负载均衡策略使得不同使用场景的应用程序,可选择不同的负载均衡策略,从而满足其个性化的网络I/O需求定制,通过将时间包装并由最优networker来处理的方式解决传统的网络应用程序的线程资源浪费问题。
读者应理解,在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不必针对的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任一个或多个实施例或示例中以合适的方式结合。此外,在不相互矛盾的情况下,本领域的技术人员可以将本说明书中描述的不同实施例或示例以及不同实施例或示例的特征进行结合和组合。
在本申请所提供的几个实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的方法实施例仅仅是示意性的,例如,步骤的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个步骤可以结合或者可以集成到另一个步骤,或一些特征可以忽略,或不执行。
上述方法如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分,或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,RandomAccessMemory)、磁碟或者光盘等各种可以存储程序代码的介质。
以上,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到各种等效的修改或替换,这些修改或替换都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。
Claims (8)
1.一种支持负载均衡策略的异步通信方法,其特征在于,包括:
步骤1,根据主networker的OS内核层监听到的数据流判断是否调用主networker的事件框架层对所述数据流进行处理,若判断结果为是,则根据所述数据流的文件描述符,在所述事件框架层的事件库中匹配相应的处理流程;
步骤2,在主networker的网络栈层中,根据所述文件描述符创建链接,将所述处理流程包装成外部事件,将所述外部事件以及所述链接发送至最优networker的第一OS内核层进行事件唤醒,通过最优networker的第一网络栈层以及第一协议处理层对从主networker派发的外部事件以及所述链接进行处理,在所述第一协议处理层中将处理结果拼装成HTTP消息,发送至所述最优networker的第一业务处理层,所述最优networker通过负载均衡策略选定;
步骤3,在所述第一业务处理层中,创建协议应答实例并发送至所述第一协议处理层中,通过所述第一网络栈层将所述HTTP消息以及所述协议应答实例包装成应答外部消息,将所述应答外部消息发送至所述事件框架层,所述事件框架层对所述应答外部消息进行处理;
所述步骤2具体为:
在所述网络栈层中,根据所述文件描述符建立非阻塞client_socket并分配内存池,在所述内存池中创建协议链接,将所述协议链接与所述非阻塞client_socket关联,对所述协议链接设置数据读取回调函数、数据写出回调函数以及错误通知回调函数,并对所述非阻塞client_socket设置超时时间,将所述协议链接放入所述协议处理层中的协议服务的链接队列中,通过所述负载均衡策略确定所述最优networker,将所述非阻塞client_socket作为参数设置F08,所述F08为启动客户套接字读事件回调函数,通过所述事件框架层,将所述启动客户套接字读事件回调函数包装成所述外部事件,将所述外部事件加入到最优networker的事件库的外部事件队列中,判断所述最优networker的线程是否为当前线程,如果判断结果为是,则向所述的最优networker的第一事件框架层的第一事件库的通知事件写入8字节的数据,所述第一事件框架层执行事件通知处理回调函数,如果判断结果为否,则所述第一网络栈层执行所述启动所述F08,通过预设超时原则判断所述非阻塞client_socket是否超时,若是,则执行所述错误通知回调函数,若否,则执行所述数据读取回调函数,并更新所述非阻塞client_socket的最后访问时刻,所述第一协议处理层执行所述数据读取回调函数,并将处理结果拼装成HTTP消息,发送至所述最优networker的第一业务处理层,所述最优networker通过负载均衡策略选定。
2.根据权利要求1所述的一种支持负载均衡策略的异步通信方法,其特征在于,所述OS内核层具体包括:
设置I/O事件接口以及等待I/O事件接口。
3.根据权利要求1所述的一种支持负载均衡策略的异步通信方法,其特征在于,所述步骤3具体为:
在所述第一业务处理层中,通过消息接收回调函数,直接对所述HTTP消息进行处理,或将所述HTTP消息派发至应用程序自实现线程池进行处理,调用建立协议应答实例接口,在所述第一协议处理层中建立协议应答实例,通过所述第一业务处理层递交所述协议应答实例,所述第一协议处理层对所述协议应答实例以及所述HTTP消息进行封装,得到应答外部消息,所述事件框架层对所述应答外部消息进行处理。
4.根据权利要求3所述的一种支持负载均衡策略的异步通信方法,其特征在于,还包括:
当信号处理器获取退出信号时,所述信号处理器将条件变量的广播通知发送至等待接口,所述业务处理层通过所述等待接口获取所述条件变量的广播通知,并调用所述协议处理层的停止协议服务接口,所述协议处理层依次进行停止协议服务的监听器队列、停止网络栈、释放网络栈以及释放协议服务。
5.一种支持负载均衡策略的异步通信系统,其特征在于,包括:
判断模块,用于根据主networker的OS内核层监听到的数据流判断是否调用主networker的事件框架层对所述数据流进行处理,若判断结果为是,则根据所述数据流的文件描述符,在所述事件框架层的事件库中匹配相应的处理流程;
派发模块,用于在主networker的网络栈层中,根据所述文件描述符创建链接,将所述处理流程包装成外部事件,将所述外部事件以及所述链接发送至最优networker的第一OS内核层进行事件唤醒,通过最优networker的第一网络栈层以及第一协议处理层对从主networker派发的外部事件以及所述链接进行处理,在所述第一协议处理层中将处理结果拼装成HTTP消息,发送至所述最优networker的第一业务处理层,所述最优networker通过负载均衡策略选定;
处理模块,用于在所述第一业务处理层中,创建协议应答实例并发送至所述第一协议处理层中,通过所述第一网络栈层将所述HTTP消息以及所述协议应答实例包装成应答外部消息,将所述应答外部消息发送至所述事件框架层,所述事件框架层对所述应答外部消息进行处理;
所述派发模块具体用于:
在所述网络栈层中,根据所述文件描述符建立非阻塞client_socket并分配内存池,在所述内存池中创建协议链接,将所述协议链接与所述非阻塞client_socket关联,对所述协议链接设置数据读取回调函数、数据写出回调函数以及错误通知回调函数,并对所述非阻塞client_socket设置超时时间,将所述协议链接放入所述协议处理层中的协议服务的链接队列中,通过所述负载均衡策略确定所述最优networker,将所述非阻塞client_socket作为参数设置F08,所述F08为启动客户套接字读事件回调函数,通过所述事件框架层,将所述启动客户套接字读事件回调函数包装成所述外部事件,将所述外部事件加入到最优networker的事件库的外部事件队列中,判断所述最优networker的线程是否为当前线程,如果判断结果为是,则向所述的最优networker的第一事件框架层的第一事件库的通知事件写入8字节的数据,所述第一事件框架层执行事件通知处理回调函数,如果判断结果为否,则所述第一网络栈层执行所述启动所述F08,通过预设超时原则判断所述非阻塞client_socket是否超时,若是,则执行所述错误通知回调函数,若否,则执行所述数据读取回调函数,并更新所述非阻塞client_socket的最后访问时刻,所述第一协议处理层执行所述数据读取回调函数,并将处理结果拼装成HTTP消息,发送至所述最优networker的第一业务处理层,所述最优networker通过负载均衡策略选定。
6.根据权利要求5所述的一种支持负载均衡策略的异步通信系统,其特征在于,所述OS内核层具体包括:
设置I/O事件接口以及等待I/O事件接口。
7.一种存储介质,其特征在于,所述存储介质中存储有指令,当计算机读取所述指令时,使所述计算机执行如权利要求1至4中任一项所述的一种支持负载均衡策略的异步通信方法。
8.一种设备,其特征在于,包括权利要求7所述的存储介质、执行所述存储介质内的指令的处理器。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210686084.3A CN115412500B (zh) | 2022-06-16 | 2022-06-16 | 支持负载均衡策略的异步通信方法、系统、介质及设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210686084.3A CN115412500B (zh) | 2022-06-16 | 2022-06-16 | 支持负载均衡策略的异步通信方法、系统、介质及设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN115412500A CN115412500A (zh) | 2022-11-29 |
CN115412500B true CN115412500B (zh) | 2024-05-28 |
Family
ID=84157144
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210686084.3A Active CN115412500B (zh) | 2022-06-16 | 2022-06-16 | 支持负载均衡策略的异步通信方法、系统、介质及设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115412500B (zh) |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103164256A (zh) * | 2011-12-08 | 2013-06-19 | 深圳市快播科技有限公司 | 一种实现单机支持高并发处理方法及系统 |
CN106850829A (zh) * | 2017-02-28 | 2017-06-13 | 苏州星熙数据科技有限公司 | 一种基于非阻塞通信的微服务系统设计方法 |
CN108055255A (zh) * | 2017-12-07 | 2018-05-18 | 华东师范大学 | 一种事件库、可扩展数据管理系统及其管理方法 |
CN108459915A (zh) * | 2018-01-31 | 2018-08-28 | 中电福富信息科技有限公司 | 一种适用于高并发场景的tcp通道管理系统及其方法 |
CN111277672A (zh) * | 2020-03-31 | 2020-06-12 | 上海积成能源科技有限公司 | 一种基于非阻塞输入输出模型的能源物联网数据采集方法和软件网关 |
CN112954006A (zh) * | 2021-01-26 | 2021-06-11 | 重庆邮电大学 | 支持Web高并发访问的工业互联网边缘网关设计方法 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7219346B2 (en) * | 2000-12-05 | 2007-05-15 | Microsoft Corporation | System and method for implementing a client side HTTP stack |
US9965330B2 (en) * | 2015-09-18 | 2018-05-08 | Salesforce.Com, Inc. | Maintaining throughput of a stream processing framework while increasing processing load |
US11074078B2 (en) * | 2018-05-07 | 2021-07-27 | Micron Technology, Inc. | Adjustment of load access size by a multi-threaded, self-scheduling processor to manage network congestion |
-
2022
- 2022-06-16 CN CN202210686084.3A patent/CN115412500B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103164256A (zh) * | 2011-12-08 | 2013-06-19 | 深圳市快播科技有限公司 | 一种实现单机支持高并发处理方法及系统 |
CN106850829A (zh) * | 2017-02-28 | 2017-06-13 | 苏州星熙数据科技有限公司 | 一种基于非阻塞通信的微服务系统设计方法 |
CN108055255A (zh) * | 2017-12-07 | 2018-05-18 | 华东师范大学 | 一种事件库、可扩展数据管理系统及其管理方法 |
CN108459915A (zh) * | 2018-01-31 | 2018-08-28 | 中电福富信息科技有限公司 | 一种适用于高并发场景的tcp通道管理系统及其方法 |
CN111277672A (zh) * | 2020-03-31 | 2020-06-12 | 上海积成能源科技有限公司 | 一种基于非阻塞输入输出模型的能源物联网数据采集方法和软件网关 |
CN112954006A (zh) * | 2021-01-26 | 2021-06-11 | 重庆邮电大学 | 支持Web高并发访问的工业互联网边缘网关设计方法 |
Non-Patent Citations (3)
Title |
---|
A Dynamic Multi-Threaded Queuing Mechanism for Reducing the Inter-Process Communication Latency on Multi-Core Chips;Rohitshankar Mishra等;2020 3rd International Conference on Data Intelligence and Security (ICDIS);20210120;全文 * |
Linux下一种多核网络服务器模型设计与实现;杨小宇;杨斌;;成都信息工程学院学报;20101215(06);全文 * |
多线程Web应用中Web Worker池的管理方案与性能研究;王硕 等;万方;20180110;全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN115412500A (zh) | 2022-11-29 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Marty et al. | Snap: A microkernel approach to host networking | |
Daglis et al. | RPCValet: NI-driven tail-aware balancing of µs-scale RPCs | |
WO2015096656A1 (zh) | 线程创建方法、业务请求处理方法及相关设备 | |
US8270299B2 (en) | Communicator-based token/buffer management for eager protocol support in collective communication operations | |
CN101354693B (zh) | 一种异构多核处理器的核间通信调度系统及方法 | |
CN109697122B (zh) | 任务处理方法、设备及计算机存储介质 | |
US20060026169A1 (en) | Communication method with reduced response time in a distributed data processing system | |
CN106161537A (zh) | 远程过程调用的处理方法、装置、系统及电子设备 | |
US20120324460A1 (en) | Thread Execution in a Computing Environment | |
CN109445944A (zh) | 一种基于dpdk的网络数据采集处理系统及其方法 | |
TW201238295A (en) | A method and system for improved multi-cell support on a single modem board | |
US9104488B2 (en) | Support server for redirecting task results to a wake-up server | |
US20040055002A1 (en) | Application connector parallelism in enterprise application integration systems | |
EP2838243A1 (en) | Capability aggregation and exposure method and system | |
US20140068165A1 (en) | Splitting a real-time thread between the user and kernel space | |
WO2023046141A1 (zh) | 一种数据库网络负载性能的加速框架、加速方法及设备 | |
CN107122233A (zh) | 一种面向tsn业务的多vcpu自适应实时调度方法 | |
CN111427751A (zh) | 基于异步处理机制对业务进行处理的方法及系统 | |
WO2021022964A1 (zh) | 一种基于多核系统的任务处理方法、装置及计算机可读存储介质 | |
WO2021120633A1 (zh) | 一种负载均衡方法及相关设备 | |
WO2023071576A1 (zh) | 容器集群构建方法及系统 | |
CN111586140A (zh) | 一种数据交互的方法及服务器 | |
Su et al. | Pipedevice: a hardware-software co-design approach to intra-host container communication | |
CN114371935A (zh) | 网关处理方法、网关、设备及介质 | |
CN115412500B (zh) | 支持负载均衡策略的异步通信方法、系统、介质及设备 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |