CN113886082A - 请求处理方法、装置、计算设备及介质 - Google Patents

请求处理方法、装置、计算设备及介质 Download PDF

Info

Publication number
CN113886082A
CN113886082A CN202111155061.1A CN202111155061A CN113886082A CN 113886082 A CN113886082 A CN 113886082A CN 202111155061 A CN202111155061 A CN 202111155061A CN 113886082 A CN113886082 A CN 113886082A
Authority
CN
China
Prior art keywords
call
request
target
call request
service
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.)
Pending
Application number
CN202111155061.1A
Other languages
English (en)
Inventor
焦广才
裴中率
朱一飞
刘源
姚盛楠
金林强
王永亮
陈人树
杨群芳
罗琛
张鑫
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Hangzhou Netease Cloud Music Technology Co Ltd
Original Assignee
Hangzhou Netease Cloud Music Technology Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Hangzhou Netease Cloud Music Technology Co Ltd filed Critical Hangzhou Netease Cloud Music Technology Co Ltd
Priority to CN202111155061.1A priority Critical patent/CN113886082A/zh
Publication of CN113886082A publication Critical patent/CN113886082A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/50Allocation of resources, e.g. of the central processing unit [CPU]
    • G06F9/5061Partitioning or combining of resources
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/50Allocation of resources, e.g. of the central processing unit [CPU]
    • G06F9/5005Allocation of resources, e.g. of the central processing unit [CPU] to service a request
    • G06F9/5027Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • G06F9/542Event management; Broadcasting; Multicasting; Notifications
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • G06F9/546Message passing systems or structures, e.g. queues
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • G06F9/547Remote procedure calls [RPC]; Web services
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2209/00Indexing scheme relating to G06F9/00
    • G06F2209/50Indexing scheme relating to G06F9/50
    • G06F2209/5011Pool
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2209/00Indexing scheme relating to G06F9/00
    • G06F2209/50Indexing scheme relating to G06F9/50
    • G06F2209/5018Thread allocation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2209/00Indexing scheme relating to G06F9/00
    • G06F2209/54Indexing scheme relating to G06F9/54
    • G06F2209/548Queue
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2209/00Indexing scheme relating to G06F9/00
    • G06F2209/54Indexing scheme relating to G06F9/54
    • G06F2209/549Remote execution

Abstract

本公开的实施方式提供了一种请求处理方法、装置、计算设备及介质。该方法包括:在接收到调用请求且有界缓存区的缓存未满的情况下,将调用请求对应的调用事件存储至有界缓存区中,以便在线程池中存在空闲线程的情况下,从有界缓存区中获取目标调用事件来进行处理,使得服务调用者无需等待服务被调用者反馈结果,即可继续处理下一个请求,而采用有界缓存区存储请求,可以减少因缓存溢出带来的服务中断的风险。而在向服务被调用者发送含有目标调用事件的调用请求,以使服务被调用者对目标调用事件进行处理时,设置发送调用请求的速度不大于设定速度阈值,使得调用者发送的请求能够及时得到处理,提高对多个请求的并发处理能力,提高请求处理速度。

Description

请求处理方法、装置、计算设备及介质
技术领域
本公开的实施方式涉及计算机技术领域,更具体地,本公开的实施方式涉及一种请求处理方法、装置、计算设备及介质。
背景技术
本部分旨在为权利要求书中陈述的本公开的实施方式提供背景或上下文。此处的描述不因为包括在本部分中就承认是现有技术。
随着计算机技术和网络技术的不断发展,终端能为用户提供的服务越来越多样化,相应地,用户的访问量也越来越大。
相关技术中,为了提高响应用户请求的速度,服务器往往会采用并发服务架构,来对终端发送的多个请求并行进行处理,此时,如何提高服务器所能提供的并发处理能力,从而提高请求处理速度,成为请求处理过程中的一个重要研究方向。
发明内容
有鉴于此,本公开的实施例至少提供一种请求处理方法、装置、计算设备及介质,以提高服务器对多个请求的并发处理能力,从而提高请求处理速度。
在本公开实施方式的第一方面中,提供了一种请求处理方法,该方法包括:
响应于接收到调用请求,在有界缓存区的缓存未满的情况下,将调用请求对应的调用事件存储至有界缓存区中,有界缓存区用于存储至少一个调用事件;
在线程池中存在空闲线程的情况下,从有界缓存区中获取目标调用事件,线程池包括至少一个线程,通过至少一个线程处理至少一个调用事件;
向服务被调用者发送含有目标调用事件的调用请求,以使服务被调用者基于接收到的调用请求对目标调用事件进行处理,其中,发送调用请求的速度不大于设定速度阈值,设定速度阈值基于服务被调用者对调用请求的处理速度确定。
在本公开的一个实施例中,有界缓存区为队列结构,有界缓存区设置有队列长度和队列容量,队列长度用于指示有界缓存区当前所存储的调用事件的数量,队列容量用于指示有界缓存区最多存储的调用事件的数量;
响应于接收到调用请求,在有界缓存区的缓存未满的情况下,将调用请求对应的调用事件存储至有界缓存区中,包括:
响应于接收到调用请求,基于调用请求生成调用事件;
在有界缓存区的队列长度小于队列容量的情况下,将调用事件存储至有界缓存区的队列尾部。
在本公开的一个实施例中,响应于接收到调用请求,基于调用请求生成调用事件,包括:
响应于接收到调用请求,基于调用请求确定调用参数、调用地址以及回调地址;
对调用参数、调用地址和回调地址进行封装,得到调用事件。
在本公开的一个实施例中,在线程池中存在空闲线程的情况下,从有界缓存区中获取目标调用事件,包括:
在线程池中存在空闲线程,且有界缓存区中存储有至少一个调用事件的情况下,从有界缓存区的队列头部获取目标调用事件。
在本公开的一个实施例中,目标调用事件对应于目标调用参数、目标调用地址和目标回调地址;
向服务被调用者发送含有目标调用事件的调用请求,包括:
为目标调用事件生成目标序列号,目标序列号用于标识目标调用事件;
向目标调用地址对应的服务被调用者发送调用请求,调用请求携带目标调用参数、目标回调地址和目标序列号。
在本公开的一个实施例中,向服务被调用者发送含有目标调用事件的调用请求,以使服务被调用者基于接收到的调用请求对目标调用事件进行处理之后,该方法还包括:
在目标时长内未接收到服务被调用者返回的响应数据的情况下,向目标调用地址对应的服务被调用者发送反向查询请求,由服务被调用者基于反向查询请求返回响应数据,反向查询请求携带目标调用参数、目标回调地址和目标序列号。
在本公开的一个实施例中,该方法还包括:
响应于接收到调用请求,在有界缓存区的缓存已满的情况下,返回第一预设响应数据,第一预设响应数据对应于预先设置的第一默认页面。
在本公开的一个实施例中,该方法还包括:
在线程池中不存在空闲线程的情况下,返回第二预设响应数据,第二预设响应数据对应于预先设置的第二默认页面。
在本公开的一个实施例中,该方法还包括:
将设定速度阈值预先存储在数据库中;
在服务调用者开始运行的情况下,从数据库中读取设定速度阈值,并将读取到的设定速度阈值存储在内存中。
在本公开的一个实施例中,该方法还包括:
通过配置接口接收设定速度阈值的修改数据;
根据修改数据修改数据库中和内存中存储的设定速度阈值。
在本公开的一个实施例中,该方法还包括:
在发送调用请求的速度大于设定速度阈值的情况下,返回第三预设响应数据,第三预设响应数据对应于预先设置的第三默认页面。
在本公开的一个实施例中,在为目标调用事件生成目标序列号之前,该方法还包括:
以第一预设时间间隔生成令牌,第一预设时间间隔根据设定速度阈值确定;
响应于获取到目标调用事件,为空闲线程分配令牌;
在空闲线程接收到令牌的情况下,为目标调用事件生成目标序列号,并向目标调用地址对应的服务被调用者发送调用请求。
在本公开的一个实施例中,该方法还包括:
在空闲线程未被分配到令牌的情况下,返回第四预设响应数据,第四预设响应数据对应于预先设置的第四默认页面。
在本公开的一个实施例中,该方法还包括:
响应于接收到下一个调用请求,在有界缓存区的缓存未满的情况下,将下一个调用请求存储至有界缓存区中。
在本公开实施方式的第二方面中,提供了一种请求处理方法,该方法包括:
接收服务调用者的调用请求;
在第一有界缓存区的缓存未满的情况下,将调用请求存储至第一有界缓存区中,其中,存储调用请求的速度不大于第一速度阈值,第一速度阈值基于对调用请求的处理速度确定,第一有界缓存区用于存储至少一个调用请求;
在线程池中存在空闲线程的情况下,从第一有界缓存区中获取目标调用请求,对目标调用请求进行响应,线程池包括至少一个线程,通过至少一个线程处理至少一个调用请求。
在本公开的一个实施例中,第一有界缓存区为队列结构,第一有界缓存区设置有队列长度和队列容量,队列长度用于指示第一有界缓存区当前所存储的调用请求的数量,队列容量用于指示第一有界缓存区最多存储的调用请求的数量;
在第一有界缓存区的缓存未满的情况下,将调用请求存储至第一有界缓存区中,包括:
在第一有界缓存区的当前队列长度小于队列容量的情况下,将调用请求存储至第一有界缓存区的队列尾部。
在本公开的一个实施例中,在线程池中存在空闲线程的情况下,从第一有界缓存区中获取目标调用请求,包括:
在线程池中存在空闲线程的情况下,从第一有界缓存区的队列头部,获取目标调用请求。
在本公开的一个实施例中,该方法还包括:
将第一速度阈值存储在数据库中;
在服务被调用者开始运行的情况下,从数据库中读取第一速度阈值,并将读取到的第一速度阈值存储在内存中。
在本公开的一个实施例中,该方法还包括:
通过配置接口接收第一速度阈值的修改数据;
根据修改数据修改数据库中和内存中存储的第一速度阈值。
在本公开的一个实施例中,目标调用请求携带目标调用事件的目标调用参数、目标回调地址和目标序列号;
对目标调用请求进行响应,包括:
响应于服务被调用者无需调用第三方服务,基于目标调用参数构造目标调用事件的响应数据,将目标序列号对应的响应数据发送给目标回调地址所对应的服务调用者。
在本公开的一个实施例中,该方法还包括:
响应于服务被调用者需要调用第三方服务,在第二有界缓存区的缓存未满的情况下,将调用请求对应的调用事件存储至第二有界缓存区中,第二有界缓存区用于存储至少一个调用事件;
在线程池中存在空闲线程的情况下,从第二有界缓存区中获取目标调用事件,通过线程池所包括的至少一个线程处理至少一个调用事件;
向第三方服务对应的设备发送含有目标调用事件的调用请求,以使第三方服务对应的设备基于接收到的调用请求对目标调用事件进行处理,其中,发送调用请求的速度不大于第二速度阈值,第二速度阈值基于第三方服务对应的设备对调用请求的处理速度确定。
在本公开的一个实施例中,该方法还包括:
接收服务调用者发送的反向查询请求,反向查询请求携带待查询的调用请求的调用参数、回调地址和序列号;
基于调用参数,获取序列号对应的调用请求的响应数据,向回调地址所对应的服务调用者发送序列号所对应的响应数据。
在本公开的一个实施例中,该方法还包括:
在存储调用请求的速度大于第一速度阈值的情况下,返回第五预设响应数据,第五预设响应数据对应于预先设置的第五默认页面。
在本公开的一个实施例中,接收服务调用者的调用请求之后,该方法还包括:
以第二预设时间间隔生成令牌,并向调用请求分配令牌,第二预设时间间隔根据第一速度阈值确定;
在调用请求被分配到令牌,且第一有界缓存区的缓存未满的情况下,将调用请求存储至第一有界缓存区中。
在本公开的一个实施例中,该方法还包括:
在调用请求未被分配到令牌的情况下,返回第六预设响应数据,第六预设响应数据对应于预先设置的第六默认页面。
在本公开的一个实施例中,该方法还包括:
在第一有界缓存区的缓存已满的情况下,返回第七预设响应数据,第七预设响应数据对应于预先设置好的第七默认页面。
在本公开的一个实施例中,该方法还包括:
在线程池中不存在空闲线程的情况下,返回第八预设响应数据,第八预设响应数据对应于预先设置好的第八默认页面。
在本公开的一个实施例中,线程池包括第一线程池和第二线程池;
其中,第一线程池中的第一线程用于接收服务调用者的调用请求;在第一有界缓存区的缓存未满的情况下,将调用请求存储至第一有界缓存区中;
第二线程池中的第二线程用于在线程池中存在空闲线程的情况下,从第一有界缓存区中获取目标调用请求,对目标调用请求进行响应。
在本公开实施方式的第三方面中,提供了一种请求处理装置,该装置包括:
存储单元,用于响应于接收到调用请求,在有界缓存区的缓存未满的情况下,将调用请求对应的调用事件存储至有界缓存区中,有界缓存区用于存储至少一个调用事件;
获取单元,用于在线程池中存在空闲线程的情况下,从有界缓存区中获取目标调用事件,线程池包括至少一个线程,通过至少一个线程处理述至少一个调用事件;
发送单元,用于向服务被调用者发送含有目标调用事件的调用请求,以使服务被调用者基于接收到的调用请求对目标调用事件进行处理,其中,发送调用请求的速度不大于设定速度阈值,设定速度阈值基于服务被调用者对调用请求的处理速度确定。
在本公开的一个实施例中,有界缓存区为队列结构,有界缓存区设置有队列长度和队列容量,队列长度用于指示有界缓存区当前所存储的调用事件的数量,队列容量用于指示有界缓存区最多存储的调用事件的数量;
该存储单元,在用于响应于接收到调用请求,在有界缓存区的缓存未满的情况下,将调用请求对应的调用事件存储至有界缓存区中时,包括生成子单元和存储子单元:
该生成子单元,用于响应于接收到调用请求,基于调用请求生成调用事件;
该存储子单元,用于在有界缓存区的队列长度小于队列容量的情况下,将调用事件存储至有界缓存区的队列尾部。
在本公开的一个实施例中,该生成子单元,在用于响应于接收到调用请求,基于调用请求生成调用事件时,用于:
响应于接收到调用请求,基于调用请求确定调用参数、调用地址以及回调地址;
对调用参数、调用地址和回调地址进行封装,得到调用事件。
在本公开的一个实施例中,该获取单元,在用于在线程池中存在空闲线程的情况下,从有界缓存区中获取目标调用事件时,用于:
在线程池中存在空闲线程,且有界缓存区中存储有至少一个调用事件的情况下,从有界缓存区的队列头部获取目标调用事件。
在本公开的一个实施例中,目标调用事件对应于目标调用参数、目标调用地址和目标回调地址;
该发送单元,在用于向服务被调用者发送含有目标调用事件的调用请求时,用于:
为目标调用事件生成目标序列号,目标序列号用于标识目标调用事件;
向目标调用地址对应的服务被调用者发送调用请求,调用请求携带目标调用参数、目标回调地址和目标序列号。
在本公开的一个实施例中,该发送单元,还用于在目标时长内未接收到服务被调用者返回的响应数据的情况下,向目标调用地址对应的服务被调用者发送反向查询请求,由服务被调用者基于反向查询请求返回响应数据,反向查询请求携带目标调用参数、目标回调地址和目标序列号。
在本公开的一个实施例中,该装置还包括:
第一返回单元,用于响应于接收到调用请求,在有界缓存区的缓存已满的情况下,返回第一预设响应数据,第一预设响应数据对应于预先设置的第一默认页面。
在本公开的一个实施例中,该装置还包括:
第二返回单元,用于在线程池中不存在空闲线程的情况下,返回第二预设响应数据,第二预设响应数据对应于预先设置的第二默认页面。
在本公开的一个实施例中,该存储单元,还用于将设定速度阈值预先存储在数据库中;
该装置还包括:
读取单元,用于在服务调用者开始运行的情况下,从数据库中读取设定速度阈值;
该存储单元,还用于将读取到的设定速度阈值存储在内存中。
在本公开的一个实施例中,该装置还包括:
接收单元,用于通过配置接口接收设定速度阈值的修改数据;
修改单元,用于根据修改数据修改数据库中和内存中存储的设定速度阈值。
在本公开的一个实施例中,该装置还包括:
第三返回单元,用于在发送调用请求的速度大于设定速度阈值的情况下,返回第三预设响应数据,第三预设响应数据对应于预先设置的第三默认页面。
在本公开的一个实施例中,该装置还包括:
令牌生成单元,用于以第一预设时间间隔生成令牌,第一预设时间间隔根据设定速度阈值确定;
分配单元,用于响应于获取到目标调用事件,为空闲线程分配令牌;
序列号生成单元,用于在空闲线程接收到令牌的情况下,为目标调用事件生成目标序列号,并向目标调用地址对应的服务被调用者发送调用请求。
在本公开的一个实施例中,该存储单元,还用于响应于接收到下一个调用请求,在有界缓存区的缓存未满的情况下,将下一个调用请求存储至有界缓存区中。
在本公开实施方式的第四方面中,提供了一种请求处理装置,该装置包括:
接收单元,用于接收服务调用者的调用请求;
存储单元,用于在第一有界缓存区的缓存未满的情况下,将调用请求存储至第一有界缓存区中,其中,存储调用请求的速度不大于第一速度阈值,第一速度阈值基于对调用请求的处理速度确定,第一有界缓存区用于存储至少一个调用请求;
获取单元,用于在线程池中存在空闲线程的情况下,从第一有界缓存区中获取目标调用请求,线程池包括至少一个线程,通过至少一个线程处理至少一个调用请求;
响应单元,用于对目标调用请求进行响应。
在本公开的一个实施例中,第一有界缓存区为队列结构,第一有界缓存区设置有队列长度和队列容量,队列长度用于指示第一有界缓存区当前所存储的调用请求的数量,队列容量用于指示第一有界缓存区最多存储的调用请求的数量;
该存储单元,在用于在第一有界缓存区的缓存未满的情况下,将调用请求存储至第一有界缓存区中时,用于:
在第一有界缓存区的当前队列长度小于队列容量的情况下,将调用请求存储至第一有界缓存区的队列尾部。
在本公开的一个实施例中,该获取单元,在用于在线程池中存在空闲线程的情况下,从第一有界缓存区中获取目标调用请求时,用于:
在线程池中存在空闲线程的情况下,从第一有界缓存区的队列头部,获取目标调用请求。
在本公开的一个实施例中,该存储单元,还用于将第一速度阈值存储在数据库中;
该装置还包括:
读取单元,用于在服务被调用者开始运行的情况下,从数据库中读取第一速度阈值;
该存储单元,还用于将读取到的第一速度阈值存储在内存中。
在本公开的一个实施例中,该接收单元,还用于通过配置接口接收第一速度阈值的修改数据;
该装置还包括:
修改单元,用于根据修改数据修改数据库中和内存中存储的第一速度阈值。
在本公开的一个实施例中,目标调用请求携带目标调用事件的目标调用参数、目标回调地址和目标序列号;
该响应单元,在用于对目标调用请求进行响应时,用于:
响应于服务被调用者无需调用第三方服务,基于目标调用参数构造目标调用事件的响应数据,将目标序列号对应的响应数据发送给目标回调地址所对应的服务调用者。
在本公开的一个实施例中,该存储单元,还用于响应于服务被调用者需要调用第三方服务,在第二有界缓存区的缓存未满的情况下,将调用请求对应的调用事件存储至第二有界缓存区中,第二有界缓存区用于存储至少一个调用事件;
该获取单元,还用于在线程池中存在空闲线程的情况下,从第二有界缓存区中获取目标调用事件,通过线程池所包括的至少一个线程处理至少一个调用事件;
该装置还包括:
发送单元,用于向第三方服务对应的设备发送含有目标调用事件的调用请求,以使第三方服务对应的设备基于接收到的调用请求对目标调用事件进行处理,其中,发送调用请求的速度不大于第二速度阈值,第二速度阈值基于第三方服务对应的设备对调用请求的处理速度确定。
在本公开的一个实施例中,该接收单元,还用于接收服务调用者发送的反向查询请求,反向查询请求携带待查询的调用请求的调用参数、回调地址和序列号;
该获取单元,还用于基于调用参数,获取序列号对应的调用请求的响应数据,向回调地址所对应的服务调用者发送序列号所对应的响应数据。
在本公开的一个实施例中,该装置还包括:
第五返回单元,用于在存储调用请求的速度大于第一速度阈值的情况下,返回第五预设响应数据,第五预设响应数据对应于预先设置的第五默认页面。
在本公开的一个实施例中,该装置还包括:
生成单元,用于以第二预设时间间隔生成令牌,并向调用请求分配令牌,第二预设时间间隔根据第一速度阈值确定;
在调用请求被分配到令牌,且第一有界缓存区的缓存未满的情况下,将调用请求存储至第一有界缓存区中。
在本公开的一个实施例中,该装置还包括:
第六返回单元,用于在调用请求未被分配到令牌的情况下,返回第六预设响应数据,第六预设响应数据对应于预先设置的第六默认页面。
在本公开的一个实施例中,该装置还包括:
第七返回单元,用于在第一有界缓存区的缓存已满的情况下,返回第七预设响应数据,第七预设响应数据对应于预先设置好的第七默认页面。
在本公开的一个实施例中,该装置还包括:
第八返回单元,用于在线程池中不存在空闲线程的情况下,返回第八预设响应数据,第八预设响应数据对应于预先设置好的第八默认页面。
在本公开的一个实施例中,线程池包括第一线程池和第二线程池;
其中,第一线程池中的第一线程用于接收服务调用者的调用请求;在第一有界缓存区的缓存未满的情况下,将调用请求存储至第一有界缓存区中;
第二线程池中的第二线程用于在线程池中存在空闲线程的情况下,从第一有界缓存区中获取目标调用请求,对目标调用请求进行响应。
在本公开实施方式的第五方面中,提供了一种计算设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其中,处理器执行计算机程序时实现上述请求处理方法所执行的操作。
根据本说明书实施例的第六方面,提供一种计算机可读存储介质,计算机可读存储介质上存储有程序,程序被处理器执行上述请求处理方法所执行的操作。
根据本说明书实施例的第七方面,提供一种计算机程序产品,包括计算机程序,程序被处理器执行时实现上述请求处理方法所执行的操作。
根据本公开实施方式的请求处理方法、装置、计算设备及介质,可以在接收到调用请求后,在有界缓存区缓存未满的情况下,先对调用请求进行存储,从而在线程池中存在空闲线程时,再对有界缓存区中已存储的请求进行处理,使得服务调用者无需等待服务被调用者反馈结果,即可继续处理下一个请求,而采用有界缓存区存储请求,可以减少因缓存溢出带来的服务中断的风险。而在向服务被调用者发送含有目标调用事件的调用请求,以使服务被调用者对目标调用事件进行处理时,设置发送调用请求的速度不大于设定速度阈值,使得调用者发送的请求均能够及时得到处理,提高对多个请求的并发处理能力,提高请求处理速度。
附图说明
通过参考附图阅读下文的详细描述,本公开示例性实施方式的上述以及其他目的、特征和优点将变得易于理解。在附图中,以示例性而非限制性的方式示出了本公开的若干实施方式,其中:
图1是本说明书根据一示例性实施例示出的一种请求处理方法的流程图;
图2是本说明书根据一示例性实施例示出的一种对有界缓存区进行读操作和写操作的流程图;
图3是本说明书根据一示例性实施例示出的一种目标序列号的结构示意图;
图4是本说明书根据一示例性实施例示出的另一种目标序列号的结构示意图;
图5是本说明书根据一示例性实施例示出的一种延迟队列的实现原理示意图;
图6是本说明书根据一示例性实施例示出的一种反向查询方法示意图;
图7是本说明书根据一示例性实施例示出的一种设定速度阈值的配置过程示意图;
图8是本说明书根据一示例性实施例示出的一种限流方法的原理示意图;
图9是本说明书根据一示例性实施例示出的另一种限流方法的原理示意图;
图10是本说明书根据一示例性实施例示出的一种服务调用者处理调用请求的流程图;
图11是本说明书根据一示例性实施例示出的一种回调通知事件的流程示意图;
图12是本说明书根据一示例性实施例示出的一种服务被调用者处理调用请求的流程图;
图13是本说明书根据一示例性实施例示出的一种请求处理方法的系统架构图;
图14是本说明书根据一示例性实施例示出的一种请求处理装置的框图;
图15是本说明书根据一示例性实施例示出的一种请求处理装置的框图;
图16是本说明书根据一示例性实施例示出的一种计算机可读存储介质的示意图;
图17是本说明书根据一示例性实施例示出的一种计算设备的结构示意图;
在附图中,相同或对应的标号表示相同或对应的部分。
具体实施方式
下面将参考若干示例性实施方式来描述本公开的原理和精神。应当理解,给出这些实施方式仅仅是为了使本领域技术人员能够更好地理解进而实现本公开,而并非以任何方式限制本公开的范围。相反,提供这些实施方式是为了使本公开更加透彻和完整,并且能够将本公开的范围完整地传达给本领域的技术人员。
本领域技术人员知道,本公开的实施方式可以实现为一种系统、装置、设备、方法或计算机程序产品。因此,本公开可以具体实现为以下形式,即:完全的硬件、完全的软件(包括固件、驻留软件、微代码等),或者硬件和软件结合的形式。
根据本公开的实施方式,提出了一种请求处理方法、装置、计算设备及介质。在本文中,需要理解的是,附图中的任何元素数量均用于示例而非限制,以及任何命名都仅用于区分,而不具有任何限制含义。
本公开实施例提出的请求处理方法可以由计算设备执行,计算设备可以为服务器,如一台服务器、多台服务器、服务器集群、云计算平台,等等,本公开实施例对计算设备的类型和数量均不加以限定。
上述为对本公开所涉及的系统架构的介绍,下面参考本公开的若干代表性实施方式,详细阐释本公开的原理和精神。
如图1所示,图1是本说明书根据一示例性实施例示出的一种请求处理方法的流程图,该方法包括以下步骤:
在步骤101中,服务调用者响应于接收到调用请求,在有界缓存区的缓存未满的情况下,将调用请求对应的调用事件存储至有界缓存区中。
其中,有界缓存区为在服务调用者的内存中开辟的一块内存区域,例如,在服务调用者的Java虚拟机(Java Virtual Machine,JVM)堆栈区中开辟一块内存区域,作为有界缓存区。有界缓存区包括但不限于有界阻塞队列(Blocking Queue)、分布式消息队列和带有优先级的缓存区,等等,本公开对有界缓存区的具体类型不加以限定。
该有界缓存区用于存储至少一个调用事件,服务调用者可以对有界缓存区进行读(Get)和写(Put)这两种操作。读操作用于从有界缓存区中获取调用事件,写操作用于将调用事件存储至有界缓存区中。
有界缓存区的存储空间的大小是预先设置好的,或者说,有界缓存区设置有预设的存储上限,有界缓存区所缓存的调用事件的数量小于或等于预设的存储上限。
例如,有界缓存区的数据结构可以参见下表1:
表1
类型 名称 类型 初始值
Type 类型 any NULL
Size 队列长度(当前容量大小) int 0
Capacity 队列容量(最大容量) int 2147483647
在一种可能的实现方式中,在接收到调用请求的情况下,通过确定有界缓存区已缓存的调用事件的数量是否达到预设的存储上限,以确定有界缓存区的缓存是否已满,从而在有界缓存区已缓存的调用事件的数量未达到预设的存储上限时,将所接收到的调用请求对应的调用事件,存储至有界缓存区中。
以有界缓存区的存储上限为1000个调用事件为例,在有界缓存区已缓存的调用事件的数量小于1000个的情况下,响应于接收到调用请求,将调用请求对应的调用事件存储至有界缓存区中。
通过采用有界缓存区来对调用事件进行存储,减少缓存区内存溢出情况的出现,从而减少服务中断情况的出现,提高服务性能。
在步骤102中,在服务调用者的线程池中存在空闲线程的情况下,服务调用者从有界缓存区中获取目标调用事件。
其中,服务调用者的线程池包括至少一个线程,通过线程池管理这至少一个线程,以便通过至少一个线程来处理至少一个调用事件。
在一种可能的实现方式中,在服务调用者的线程池中存在空闲线程的情况下,从有界缓存区中获取一个调用事件,作为目标调用事件。
在步骤103中,服务调用者向服务被调用者发送含有目标调用事件的调用请求,发送调用请求的速度不大于设定速度阈值。
其中,所述设定速度阈值基于服务被调用者对调用请求的处理速度确定,可以是将服务被调用者对调用请求的处理速度作为设定速度阈值,还可以是将小于服务被调用者对调用请求的处理速度的速度值,作为设定速度阈值,也即是,设定速度阈值可以为小于或等于服务被调用对调用请求的处理速度的任意速度值,本公开对设定速度阈值的具体取值不加以限定。
可选地,该设定速度阈值根据服务调用者及服务被调用者的处理能力,以及服务调用者和服务被调用者所处的业务场景预先设置,并在服务调用者中对预先设置好的设定速度阈值进行存储,以便在要发送调用请求时,可以直接获取到已存储的设定速度阈值,进而根据获取到的设定速度阈值,确定发送调用请求的速度。
通过向服务被调用者发送调用请求,以使服务被调用者通过下述步骤104至步骤106,基于接收到的调用请求对目标调用事件进行处理,具体过程参见下述步骤104至步骤106。
通过将发送调用请求的速度设置为不大于设定速度阈值,而设定速度阈值基于服务被调用者对调用请求的处理速度确定,以减少服务被调用者的响应能力达到瓶颈的这种情况的出现,从而保证服务调用者的请求能够得到快速响应,提高请求处理效率。
在步骤104中,服务被调用者接收服务调用者的调用请求。
在步骤105中,在第一有界缓存区的缓存未满的情况下,服务被调用者将调用请求存储至第一有界缓存区中,其中,存储调用请求的速度不大于第一速度阈值。
其中,第一有界缓存区为在服务被调用者的内存中开辟出的一块内存区域,用于存储至少一个调用请求,服务被调用者可以对第一有界缓存区进行读和写这两种操作。写操作用于将调用请求存储至第一有界缓存区中,读操作用于从第一有界缓存区中获取调用请求。
第一有界缓存区的存储空间的大小是预先设置好的,或者说,第一有界缓存区设置有预设的存储上限,第一有界缓存区所缓存的调用请求的数量小于或等于预设的存储上限。在一种示例性说明中,第一有界缓存区的相关介绍可以参见步骤101中对有界缓存区的介绍,此外,第一有界缓存区的数据结构也可以参见表1,此处不再赘述。
在一种可能的实现方式中,在接收到服务调用者的调用请求的情况下,通过确定第一有界缓存区已缓存的调用请求的数量是否达到预设的存储上限,以确定第一有界缓存区的缓存是否已满,从而在第一有界缓存区已缓存的调用请求的数量未达到预设的存储上限时,将所接收到的调用请求存储至第一有界缓存区中。
以第一有界缓存区的存储上限为800个调用请求为例,在有界缓存区已缓存的调用请求的数量小于800个的情况下,将从服务调用者处接收到的调用请求存储至第一有界缓存区中。
通过采用第一有界缓存区来对服务被调用者所接收到的调用请求进行存储,减少缓存区内存溢出情况的出现,从而减少服务中断情况的出现,提高服务性能。
其中,第一速度阈值基于对调用请求的处理速度确定,可以是将对调用请求的处理速度,作为第一速度阈值,还可以是将小于对调用请求的处理速度的速度值,作为第一速度阈值,也即是,第一速度阈值可以为小于或等于对调用请求的处理速度的任意速度值,本公开对第一速度阈值的具体取值不加以限定。
可选地,该第一速度阈值根据该服务被调用者的处理能力,以及服务被调用者所处的业务场景预先设置。在更多可能的实现方式中,在服务被调用者还需要调用第三方服务,才能实现对调用请求的处理的情况下,该第一速度阈值根据服务被调用者和服务被调用者所依赖的第三方服务的处理能力,以及服务被调用者和服务被调用者所依赖的第三方服务所处的业务场景预先设置。
在预先设置好第一速度阈值后,服务被调用者对预先设置好的第一速度阈值进行存储,以便在要对调用请求进行存储时,可以直接获取到已存储的第一速度阈值,进而根据获取到的第一速度阈值,确定存储调用请求的速度。
通过将存储调用请求的速度设置为不大于第一速度阈值,而设定速度阈值基于对调用请求的处理速度确定,以减少存储的调用请求数量过多,而服务被调用者的处理能力有限,无法及时对已存储的调用请求进行处理的情况的出现,从而保证服务调用者的请求能够得到快速响应,提高请求处理效率。
在步骤106中,在服务被调用者的线程池中存在空闲线程的情况下,服务被调用者从第一有界缓存区中获取目标调用请求,对目标调用请求进行响应。
其中,服务被调用者的线程池包括至少一个线程,通过线程池管理这至少一个线程,以便通过至少一个线程处理至少一个调用请求。
在一种可能的实现方式中,在服务被调用者的线程池中存在空闲线程的情况下,从第一有界缓存区中获取一个调用请求,作为目标调用请求,从而对获取到的目标调用请求进行响应。
本公开所提供的方案,在接收到调用请求且有界缓存区的缓存未满的情况下,将调用请求对应的调用事件存储至有界缓存区中,以便在线程池中存在空闲线程的情况下,从有界缓存区中获取目标调用事件来进行处理,使得服务调用者无需等待服务被调用者反馈结果,即可继续处理下一个请求。也即只要有界缓存区中存在调用事件,计算设备即可进行响应,无需像同步等待机制那样发生输入/输出(Input/Output,IO)、计算设备、锁等资源的等待操作,从而可以充分发挥计算设备的计算性能,以更少的服务资源提供更高的并发服务。
而采用有界缓存区存储请求,可以减少因缓存溢出带来的服务中断的风险;同时,在向服务被调用者发送含有目标调用事件的调用请求,以使服务被调用者对目标调用事件进行处理时,设置发送调用请求的速度不大于设定速度阈值。通过使用限速功能,不会因无限的调用而使被调用者资源耗竭,使服务更加可靠和安全,并在被调用者服务资源能力不足时,使被调用者能够快速及时响应调用者的服务,减少调用者的等待时间。
使得调用者发送的请求能够及时得到处理,提高对多个请求的并发处理能力,提高请求处理速度。
此外,本公开所提供的方案,无需关注线程池的容量与IO密集型作业或者是CPU密集型作业的关系,只需将线程池配置和当前CPU核数一样的大小即可,也即线程池可以使用与CPU大小相同或相近的线程池、线程组,从而可以降低并发服务的编程难度。
在介绍了本公开中服务调用者处理调用请求的基本原理之后,下面具体介绍本公开的各种非限制性实施方式。
在一些实施例中,服务调用者的有界缓存区为队列结构,有界缓存区设置有队列长度和队列容量,队列长度用于指示有界缓存区当前所存储的调用事件的数量,队列容量用于指示有界缓存区最多存储的调用事件的数量。
其中,有界缓存区的队列容量基于队列中每个单元的内存占用,以及用于开辟有界缓存区的内存区域的内存总容量确定。以用于开辟有界缓存区的内存区域为JVM堆栈区为例,有界缓存区的队列容量基于队列中每个单元的内存占用,以及JVM堆栈区的内存总容量确定,例如,设有界缓存区的队列容量为N,队列中每个单元的内存占用为X,JVM堆栈区的内存总容量为T,则有界缓存区的队列容量N满足0<N<(T/X)。
基于此,对于服务调用者来说,响应于接收到调用请求,在有界缓存区的缓存未满的情况下,将调用请求对应的调用事件存储至有界缓存区中,包括以下步骤:
在步骤1011中,响应于接收到调用请求,基于调用请求生成调用事件。
在一种可能的实现方式中,响应于接收到调用请求,基于调用请求确定调用参数、调用地址以及回调地址,进而对调用参数、调用地址和回调地址进行封装,得到调用事件。
其中,在基于调用请求确定调用参数、调用地址以及回调地址时,基于调用请求所对应的业务场景,以及服务调用者在该业务场景中的上下文信息,构造调用参数、调用地址和回调地址,从而实现调用参数、调用地址和回调地址的确定。
在步骤1012中,在有界缓存区的队列长度小于队列容量的情况下,将调用事件存储至有界缓存区的队列尾部。
在将调用事件存储至有界缓存区的队列尾部时,通过对有界缓存区进行写操作实现。
例如,有界缓存区的队列容量为1000个调用事件,而有界缓存区的队列长度为500,也即是,有界缓存区已经存储了500个调用事件,则服务调用者将所构建的调用事件,存储至有界缓存区中的第500个调用事件之后,成为有界缓存区中存储的第501个调用事件。
在一种可能的实现方式中,在将调用事件存储至有界缓存区的队列尾部后,在有界缓存区的当前队列长度的基础上,增加预设值,得到更新后的队列长度。其中,预设值为1。
仍以有界缓存区的队列长度为500为例,则在将第501个调用事件存储至有界缓存区中之后,在有界缓存区的当前队列长度500的基础上加1,得到更新后的队列长度501。
在一些实施例中,在线程池中存在空闲线程的情况下,从有界缓存区中获取目标调用事件,包括:
在线程池中存在空闲线程,且有界缓存区中存储有至少一个调用事件的情况下,从有界缓存区的队列头部获取目标调用事件。
也即是,在线程池中存在空闲线程,且有界缓存区中存储有至少一个调用事件的情况下,获取位于有界缓存区的队列首位的调用事件,作为目标调用事件。
其中,在从有界缓存区的队列头部获取目标调用事件时,通过对有界缓存区进行读操作实现。
在一种可能的实现方式中,在从有界缓存区的队列头部获取到目标调用事件的情况下,在有界缓存区的当前队列长度的基础上,减少预设值,得到更新后的队列长度。其中,预设值为1。
例如,有界缓存区原本的队列长度为300,则在从有界缓存区中获取到位于队列头部的目标调用事件之后,在有界缓存区的当前队列长度300的基础上减1,得到更新后的队列长度299。
上述过程是以有界缓存区的缓存未满的情况下的处理过程为例,来进行说明的,在更多可能的实现方式中,响应于接收到调用请求,在有界缓存区的缓存已满的情况下,返回第一预设响应数据,第一预设响应数据对应于预先设置的第一默认页面。
也即是,响应于接收到调用请求,在有界缓存区的队列长度大于等于队列容量的情况下,返回第一预设响应数据。此时,对有界缓存区的写操作失败。
可选地,第一默认页面与业务场景相关,例如,在电商秒杀场景(如手机抢购场景)中,第一默认页面可以为提示“排队中,请等待或者重试的页面”,还可以为“服务器繁忙,请稍后重试”等页面,本公开对此不加以限定。
通过在有界缓存区的缓存已满的情况下,直接返回第一预设响应数据,使得调用请求能够快速得到响应,从而提高请求处理效率,进而提高用户体验。仍以电商秒杀场景为例,在电商秒杀场景中,瞬间可能有几十万设甚至几百万、几千万的用户涌入,服务调用者处理压力非常大,服务调用者的处理能力达到瓶颈,此时通过向一部分用户设备返回第一预设响应数据,使得各个用户的请求均能得到响应。
其中,上述对有界缓存区进行读操作和写操作,以及基于读操作和写操作的执行结果,对有界缓存区的队列长度进行更新的过程可以参见图2,图2是本说明书根据一示例性实施例示出的一种对有界缓存区进行读操作和写操作的流程图。在对有界缓存区进行写操作时,响应于获取到一个要写入队列尾部的调用事件,在队列长度小于队列容量的情况下,将获取到的调用事件写入队列尾部,并将队列长度加1;而在队列长度大于或等于队列容量的情况下,调用事件写入失败。在对有界缓存区进行读操作时,在有界缓存区中已缓存的调用事件的数量大于0的情况下,从有界缓存区的队列头部获取一个调用事件,并将队列长度减1;在有界缓存区中已缓存的调用事件的数量小于或等于0的情况下,调用事件读取失败。
在另一些实施例中,在线程池中不存在空闲线程的情况下,返回第二预设响应数据,第二预设响应数据对应于预先设置的第二默认页面。
可选地,第二默认页面与业务场景相关,本公开对第二默认页面的具体类型不加以限定。
通过在线程池中不存在空闲线程的情况下,直接返回第二预设响应数据,使得调用请求能够快速得到响应,从而提高请求处理效率,进而提高用户体验。
在一些实施例中,目标调用事件对应于目标调用参数、目标调用地址和目标回调地址。
向服务被调用者发送含有目标调用事件的调用请求,包括以下步骤:
在步骤1031中,为目标调用事件生成目标序列号,目标序列号用于标识目标调用事件。
其中,目标序列号的生成过程可以由如下几种方式:
在一种可能的实现方式中,以获取到目标调用事件的时间戳作为目标序列号的前缀,以随机生成的随机数作为目标序列号的后缀,从而得到该目标序列号。
其中,在获取到目标调用事件的时间戳后,将时间戳转换为8字节的时间戳,从而以8字节的时间戳作为前缀。而在生成随机数时,通过Random.nextLong(N)指令实现,可选地,所生成的随机数为8字节的随机数,
对于Random.nextLong(N)指令,N为任意正整数值。需要说明的是,N值越大,所生成的随机数发生重复的概率越小,从而使得所生成的目标序列号发生重复的概率越小,例如,在N=100000000的情况下,在1秒时间内可以生成1亿个不同的随机数,也即是,在1秒时间内可以生成1亿个不同的序列号,则序列号发生重复的概率即为亿分之一。
通过上述方式生成的目标序列号的结构可以参见图3,图3是本说明书根据一示例性实施例示出的一种目标序列号的结构示意图,目标序列号的前缀为8字节的时间戳,后缀为8字节的随机数。
在另一种可能的实现方式中,利用关系型数据库管理系统(My Structured QueryLanguage,MySQL)所提供的主键自增功能,通过自增标识(Identity,ID)来生成目标序列号。
例如,使用远程字典服务(Remote Dictionary Server,Redis)的INCR命令,将所存储的键(Key)值加一,以得到目标序列号。可选地,若Key不存在,则将Key值初始化为0,进而在初始化得到的Key值的基础上,通过INCR命令,来进行目标序列号的生成。
需要说明的是,通过上述方式生成的目标序列号的值在64位(Bit)有符号数字的范围内。此外,由于每次都是在已有Key值的基础上加1,来实现目标序列号的生成,从而使得所生成的目标序列号不会出现重复。
在另一种可能的实现方式中,基于预先设定的标志位取值、目标调用事件对应的时间戳、预先设置的数据中心标识、预先设置的机器标识以及自增序号,生成目标序列号。
其中,预先设置的标志位为1位,标志位的取值能够指示目标序列号的正负,正数为0,负数为1,而一般生成的目标序列号均为正数,因而一般情况下,标志位取值为0。
目标调用事件对应的时间戳采用当前时间与固定开始时间的差值,作为时间戳。可选地,该时间戳为41位的毫秒级时间。
其中,固定开始时间为任意时间。通过采用当前时间与固定开始时间的差值,作为时间戳,可以使所产生的时间戳更小,进而使得所生成的目标序列号更小,进而增加能够产生的目标序列号的数量,从而提高目标序列号的生成效率。
预先设置的数据中心标识、预先设置的机器标识可以指示目标序列号对应的节点,数据中心标识和机器标识组合后即为节点标识。可选地,预先设置的数据中心标识为5位,预先设置的机器标识为5位。其中,通过以5位标识作为数据中心标识,以5位标识作为机器标识,可以部署1024个节点。
自增序号为12位,通过自增ID来生成该自增序号,具体过程可以参见前述的自增ID方法,此处不再赘述。通过采用自增ID方法来生成自增序号,可以支持同一节点在任一毫秒生成多个序列号,例如,12位的自增序号可以支持每个节点每毫秒生成4096个序列号。
通过上述方式生成的目标序列号的结构可以参见图4,图4是本说明书根据一示例性实施例示出的另一种目标序列号的结构示意图,该目标序列号由1位标志位、41位时间戳、5位数据中心标识、5位机器标识和12位自增序号组成,其中,5位数据中心标识、5位机器标识构成节点标识。
上述仅为对目标序列号的生成过程的示例性说明,在更多可能的实现方式中,还可以采用其他方式,来进行目标序列号的生成,本公开对此不加以限定。
在步骤1032中,向目标调用地址对应的服务被调用者发送调用请求,调用请求携带目标调用参数、目标回调地址和目标序列号。
通过向目标调用地址对应的服务调用者发送携带目标调用参数、目标回调地址和目标序列号的调用请求,以便服务被调用者基于目标调用参数、目标回调地址和目标序列号,来进行请求的响应和响应数据的返回。
可选地,在向服务被调用者发送调用请求后,在数据库中添加该调用请求对应的请求记录,以便后续基于数据库中的请求记录,来查询已发送的调用请求。
在一些实施例中,在目标时长内未接收到服务被调用者返回的响应数据的情况下,向目标调用地址对应的服务被调用者发送反向查询请求,由服务被调用者基于反向查询请求返回响应数据,反向查询请求携带目标调用参数、目标回调地址和目标序列号。
在服务处理过程中,可能会出现因异常情况导致响应数据丢失的情况,从而使得服务调用者无法接收到服务被调用者的响应数据,此时,为了弥补这种异常情况,设置反向查询机制,通过对超时未响应的请求补偿一个反向查询请求,以保证服务调用者能够获取到服务被调用者的响应数据。
其中,目标时长为任意时长,本公开对目标时长的具体取值不加以限定。可选地,该反向查询机制有如下几种可能的实现方式:
在一种可能的实现方式中,采用时间轮询的方式实现反向查询机制,服务调用者每隔设定时长,从数据库中获取目标数量的、满足目标条件的请求记录,从而基于获取到的请求记录,向请求记录对应的服务被调用者发送反向查询请求,来获取请求记录对应的调用请求的响应数据。
其中,目标数量为任意取值,例如,目标数量为10000,或者,目标数量为其他取值,本公开对此不加以限定。通过设置每次轮询时获取的请求记录的数量,避免反向查询时超过服务调用者和服务被调用者的处理能力,保证反向查询请求能够得到有效响应。
目标条件为请求记录的记录时间距离当前时刻的时间间隔超过目标时间间隔,且请求记录对应的服务被调用者未返回响应数据。
其中,目标时间间隔基于服务被调用者的处理能力确定,或者,目标时间间隔基于业务场景确定,等等,本公开对此不加以限定。以目标时间间隔基于业务场景确定为例,在业务场景为火车票购票场景的情况下,若车票锁定后30分钟未支付,则释放车票,也即是,目标时间间隔为30分钟。
在另一种可能的实现方式中,采用延迟队列的方式实现反向查询机制,服务调用者关联有一个延迟队列,用于存储不同延迟时长的延迟事件,延迟时长为未接收到响应数据的调用请求的请求发送时间到当前时刻的时长。在服务调用者创建调用请求时,基于所创建的调用请求的序列号、调用请求的创建时间以及调用请求的调用参数,创建一个延迟事件,并将所创建的延迟事件存储至延迟队列中,在发送调用请求的同时启动调度器,通过该调度器,在达到请求发送后的延迟时长时,从服务调用者所关联的延迟队列中,获取相应延迟时长的延迟事件,并向获取到的延迟事件对应的调用请求所指示的服务被调用者,发送反向查询请求。
可选地,在服务调用者所关联的延迟队列中不存在延迟事件的情况下,不进行任何操作,继续等待达到下一个延迟时长即可。
例如,服务调用者关联有一个延迟队列,用于存储延迟时长为1秒(s)、3s、5s、10s的延迟事件。在服务调用者发送调用请求后1s时,从该延迟队列中获取延迟时长为1s的延迟事件,向获取到的延迟事件对应的调用请求所指示的服务被调用者发送反向查询请求;在调用者发送调用请求后3s时,从该延迟队列中获取延迟时长为3s的延迟事件,向获取到的延迟事件对应的调用请求所指示的服务被调用者发送反向查询请求,以此类推,从而实现对延迟队列中不同延迟时长的延迟事件对应的调用请求的反向查询。
可选地,在从延迟队列中获取延迟时长为1s的延迟事件时,在未获取到延迟时长为1s的延迟事件的情况下,无需进行任何操作,继续等待达到下一个延迟时长,也即是3s即可。
参见图5,图5是本说明书根据一示例性实施例示出的一种延迟队列的实现原理示意图,在如图5所示的延迟队列中,存储有延迟时长为1s、5s、10s的延迟事件,在请求发送时间为12:00:00的情况下,在达到12:00:01时,从延迟队列中获取延迟时长为1s的延迟事件,并向延迟时长为1s的延迟事件对应的调用请求所指示的服务被调用者,发送反向查询请求;在达到12:00:05时,从延迟队列中获取延迟时长为5s的延迟事件,并向延迟时长为5s的延迟事件对应的调用请求所指示的服务被调用者,发送反向查询请求;在达到12:00:10时,从延迟队列中获取延迟时长为10s的延迟事件,并向延迟时长为10s的延迟事件对应的调用请求所指示的服务被调用者,发送反向查询请求。
在另一种可能的实现方式中,在发送调用请求后,为调用请求创建一个调用延迟补偿事件,将各个调用延迟补偿事件作为键,各个键(也即是各个调用延迟补偿事件)设置有失效时间,对于各个键中的任一个键,在达到该任一个键的失效时间的情况下,确定该任一个键对应的调用请求的响应情况,在该任一个键对应的调用请求未得到响应的情况下,向该任一个键对应的调用请求所指示的服务被调用者,发送反向查询请求。
可选地,将所生成的键和对应的失效时间存储在服务调用者所关联的数据库中,以便服务调用者从数据库中查找各个键以及各个键的失效时间。
其中,服务被调用者发送反向查询请求时有如下两种可能的实现方式:
在一种可能的实现方式中,当该任一个键被访问时,获取该任一个键的失效时间,在根据获取到的失效时间,确定该任一个键已经失效的情况下,从数据库中删除该任一个键,并生成一个失效(Expired)通知,以便服务被调用者在获取到该失效通知时,向该任一个键对应的调用请求所指示的服务被调用者,发送反向查询请求。
在另一种可能的实现方式中,服务被调用者主动在数据库中检测各个键的失效时间,在检测到达到失效时间的键时,从数据库中删除失效的键,并生成一个失效(Expired)通知,以便服务被调用者在获取到该失效通知时,向失效的键对应的调用请求所指示的服务被调用者,发送反向查询请求。
参见图6,图6是本说明书根据一示例性实施例示出的反向查询方法示意图,各个键均设置有失效时间,在达到每个键的失效时间时,基于删除失效的键时所生成的通知,来实现反向查询机制,具体过程参见上述内容,此处不再赘述。
上述仅为反向查询机制的几种示例性实现方式,在更多可能的实现方式中,还可以采用其他方式来实现反向查询机制,本公开对此不加以限定。
其中,发送上述调用请求的速度不大于设定速度阈值,该设定速度阈值由服务调用者和服务被调用者在服务上线前,基于业务场景对应的流量大小确定,或者说,该设定速度阈值由服务调用者和服务被调用者在服务上线前,基于服务被调用者对调用请求的处理速度确定,例如,设定速度阈值小于服务被调用者对调用请求的处理速度,或者,设定速度阈值等于服务被调用者对调用请求的处理速度。
例如,用户在购物平台购买商品时,需要通过支付平台付款,而支付平台需要调用银行系统进行扣款,此时,支付平台作为服务调用者,银行系统作为服务被调用者,由于银行系统处理能力的限制,单机每秒最大能处理1万笔交易,则支付平台和银行系统将各个时刻的流量阈值设置为1万,也即是,支付平台和银行系统处理请求的设定速度阈值为每秒处理1万个请求。
在一些实施例中,在确定出设定速度阈值后,将设定速度阈值预先存储在服务调用者所关联的数据库中;在服务调用者开始运行的情况下,从数据库中读取设定速度阈值,并将读取到的设定速度阈值存储在内存中。
其中,数据库存储用于将设定速度阈值的存储持久化,内存存储便于后续服务调用者能够快速读取到设定速度阈值。
在更多可能的实现方式中,服务调用者提供一个可以修改设定速度阈值的配置接口,以便后续能够通过该配置接口,对设定速度阈值进行修改。例如,仍以用户在购物平台购买商品时,需要通过支付平台付款的场景为例,当银行系统扩容,如银行系统的处理器(Central Processing Unit,CPU)核数增加,或者内存增大时,可以通过该配置接口,在无需重启服务的情况下,实现设定速度阈值的重新配置。
在一种可能的实现方式中,通过配置接口接收设定速度阈值的修改数据;根据修改数据修改数据库中和内存中存储的设定速度阈值。
上述过程参见图7,图7是本说明书根据一示例性实施例示出的一种设定速度阈值的配置过程示意图,服务调用者在数据库中配置设定速度阈值,以便在服务调用者启动服务,也即是,服务调用者开始运行之后,将数据库中的设定速度阈值加载到内存中,以便通过从内存中读取设定速度阈值,来对设定速度阈值进行使用。此外,服务调用者还提供有一个配置接口,相关人员可以通过配置接口,修改数据库和内存中的设定速度阈值。
在实现发送调用请求的速度不大于设定速度阈值时,可以有如下两种限流方式:
在一些实施例中,服务调用者在获取到目标调用事件后,即会向服务被调用者发送调用请求,而调用请求发送后会先进入第一容器,从而通过所述第一容器将调用请求发送出去,而通过所述第一容器发送调用请求的速度不大于设定速度阈值。
其中,图8是本说明书根据一示例性实施例示出的一种限流方法的原理示意图,参见图8,在利用该方法实现限流时,调用请求会先进入所述第一容器里,第一容器以一定的速度发送调用请求,在调用请求进入第一容器的速度大于设定速度阈值的情况下,调用请求溢出,而在调用请求进入第一容器的速度不大于设定速度阈值的情况下,调用请求可以正常进入第一容器,并通过第一容器发送出去,保证服务的正常进行,因此,通过将发送调用请求的速度设置为不大于设定速度阈值,以保证不会因请求进入第一容器的速度过快而导致请求溢出,从而保证服务的正常进行。
在另一些实施例中,以第一预设时间间隔生成令牌,以便在获取到目标调用事件的情况下,响应于获取到目标调用事件,为空闲线程分配令牌;在空闲线程接收到令牌的情况下,为目标调用事件生成目标序列号,并向目标调用地址对应的服务被调用者发送调用请求。
其中,第一预设时间间隔根据设定速度阈值确定,例如,第一预设时间间隔为大于设定速度阈值对应的时间间隔的任意取值,或者,第一预设时间间隔等于设定速度阈值对应的时间间隔,本公开对第一预设时间间隔的具体取值不加以限定。设定速度阈值对应的时间间隔,也即是速度阈值的倒数。以第一预设时间间隔等于设定速度阈值,设定速度阈值等于服务被调用者对调用请求的处理速度为例,服务被调用者对调用请求的处理速度也即是每秒响应率(Query Per Second,QPS),则设定速度阈值也即是QPS,相应地,第一预设时间间隔为1/QPS。例如,若QPS=100,则第一预设时间间隔为10毫秒(ms)。
令牌为服务调用者随机生成的字符串,服务调用者所生成的各个令牌均有所不同。
在一种可能的实现方式中,在服务调用者开始运行的情况下,服务调用者以第一预设时间间隔进行字符串的生成,并将所生成的字符串作为令牌,存储至第二容器中,以便在获取到目标调用事件后,从第二容器中获取令牌,来为空闲线程分配令牌。
其中,在第二容器未满的情况下,令牌可以累积,在第二容器已满的情况下,令牌会溢出。
参见图9,图9是本说明书根据一示例性实施例示出的一种第二容器算法的原理示意图,服务调用者每生成一个令牌,就将所生成的令牌放入第二容器中,而在获取到目标调用事件后,空闲线程会等待令牌分配,在空闲线程被分配到令牌的情况下,来处理目标调用事件,并从第二容器中移除已分配的令牌。其中,第二容器最多可以容纳b个令牌,b为任意正整数值,本公开对b的具体取值不加以限定。
可选地,在空闲线程未被分配到令牌的情况下,返回第四预设响应数据,第四预设响应数据对应于预先设置的第四默认页面。
其中,第四默认页面与业务场景相关,本公开对第四默认页面的具体类型不加以限定。
通过在空闲线程未被分配到令牌的情况下,直接返回第四预设响应数据,使得调用请求能够快速得到响应,从而提高请求处理效率,进而提高用户体验。
上述仅为用于实现发送调用请求的速度不大于设定速度阈值的两种示例性方式,并不构成对本公开的限定,在更多可能的实现方式中,还可以采用其他方式,来实现发送调用请求的速度不大于设定速度阈值,本公开对此不加以限定。
在一些实施例中,在发送调用请求的速度大于设定速度阈值的情况下,返回第三预设响应数据,第三预设响应数据对应于预先设置的第三默认页面。
可选地,第三默认页面与业务场景相关,本公开对第三默认页面的具体类型不加以限定。
通过在发送调用请求的速度大于设定速度阈值的情况下,直接返回第三预设响应数据,使得调用请求能够快速得到响应,从而提高请求处理效率,进而提高用户体验。
基于上述实施例所提供的请求处理方法的实现方式,服务调用者对调用请求的处理流程可以参见图10,图10是本说明书根据一示例性实施例示出的一种服务调用者处理调用请求的流程图,在配置好服务调用者对应的设定速度阈值后,基于接收到的调用请求构造请求参数、调用地址和回调地址,以生成调用事件,进而将所生成的调用事件放入有界缓存区中,在有界缓存区已满的情况下,构造预设响应数据并返回。在有界缓存区未满,且线程池中存在空闲线程的情况下,从有界缓存区获取目标调用事件,并获取令牌,在成功获取到令牌的情况下,为目标调用事件生成序列号,以便基于所生成的序列号生成调用请求,从而通过发送调用请求来对目标调用事件进行处理;而在未成功获取到令牌的情况下,构造预设响应数据并返回。
需要说明的是,图10所示的过程仅为对服务调用者处理调用请求时的流程的说明,具体实现过程可以参见上述步骤101至步骤103及相关内容,此处不再赘述。
在一些实施例中,响应于接收到下一个调用请求,在有界缓存区的缓存未满的情况下,将下一个调用请求存储至有界缓存区中。
通过在接收到调用请求后,无需等待调用请求的处理结果,即继续接收下一个调用请求,而在接收到下一个调用请求后,也无需等待新接收到的调用请求的处理结果,而所接收到的各个调用请求,均会在线程池中存在空闲线程时得到处理,从而使得服务调用者的资源能够得到充分的释放和再使用,从而提高请求处理速度和请求处理效率。
上述各个实施例为对步骤101至步骤103中,服务调用者对调用请求的处理过程的示例性说明,下面对步骤104至步骤106,也即是服务被调用者对调用请求的处理过程进行说明。
服务被调用者的线程池包括第一线程池和第二线程池。第一线程池中的第一线程用于接收服务调用者的调用请求,从而在第一有界缓存区的缓存未满的情况下,将调用请求存储至第一有界缓存区中。第二线程池中的第二线程用于在线程池中存在空闲线程的情况下,从第一有界缓存区中获取目标调用请求,对目标调用请求进行响应。
其中,第一线程池主要用于对调用请求的接收和转发,计算任务较轻,因而将第一线程池所包括的第一线程的个数设置为1;而第二线程池主要用于对调用请求进行响应,计算任务较重,此时,基于服务被调用者的CPU核数,确定第二线程池所包括的第二线程的个数。
例如,设置第二线程池所包括的第二线程的个数等于服务被调用者的CPU核数。通过将第二线程的个数设置为等于CPU核数,以减少因第二线程个数大于CPU核数,而导致CPU频繁发生线程切换,进而导致CPU计算资源浪费的情况的出现,还可以减少因第二线程个数小于CPU核数,而导致CPU的计算性能无法得到充分发挥的情况的出现。
可选地,第二线程的个数还可以设置为与CPU核数相近的取值,例如,将第二线程的个数,设置为与CPU核数的差值小于预设差值的取值,预设差值为任意正整数值,本公开对此不加以限定。
在一些实施例中,第一有界缓存区为队列结构,第一有界缓存区设置有队列长度和队列容量,队列长度用于指示第一有界缓存区当前所存储的调用请求的数量,队列容量用于指示第一有界缓存区最多存储的调用请求的数量。关于第一有界缓存区的内容,可以参见服务调用者侧对有界缓存区的介绍,此处不再赘述。
在第一有界缓存区的缓存未满的情况下,将调用请求存储至第一有界缓存区中,包括:
在第一有界缓存区的当前队列长度小于队列容量的情况下,将调用请求存储至第一有界缓存区的队列尾部。
在将调用请求存储至第一有界缓存区的队列尾部时,通过对第一有界缓存区进行写操作实现。
例如,第一有界缓存区的队列容量为1500个调用事件,而第一有界缓存区的队列长度为800,也即是,第一有界缓存区已经存储了800个调用请求,则服务被调用者将接收到的调用请求,存储至第一有界缓存区中的第800个调用请求之后,成为第一有界缓存区中存储的第801个调用请求。
在一种可能的实现方式中,在将调用请求存储至第一有界缓存区的队列尾部后,在第一有界缓存区的当前队列长度的基础上,增加预设值,得到更新后的队列长度。其中,预设值为1。
仍以第一有界缓存区的队列长度为800为例,则在将第801个调用请求存储至第一有界缓存区中之后,在第一有界缓存区的当前队列长度800的基础上加1,得到更新后的队列长度801。
可选地,在第一有界缓存区的缓存已满的情况下,返回第七预设响应数据,第七预设响应数据对应于预先设置好的第七默认页面。
其中,第七默认页面与业务场景相关,本公开对第七默认页面的具体类型不加以限定。
通过在第一有界缓存区的缓存已满的情况下,直接返回第七预设响应数据,使得调用请求能够快速得到响应,从而提高请求处理效率,进而提高用户体验。
在一些实施例中,在线程池中存在空闲线程的情况下,从第一有界缓存区中获取目标调用请求,包括:
在线程池中存在空闲线程的情况下,从第一有界缓存区的队列头部,获取目标调用请求。
也即是,在线程池中存在空闲线程的情况下,获取位于第一有界缓存区的队列首位的调用请求,作为目标调用请求。
其中,在从第一有界缓存区的队列头部获取目标调用请求时,通过对第一有界缓存区进行读操作实现。
在一种可能的实现方式中,在从第一有界缓存区的队列头部获取到目标调用请求的情况下,在第一有界缓存区的当前队列长度的基础上,减少预设值,得到更新后的队列长度。其中,预设值为1。
例如,第一有界缓存区原本的队列长度为293,则在从第一有界缓存区中获取到位于队列头部的目标调用请求之后,在第一有界缓存区的当前队列长度293的基础上减1,得到更新后的队列长度292。
可选地,在线程池中不存在空闲线程的情况下,返回第八预设响应数据,第八预设响应数据对应于预先设置好的第八默认页面。
其中,第八默认页面与业务场景相关,本公开对第八默认页面的具体类型不加以限定。
通过在线程池中不存在空闲线程的情况下,直接返回第八预设响应数据,使得调用请求能够快速得到响应,从而提高请求处理效率,进而提高用户体验。
其中,在将调用请求存储至第一有界缓存区中时,存储调用请求的速度不大于第一速度阈值,该第一速度阈值由服务被调用者和该服务被调用者所依赖的第三方服务,在服务上线前,基于业务场景对应的流量大小确定,或者说,该第一速度阈值由服务被调用者和该服务被调用者所依赖的第三方服务,在服务上线前,基于对调用请求的处理速度确定,例如,第一速度阈值小于对调用请求的处理速度,或者,第一速度阈值等于对调用请求的处理速度。
在一些实施例中,在确定出第一速度阈值后,将第一速度阈值存储在服务被调用者所关联的数据库中;在服务被调用者开始运行的情况下,从数据库中读取第一速度阈值,并将读取到的第一速度阈值存储在内存中。
其中,数据库存储用于将第一速度阈值的存储持久化,内存存储便于后续服务调用者能够快速读取到第一速度阈值。
在更多可能的实现方式中,服务被调用者提供一个可以修改第一速度阈值的配置接口,以便后续能够通过该配置接口,对第一速度阈值进行修改。
在一种可能的实现方式中,通过配置接口接收第一速度阈值的修改数据;根据修改数据修改数据库中和内存中存储的第一速度阈值。具体过程与上述设定速度阈值的配置过程同理,此处不再赘述。
需要说明的是,实现存储调用请求的速度不大于第一速度阈值的过程,与上述实现发送调用请求的速度不大于设定速度阈值的过程同理,也即是,也可以采用以上所述的限流方法,实现存储调用请求的速度不大于第一速度阈值的限定。
其中,对于基于第二容器进行限流的方法,在服务被调用者开始运行的情况下,以第二预设时间间隔生成令牌,从而在接收到调用请求的情况下,向调用请求分配令牌,第二预设时间间隔根据第一速度阈值确定;在调用请求被分配到令牌,且第一有界缓存区的缓存未满的情况下,将调用请求存储至第一有界缓存区中。
可选地,在调用请求未被分配到令牌的情况下,返回第六预设响应数据,第六预设响应数据对应于预先设置的第六默认页面。
其中,第六默认页面与业务场景相关,本公开对第六默认页面的具体类型不加以限定。
通过在调用请求未被分配到令牌的情况下,直接返回第六预设响应数据,使得调用请求能够快速得到响应,从而提高请求处理效率,进而提高用户体验。
关于上述基于第二容器进行限流的方法的具体实现过程,可以参见服务调用者侧的限流方法,此处不再赘述。
另外,基于第一容器进行限流的方法的具体实现过程,也可以参见服务调用者侧的限流方法,此处不再赘述。
可选地,在存储调用请求的速度大于第一速度阈值的情况下,返回第五预设响应数据,第五预设响应数据对应于预先设置的第五默认页面。
其中,第五默认页面与业务场景相关,本公开对第五默认页面的具体类型不加以限定。
通过在存储调用请求的速度大于第一速度阈值的情况下,直接返回第五预设响应数据,使得调用请求能够快速得到响应,从而提高请求处理效率,进而提高用户体验。
对于服务调用者向服务被调用者所发送的目标调用请求,该目标调用请求携带目标调用事件的目标调用参数、目标回调地址和目标序列号,基于此,在对目标调用请求进行响应时,有如下两种可能的实现过程:
在一些实施例中,响应于服务被调用者无需调用第三方服务,基于目标调用参数构造目标调用事件的响应数据,将目标序列号对应的响应数据发送给目标回调地址所对应的服务调用者。
在另一些实施例中,响应于服务被调用者需要调用第三方服务,在第二有界缓存区的缓存未满的情况下,将调用请求对应的调用事件存储至第二有界缓存区中,第二有界缓存区用于存储至少一个调用事件;在线程池中存在空闲线程的情况下,从第二有界缓存区中获取目标调用事件,通过线程池所包括的至少一个线程处理至少一个调用事件;向第三方服务对应的设备发送含有目标调用事件的调用请求,以使第三方服务对应的设备基于接收到的调用请求对目标调用事件进行处理,其中,发送调用请求的速度不大于第二速度阈值,第二速度阈值基于第三方服务对应的设备对调用请求的处理速度确定。
其中,第二有界缓存区位于服务被调用者的内存中,第二有界缓存区与第一有界缓存区为服务被调用者的内存中不同的两块区域,关于第二有界缓存区的介绍,可以参见关于第一有界缓存区的介绍,此处不再赘述。
在服务被调用者需要调用第三方服务的情况下,服务被调用者转换为服务调用者,而第三方服务作为服务被调用者,此时,对调用请求的处理过程与上述步骤101至步骤103以及相关内容同理,此处不再赘述。
需要说明的是,在服务被调用者向服务调用者返回响应数据时,通过回调通知事件实现。参见图11,图11是本说明书根据一示例性实施例示出的一种回调通知事件的流程示意图,在正向的调用过程中,服务A作为服务调用者,调用作为服务被调用者的服务B,来响应服务A接收到的调用请求。而在服务B生成响应数据后,服务B转换为服务调用者,服务A转换为服务被调用者,以便服务B向服务A返回响应数据。
基于上述实施例所提供的请求处理方法的实现方式,服务被调用者对调用请求的处理流程可以参见图12,图12是本说明书根据一示例性实施例示出的一种服务被调用者处理调用请求的流程图,在为服务被调用者配置好第一有界缓存区和设定速度阈值后,服务被调用者通过第一线程获取来自服务调用者的调用请求,在获取令牌失败的情况下,返回预设响应数据。在获取令牌成功,但第一有界缓存区的缓存已满的情况下,返回预设响应数据。在获取令牌成功,且第一有界缓存区的缓存未满的情况下,将调用请求存入第一有界缓存区中,以便通过第二线程,从第一有界缓存区中获取目标调用请求,进而为目标调用请求构造响应数据,并将响应数据通过回调通知的方式,发送给服务调用者,实现调用请求的处理。其中,在为目标调用请求构造响应数据时,可以通过调用第三方服务,来获取目标调用请求对应的响应数据。
需要说明的是,图12所示的过程仅为对服务被调用者处理调用请求时的流程的说明,具体实现过程可以参见上述步骤104至步骤106及相关内容,此处不再赘述。
在上述响应目标调用请求的过程中,可能出现响应数据丢失的情况,此时,服务调用者可以通过反向查询机制,向服务被调用者发送反向查询请求,反向查询请求携带待查询的调用请求的调用参数、回调地址和序列号;服务被调用者接收服务调用者发送的反向查询请求,基于调用参数,获取序列号对应的调用请求的响应数据,向回调地址所对应的服务调用者发送序列号所对应的响应数据。
上述各个实施例提供的请求处理方法可以通过请求处理系统实现,参见图13,图13是本说明书根据一示例性实施例示出的一种请求处理方法的系统架构图,图13以第一服务被调用者需要调用第三方服务,来实现对第一服务调用者的响应为例来进行说明。
根据如图13所示的系统架构,在本公开所提供的请求处理方法中,第一服务调用者在接收到调用请求后,采用异步调用的方式,在满足限流条件的情况下,通过第一服务调用者的有界缓存区,对接收到的调用请求对应的调用事件进行存储,以便通过计算资源,来对第一服务调用者的有界缓存区中所存储的调用事件进行处理。
第一服务调用者在对第一服务调用者的有界缓存区中所存储的调用事件进行处理时,采用异步调用的方式,调用第一服务被调用者,第一服务被调用者在接收到第一服务调用者的调用请求后,在满足限流条件的情况下,通过第一服务被调用者的有界缓存区,对接收到的调用请求进行存储,以便通过计算资源,来对第一服务被调用者的有界缓存区中所存储的调用请求进行处理。
第一服务被调用者在对第一服务被调用者的有界缓存区中所存储的调用事件进行处理时,该第一服务被调用者转换为第二服务调用者,采用异步调用的方式,调用作为第二服务被调用者的第三方服务,第二服务被调用者在接收到调用请求后,在满足限流条件的情况下,通过第二服务被调用者的有界缓存区,对接收到的调用请求进行处理,以便通过计算资源,来生成响应数据,进而将所生成的响应数据通过回调通知的方式,发送给第二服务调用者,由对第二服务调用者将响应数据通过回调通知的方式,发送给第一服务调用者,实现服务调用过程。
以用户购买商品时的付款过程为例,用户在进行付款时,会发生多个服务间的调用,例如,支付服务会调用网关服务,网关服务会调用银行服务,则支付服务即为图13中所示的第一服务调用者,网关服务即为图13中所示的第一服务被调用者(也即是第二服务调用者),银行服务即为图13中所示的第二服务被调用者,具体调用过程参见上述内容,此处不再赘述。
需要注意的是,上述各个过程中涉及到的应用场景仅是为了便于理解本公开的精神和原理而示出,本公开的实施方式在此方面不受任何限制。相反,本公开的实施方式可以应用于适用的任何场景。
为了实现本公开任一实施例的请求处理方法,本公开实施例还提供了一种请求处理装置。图14是本说明书根据一示例性实施例示出的一种请求处理装置的框图,例如,该装置可以应用于作为服务调用者的计算设备。如下的描述中,将简单描述该装置的各个模块的功能,其详细的处理可以结合参见前述的本公开任一实施例的请求处理方法的描述。
参见图14,该请求处理装置包括:
存储单元1401,用于响应于接收到调用请求,在有界缓存区的缓存未满的情况下,将调用请求对应的调用事件存储至有界缓存区中,有界缓存区用于存储至少一个调用事件;
获取单元1402,用于在线程池中存在空闲线程的情况下,从有界缓存区中获取目标调用事件,线程池包括至少一个线程,通过至少一个线程处理述至少一个调用事件;
发送单元1403,用于向服务被调用者发送含有目标调用事件的调用请求,以使服务被调用者基于接收到的调用请求对目标调用事件进行处理,其中,发送调用请求的速度不大于设定速度阈值,设定速度阈值基于服务被调用者对调用请求的处理速度确定。
在一些实施例中,有界缓存区为队列结构,有界缓存区设置有队列长度和队列容量,队列长度用于指示有界缓存区当前所存储的调用事件的数量,队列容量用于指示有界缓存区最多存储的调用事件的数量;
该存储单元1401,在用于响应于接收到调用请求,在有界缓存区的缓存未满的情况下,将调用请求对应的调用事件存储至有界缓存区中时,包括生成子单元和存储子单元:
该生成子单元,用于响应于接收到调用请求,基于调用请求生成调用事件;
该存储子单元,用于在有界缓存区的队列长度小于队列容量的情况下,将调用事件存储至有界缓存区的队列尾部。
在一些实施例中,该生成子单元,在用于响应于接收到调用请求,基于调用请求生成调用事件时,用于:
响应于接收到调用请求,基于调用请求确定调用参数、调用地址以及回调地址;
对调用参数、调用地址和回调地址进行封装,得到调用事件。
在一些实施例中,该获取单元1402,在用于在线程池中存在空闲线程的情况下,从有界缓存区中获取目标调用事件时,用于:
在线程池中存在空闲线程,且有界缓存区中存储有至少一个调用事件的情况下,从有界缓存区的队列头部获取目标调用事件。
在一些实施例中,目标调用事件对应于目标调用参数、目标调用地址和目标回调地址;
该发送单元1403,在用于向服务被调用者发送含有目标调用事件的调用请求时,用于:
为目标调用事件生成目标序列号,目标序列号用于标识目标调用事件;
向目标调用地址对应的服务被调用者发送调用请求,调用请求携带目标调用参数、目标回调地址和目标序列号。
在一些实施例中,该发送单元1403,还用于在目标时长内未接收到服务被调用者返回的响应数据的情况下,向目标调用地址对应的服务被调用者发送反向查询请求,由服务被调用者基于反向查询请求返回响应数据,反向查询请求携带目标调用参数、目标回调地址和目标序列号。
在一些实施例中,该装置还包括:
第一返回单元,用于响应于接收到调用请求,在有界缓存区的缓存已满的情况下,返回第一预设响应数据,第一预设响应数据对应于预先设置的第一默认页面。
在一些实施例中,该装置还包括:
第二返回单元,用于在线程池中不存在空闲线程的情况下,返回第二预设响应数据,第二预设响应数据对应于预先设置的第二默认页面。
在一些实施例中,该存储单元1401,还用于将设定速度阈值预先存储在数据库中;
该装置还包括:
读取单元,用于在服务调用者开始运行的情况下,从数据库中读取设定速度阈值;
该存储单元1401,还用于将读取到的设定速度阈值存储在内存中。
在一些实施例中,该装置还包括:
接收单元,用于通过配置接口接收设定速度阈值的修改数据;
修改单元,用于根据修改数据修改数据库中和内存中存储的设定速度阈值。
在一些实施例中,该装置还包括:
第三返回单元,用于在发送调用请求的速度大于设定速度阈值的情况下,返回第三预设响应数据,第三预设响应数据对应于预先设置的第三默认页面。
在一些实施例中,该装置还包括:
令牌生成单元,用于以第一预设时间间隔生成令牌,第一预设时间间隔根据设定速度阈值确定;
分配单元,用于响应于获取到目标调用事件,为空闲线程分配令牌;
序列号生成单元,用于在空闲线程接收到令牌的情况下,为目标调用事件生成目标序列号,并向目标调用地址对应的服务被调用者发送调用请求。
在一些实施例中,该存储单元1401,还用于响应于接收到下一个调用请求,在有界缓存区的缓存未满的情况下,将下一个调用请求存储至有界缓存区中。
为了实现本公开任一实施例的请求处理方法,本公开实施例还提供了另一种请求处理装置。图15是本说明书根据一示例性实施例示出的一种请求处理装置的框图,例如,该装置可以应用于作为服务被调用者的计算设备。如下的描述中,将简单描述该装置的各个模块的功能,其详细的处理可以结合参见前述的本公开任一实施例的请求处理方法的描述。
参见图15,该请求处理装置包括:
接收单元1501,用于接收服务调用者的调用请求;
存储单元1502,用于在第一有界缓存区的缓存未满的情况下,将调用请求存储至第一有界缓存区中,其中,存储调用请求的速度不大于第一速度阈值,第一速度阈值基于对调用请求的处理速度确定,第一有界缓存区用于存储至少一个调用请求;
获取单元1503,用于在线程池中存在空闲线程的情况下,从第一有界缓存区中获取目标调用请求,线程池包括至少一个线程,通过至少一个线程处理至少一个调用请求;
响应单元1504,用于对目标调用请求进行响应。
在一些实施例中,第一有界缓存区为队列结构,第一有界缓存区设置有队列长度和队列容量,队列长度用于指示第一有界缓存区当前所存储的调用请求的数量,队列容量用于指示第一有界缓存区最多存储的调用请求的数量;
该存储单元1503,在用于在第一有界缓存区的缓存未满的情况下,将调用请求存储至第一有界缓存区中时,用于:
在第一有界缓存区的当前队列长度小于队列容量的情况下,将调用请求存储至第一有界缓存区的队列尾部。
在一些实施例中,该获取单元1502,在用于在线程池中存在空闲线程的情况下,从第一有界缓存区中获取目标调用请求时,用于:
在线程池中存在空闲线程的情况下,从第一有界缓存区的队列头部,获取目标调用请求。
在一些实施例中,该存储单元1503,还用于将第一速度阈值存储在数据库中;
该装置还包括:
读取单元,用于在服务被调用者开始运行的情况下,从数据库中读取第一速度阈值;
该存储单元1503,还用于将读取到的第一速度阈值存储在内存中。
在一些实施例中,该接收单元1501,还用于通过配置接口接收第一速度阈值的修改数据;
该装置还包括:
修改单元,用于根据修改数据修改数据库中和内存中存储的第一速度阈值。
在一些实施例中,目标调用请求携带目标调用事件的目标调用参数、目标回调地址和目标序列号;
该响应单元1504,在用于对目标调用请求进行响应时,用于:
响应于服务被调用者无需调用第三方服务,基于目标调用参数构造目标调用事件的响应数据,将目标序列号对应的响应数据发送给目标回调地址所对应的服务调用者。
在一些实施例中,该存储单元1503,还用于响应于服务被调用者需要调用第三方服务,在第二有界缓存区的缓存未满的情况下,将调用请求对应的调用事件存储至第二有界缓存区中,第二有界缓存区用于存储至少一个调用事件;
该获取单元1502,还用于在线程池中存在空闲线程的情况下,从第二有界缓存区中获取目标调用事件,通过线程池所包括的至少一个线程处理至少一个调用事件;
该装置还包括:
发送单元,用于向第三方服务对应的设备发送含有目标调用事件的调用请求,以使第三方服务对应的设备基于接收到的调用请求对目标调用事件进行处理,其中,发送调用请求的速度不大于第二速度阈值,第二速度阈值基于第三方服务对应的设备对调用请求的处理速度确定。
在一些实施例中,该接收单元1501,还用于接收服务调用者发送的反向查询请求,反向查询请求携带待查询的调用请求的调用参数、回调地址和序列号;
该获取单元1502,还用于基于调用参数,获取序列号对应的调用请求的响应数据,向回调地址所对应的服务调用者发送序列号所对应的响应数据。
在一些实施例中,该装置还包括:
第五返回单元,用于在存储调用请求的速度大于第一速度阈值的情况下,返回第五预设响应数据,第五预设响应数据对应于预先设置的第五默认页面。
在一些实施例中,该装置还包括:
生成单元,用于以第二预设时间间隔生成令牌,并向调用请求分配令牌,第二预设时间间隔根据第一速度阈值确定;
在调用请求被分配到令牌,且第一有界缓存区的缓存未满的情况下,将调用请求存储至第一有界缓存区中。
在一些实施例中,该装置还包括:
第六返回单元,用于在调用请求未被分配到令牌的情况下,返回第六预设响应数据,第六预设响应数据对应于预先设置的第六默认页面。
在一些实施例中,该装置还包括:
第七返回单元,用于在第一有界缓存区的缓存已满的情况下,返回第七预设响应数据,第七预设响应数据对应于预先设置好的第七默认页面。
在一些实施例中,该装置还包括:
第八返回单元,用于在线程池中不存在空闲线程的情况下,返回第八预设响应数据,第八预设响应数据对应于预先设置好的第八默认页面。
在一些实施例中,线程池包括第一线程池和第二线程池;
其中,第一线程池中的第一线程用于接收服务调用者的调用请求;在第一有界缓存区的缓存未满的情况下,将调用请求存储至第一有界缓存区中;
第二线程池中的第二线程用于在线程池中存在空闲线程的情况下,从第一有界缓存区中获取目标调用请求,对目标调用请求进行响应。
应当注意,尽管在上文详细描述中提及了请求处理装置的若干单元或子单元,但是这种划分仅仅是示例性的并非强制性的。实际上,根据本公开的实施方式,上文描述的两个或更多单元/子单元的特征和功能可以在一个单元/子单元中具体化。反之,上文描述的一个单元/子单元的特征和功能可以进一步划分为由多个单元/子单元来具体化。
本公开实施例还提供了一种计算机可读存储介质。图16是本说明书根据一示例性实施例示出的一种计算机可读存储介质的示意图,如图16所示,该存储介质上存储有计算机程序1601,该计算机程序1601被处理器执行时可以执行本公开任一实施例的请求处理方法。
本公开实施例还提供了一种计算设备,该计算设备可以包括存储器、处理器,该存储器用于存储可在处理器上运行的计算机指令,该处理器用于在执行该计算机指令时实现本公开任一实施例的请求处理方法。
参见图17,图17是本说明书根据一示例性实施例示出的一种计算设备的结构示意图,该计算设备1700可以包括但不限于:处理器1710、存储器1720、连接不同系统组件(包括存储器1720和处理器1710)的总线1730。
其中,存储器1720存储有计算机指令,该计算机指令可以被处理器1710执行,使得处理器1710能够执行本公开任一实施例的请求处理方法。存储器1720可以包括随机存取存储单元RAM1721、高速缓存存储单元1722和/或只读存储单元ROM1723。该存储器1720还可以包括:具有一组程序模块1724的程序工具1725,该程序模块1724包括但不限于:操作系统、一个或多个应用程序、其他程序模块和程序数据,这些程序模块一种或多种组合可以包含网络环境的实现。
总线1730例如可以包括数据总线、地址总线和控制总线等。该计算设备1700还可以通过I/O接口1740与外部设备1750通信,该外部设备1750例如可以是键盘、蓝牙设备等。该计算设备1700还可以通过网络适配器1760与一个或多个网络通信,例如,该网络可以是局域网、广域网、公共网络等。如图17所示,该网络适配器1760还可以通过总线1730与计算设备1700的其他模块进行通信。
此外,尽管在附图中以特定顺序描述了本公开方法的操作,但是,这并非要求或者暗示必须按照该特定顺序来执行这些操作,或是必须执行全部所示的操作才能实现期望的结果。附加地或备选地,可以省略某些步骤,将多个步骤合并为一个步骤执行,和/或将一个步骤分解为多个步骤执行。
虽然已经参考若干具体实施方式描述了本公开的精神和原理,但是应该理解,本公开并不限于所公开的具体实施方式,对各方面的划分也不意味着这些方面中的特征不能组合以进行受益,这种划分仅是为了表述的方便。本公开旨在涵盖所附权利要求的精神和范围内所包括的各种修改和等同布置。

Claims (10)

1.一种请求处理方法,其特征在于,所述方法包括:
响应于接收到调用请求,在有界缓存区的缓存未满的情况下,将所述调用请求对应的调用事件存储至所述有界缓存区中,所述有界缓存区用于存储至少一个调用事件;
在线程池中存在空闲线程的情况下,从所述有界缓存区中获取目标调用事件,所述线程池包括至少一个线程,通过所述至少一个线程处理所述至少一个调用事件;
向服务被调用者发送含有所述目标调用事件的调用请求,以使所述服务被调用者基于接收到的调用请求对所述目标调用事件进行处理,其中,发送调用请求的速度不大于设定速度阈值,所述设定速度阈值基于所述服务被调用者对所述调用请求的处理速度确定。
2.根据权利要求1所述的方法,其特征在于,所述有界缓存区为队列结构,所述有界缓存区设置有队列长度和队列容量,所述队列长度用于指示所述有界缓存区当前所存储的调用事件的数量,所述队列容量用于指示所述有界缓存区最多存储的调用事件的数量;
所述响应于接收到调用请求,在有界缓存区的缓存未满的情况下,将所述调用请求对应的调用事件存储至所述有界缓存区中,包括:
响应于接收到调用请求,基于所述调用请求生成调用事件;
在所述有界缓存区的队列长度小于所述队列容量的情况下,将所述调用事件存储至所述有界缓存区的队列尾部。
3.根据权利要求2所述的方法,其特征在于,所述响应于接收到调用请求,基于所述调用请求生成调用事件,包括:
响应于接收到所述调用请求,基于所述调用请求确定调用参数、调用地址以及回调地址;
对所述调用参数、所述调用地址和所述回调地址进行封装,得到所述调用事件。
4.根据权利要求1所述的方法,其特征在于,所述在线程池中存在空闲线程的情况下,从所述有界缓存区中获取目标调用事件,包括:
在所述线程池中存在空闲线程,且所述有界缓存区中存储有至少一个调用事件的情况下,从所述有界缓存区的队列头部获取所述目标调用事件。
5.根据权利要求1所述的方法,其特征在于,所述目标调用事件对应于目标调用参数、目标调用地址和目标回调地址;
所述向服务被调用者发送含有所述目标调用事件的调用请求,包括:
为所述目标调用事件生成目标序列号,所述目标序列号用于标识所述目标调用事件;
向所述目标调用地址对应的服务被调用者发送所述调用请求,所述调用请求携带所述目标调用参数、所述目标回调地址和所述目标序列号。
6.一种请求处理方法,其特征在于,所述方法包括:
接收服务调用者的调用请求;
在第一有界缓存区的缓存未满的情况下,将所述调用请求存储至所述第一有界缓存区中,其中,存储调用请求的速度不大于第一速度阈值,所述第一速度阈值基于对所述调用请求的处理速度确定,所述第一有界缓存区用于存储至少一个调用请求;
在线程池中存在空闲线程的情况下,从所述第一有界缓存区中获取目标调用请求,对所述目标调用请求进行响应,所述线程池包括至少一个线程,通过所述至少一个线程处理所述至少一个调用请求。
7.一种请求处理装置,其特征在于,所述装置包括:
存储单元,用于响应于接收到调用请求,在有界缓存区的缓存未满的情况下,将所述调用请求对应的调用事件存储至所述有界缓存区中,所述有界缓存区用于存储至少一个调用事件;
获取单元,用于在线程池中存在空闲线程的情况下,从所述有界缓存区中获取目标调用事件,所述线程池包括至少一个线程,通过所述至少一个线程处理所述至少一个调用事件;
发送单元,用于向服务被调用者发送含有所述目标调用事件的调用请求,以使所述服务被调用者基于接收到的调用请求对所述目标调用事件进行处理,其中,发送调用请求的速度不大于设定速度阈值,所述设定速度阈值基于所述服务被调用者对所述调用请求的处理速度确定。
8.一种请求处理装置,其特征在于,所述装置包括:
接收单元,用于接收服务调用者的调用请求;
存储单元,用于在第一有界缓存区的缓存未满的情况下,将所述调用请求存储至所述第一有界缓存区中,其中,存储调用请求的速度不大于第一速度阈值,所述第一速度阈值基于对所述调用请求的处理速度确定,所述第一有界缓存区用于存储至少一个调用请求;
获取单元,用于在线程池中存在空闲线程的情况下,从所述第一有界缓存区中获取目标调用请求,所述线程池包括至少一个线程,通过所述至少一个线程处理所述至少一个调用请求;
响应单元,用于对所述目标调用请求进行响应。
9.一种计算设备,其特征在于,所述计算设备包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其中,所述处理器执行所述程序时实现如权利要求1至5中任一项所述的请求处理方法所执行的操作,或如权利要求6所述的请求处理方法。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有程序,所述程序被处理器执行如权利要求1至5中任一项所述的请求处理方法所执行的操作,或如权利要求6所述的请求处理方法。
CN202111155061.1A 2021-09-29 2021-09-29 请求处理方法、装置、计算设备及介质 Pending CN113886082A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202111155061.1A CN113886082A (zh) 2021-09-29 2021-09-29 请求处理方法、装置、计算设备及介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202111155061.1A CN113886082A (zh) 2021-09-29 2021-09-29 请求处理方法、装置、计算设备及介质

Publications (1)

Publication Number Publication Date
CN113886082A true CN113886082A (zh) 2022-01-04

Family

ID=79008497

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202111155061.1A Pending CN113886082A (zh) 2021-09-29 2021-09-29 请求处理方法、装置、计算设备及介质

Country Status (1)

Country Link
CN (1) CN113886082A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116841697A (zh) * 2023-07-21 2023-10-03 芯华章智能科技(上海)有限公司 处理mmio请求的方法、电子装置和存储介质

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116841697A (zh) * 2023-07-21 2023-10-03 芯华章智能科技(上海)有限公司 处理mmio请求的方法、电子装置和存储介质
CN116841697B (zh) * 2023-07-21 2024-05-07 芯华章智能科技(上海)有限公司 处理mmio请求的方法、电子装置和存储介质

Similar Documents

Publication Publication Date Title
CN110489447B (zh) 数据查询方法、装置、计算机设备和存储介质
CN107241281B (zh) 一种数据处理方法及其装置
US7219121B2 (en) Symmetrical multiprocessing in multiprocessor systems
CN108829512B (zh) 一种云中心硬件加速计算力的分配方法、系统和云中心
US9736034B2 (en) System and method for small batching processing of usage requests
WO2019223596A1 (zh) 事件处理方法、装置、设备及存储介质
CN107451853B (zh) 一种红包实时派发的方法、装置、系统及存储介质
CN111221638B (zh) 并发任务的调度处理方法、装置、设备和介质
US9110715B2 (en) System and method for using a sequencer in a concurrent priority queue
CN114928579A (zh) 数据处理方法、装置、计算机设备及存储介质
WO2022062833A1 (zh) 内存分配方法及相关设备
CN111586140A (zh) 一种数据交互的方法及服务器
CN113886082A (zh) 请求处理方法、装置、计算设备及介质
CN108388409B (zh) 打印请求处理方法、装置、计算机设备和存储介质
CN110162395B (zh) 一种内存分配的方法及装置
CN113794650A (zh) 并发请求的处理方法、计算机设备和计算机可读存储介质
CN111290842A (zh) 一种任务执行方法和装置
CN113905091A (zh) 用于对访问请求进行处理的方法及装置
CN108255853B (zh) 一种插件式的请求异步处理方法以及系统
CN117407159A (zh) 内存空间的管理方法及装置、设备、存储介质
CN112346848A (zh) 一种管理内存池的方法、装置及终端
CN112306827A (zh) 日志采集装置、方法和计算机可读存储介质
CN114157717B (zh) 一种微服务动态限流的系统及方法
CN114138371B (zh) 配置动态加载方法、装置及计算机设备、存储介质
CN114374657A (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