一种接口幂等调用的方法、装置、设备及存储介质与流程

文档序号:26050586发布日期:2021-07-27 15:25阅读:100来源:国知局
一种接口幂等调用的方法、装置、设备及存储介质与流程

本申请实施例涉及计算机技术领域,具体而言,涉及一种接口幂等调用的方法、装置、设备及存储介质。



背景技术:

当一个系统对另一个系统进行调用时,若发生网络抖动或者系统暂时不可用的问题时,调用会失败,为了保证调用的正常进行,一般会通过重试的方式,对系统进行多次调用尝试,但此时必须保证调用过程是幂等的,就是调用的结果必须保持一致,如果调用过程不是幂等的,就可能导致两次重复调用的结果不一致的情况。现有技术中,通过对调用方和被调用方(即服务方)进行编码处理,在调用方进行调用时,首先编码验证当前数据的状态,被调方在被调用时,也要进行编码验证,当验证无误时再执行调用操作。

现有技术存在的问题是:当系统间调用频繁时,调用的接口数量会非常多,每个接口都由开发人员进行编码处理,工作量大,不利于后期维护且容易出错。



技术实现要素:

本申请实施例提供一种接口幂等调用的方法、装置、设备及存储介质,旨在保证系统间接口调用的准确性以及提升系统间接口调用的效率。

本申请实施例第一方面提供一种接口幂等调用的方法,所述方法包括:

服务方响应于调用方发出的接口调用请求,将所述接口调用请求以及被调用接口的相关数据封装为意图,并将所述意图提交给协调器;

所述协调器对所述意图进行验证,得到针对所述意图的断言,并将所述断言送至所述服务方;

所述服务方根据所述断言,对所述接口调用请求进行响应。

可选地,所述接口的相关数据包括被调用接口涉及的数据源、数据位置和特征字段。

可选地,所述协调器对所述意图进行验证,得到针对所述意图的断言,包括:

所述协调器根据所述意图,在数据源中验证所述意图对应的操作是否已经执行;

当验证结果为所述意图对应的操作未被执行时,所述协调器对所述意图进行锁定,并向所述服务方发送操作未执行的断言;

当验证结果为所述意图对应的操作已被执行时,所述协调器向所述服务方发送操作已执行的断言。

可选地,所述服务方根据所述断言,对所述接口调用请求进行响应,包括:

当所述断言为操作未执行时,所述服务方执行所述意图对应的操作,并向所述调用方发送调用成功的消息;

当所述断言为操作已执行时,所述服务方向所述调用方发送调用成功的消息。

可选地,所述方法还包括:

当所述服务方对所述意图对应的操作执行完成时,向所述协调器发送意图解锁指令;

所述协调器根据所述意图解锁指令,对所述意图进行解锁。

可选地,所述方法还包括:

当所述协调器在第一预设时间段内未接收到所述意图解锁指令时,每隔一个第二预设时间段,对所述意图进行验证,得到针对所述意图的断言;

当所述断言为操作已执行时,所述协调器对所述意图进行自动解锁;

当经过预设次数的验证后所述断言仍然为操作未执行时,所述协调器将所述意图进行挂起,并发出手动解锁通知。

可选地,所述方法还包括:

在所述协调器中部署多个实例;

在所述服务方提交给所述协调器多个不同的意图的情况下,所述协调器对所述意图进行验证,得到针对所述意图的断言,包括:

所述协调器利用自身部署的不同的实例对所述多个不同的意图进行验证,得到多个断言。

本申请实施例第二方面提供一种接口幂等调用的装置,所述装置包括:

意图封装模块,用于服务方响应于调用方发出的接口调用请求,将所述接口调用请求以及被调用接口的相关数据封装为意图,并将所述意图提交给协调器;

断言模块,用于所述协调器对所述意图进行验证,得到针对所述意图的断言,并将所述断言送至所述服务方;

服务模块,用于所述服务方根据所述断言,对所述接口调用请求进行响应。

可选地,所述接口的相关数据包括被调用接口涉及的数据源、数据位置和特征字段。

可选地,所述断言模块包括:

操作验证子模块,用于所述协调器根据所述意图,在数据源中验证所述意图对应的操作是否已经执行;

第一断言子模块,用于当验证结果为所述意图对应的操作未被执行时,所述协调器对所述意图进行锁定,并向所述服务方发送操作未执行的断言;

第二断言子模块,用于当验证结果为所述意图对应的操作已被执行时,所述协调器向所述服务方发送操作已执行的断言。

可选地,所述服务模块包括:

操作执行子模块,用于当所述断言为操作未执行时,所述服务方执行所述意图对应的操作,并向所述调用方发送调用成功的消息;

消息返回子模块,用于当所述断言为操作已执行时,所述服务方向所述调用方发送调用成功的消息。

可选地,所述装置还包括:

指令发送子模块,用于当所述服务方对所述意图对应的操作执行完成时,向所述协调器发送意图解锁指令;

第一意图解锁子模块,用于所述协调器根据所述意图解锁指令,对所述意图进行解锁。

可选地,所述装置还包括:

第三断言子模块,用于当所述协调器在第一预设时间段内未接收到所述意图解锁指令时,每隔一个第二预设时间段,对所述意图进行验证,得到针对所述意图的断言;

第二意图解锁子模块,用于当所述断言为操作已执行时,所述协调器对所述意图进行自动解锁;

意图挂起子模块,用于当经过预设次数的验证后所述断言仍然为操作未执行时,所述协调器将所述意图进行挂起,并发出手动解锁通知。

可选地,所述方法还包括:

实例部署子模块,用于在所述协调器中部署多个实例;

在所述服务方提交给所述协调器多个不同的意图的情况下,所述协调器对所述意图进行验证,得到针对所述意图的断言,包括:

第四断言子模块,用于所述协调器利用自身部署的不同的实例对所述多个不同的意图进行验证,得到多个断言。

本申请实施例第三方面提供一种可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时,实现如本申请第一方面所述的方法中的步骤。

本申请实施例第四方面提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时,实现本申请第一方面所述的方法的步骤。

采用本申请提供的接口幂等调用的方法,服务方响应于调用方发出的接口调用请求,将所述接口调用请求以及被调用接口的相关数据封装为意图,并将所述意图提交给协调器;所述协调器对所述意图进行验证,得到针对所述意图的断言,并将所述断言送至所述服务方;所述服务方根据所述断言,对所述接口调用请求进行响应。其中,将调用请求以及接口相关数据封装为意图,由服务方发送至协调器中进行处理,无需对调用方进行任何特殊处理,对服务方的业务逻辑也无任何影响,不需要为了保证调用的幂等性,再对调用方和服务方都进行编码处理,提升了工作效率。

附图说明

为了更清楚地说明本申请实施例的技术方案,下面将对本申请实施例的描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。

图1是本申请一实施例提出的接口幂等调用的方法的流程图;

图2是本申请一实施例提出的接口幂等调方法的框架图

图3是本申请一实施例提出的接口幂等调用的装置的示意图。

具体实施方式

下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。

参考图1,图1是本申请一实施例提出的接口幂等调用的方法的流程图。如图1所示,该方法包括以下步骤:

s11:服务方响应于调用方发出的接口调用请求,将所述接口调用请求以及被调用接口的相关数据封装为意图,并将所述意图提交给协调器。

本实施例中,服务方属于被调用方,接口调用请求用于请求调用服务方中的接口,意图是对数据的增加删除和修改的统一描述,意图还包括了查询,但查询不涉及幂等性,故不在此讨论,意图的三种形式是:新增意图,删除意图和修改意图。一个意图中包含的信息有:数据所在的数据源、数据所在的具体位置(若果是数据库则是具体的表),特征字段。其中,特征字段可以是多个,所有的特征字段能唯一表达该意图的执行结果。协调器是对意图进行验证和断言的模块。当调用方需要调用可以表达该接口执行的结果,对于一个接口来说,若一个意图无法精确表达该接口的执行结果,可以使用多个意图来进行表达。封装就是将这些代码作为一个整体封装至一段程序中。

本申请实施例中,所述接口的相关数据包括被调用接口涉及的数据源、数据位置和特征字段。

示例地,调用方为身份信息录入系统,调用方需要新增一个用户的身份信息,调用方将新增用户身份信息需要用到的接口的调用请求发送至服务方,服务方将该调用请求,以及需要调用的接口中涉及到的数据源(用户身份信息库),数据位置(身份信息库的存储位置),特征字段(表示用户的具体身份信息的字段)进行封装,封装方式在此不做限制,例如可以通过aop等技术制作一个sdk,并且用注解的方式封装意图。将封装好的意图发送至协调器。其中,特征字段可以是用户的名称,用户的身份信息,用户的籍贯信息等。

s12:所述协调器对所述意图进行验证,得到针对所述意图的断言,并将所述断言送至所述服务方。

本实施例中,协调器与服务方连接,用于对服务方发送的意图进行验证,协调器内部设置有并发控制模块,用于对当前意图进行锁定,相同的意图对应的操作只有在解锁后才能再次执行。断言(assert)指针对该意图发出的判断结果,即当前意图对应的操作是否已经执行。

其中,所述协调器对所述意图进行验证,得到针对所述意图的断言的具体步骤为:

s12-1:所述协调器根据所述意图,在数据源中验证所述意图对应的操作是否已经执行。

本实施例中,协调器在接收到服务方发送的意图之后,根据意图中包含的数据源、数据位置和特征字段,验证意图对应的操作是否已经执行。

示例地,以意图中包含的数据源为身份信息数据库为例,当意图执行的结果为在身份信息数据库中录入用户的身份信息时,协调器会在身份信息数据库中进行查询,看该用户的身份信息(姓名、身份证号、户籍)是否已经录入了数据库中。

s12-2:当验证结果为所述意图对应的操作未被执行时,所述协调器对所述意图进行锁定,并向所述服务方发送操作未执行的断言。

本实施例中,协调器根据接收到的意图,在数据源中根据数据位置查找该特征字段,当在数据源中未找到该意图对应的特征字段时,则判定该意图对应的操作未执行,此时,通过协调器内部的并发控制模块,对该意图进行锁定,将意图进行锁定之后,在该意图解锁之前,想要执行相同的意图,必须等待意图解锁。协调器向服务方发送操作未执行的断言。

示例地,当意图执行的结果为在数据库中加入用户的身份信息时,协调器在身份信息数据库中查询该用户的姓名、身份证号、户籍等信息是否录入了身份信息数据库中,当在数据库中无法查找到用户的身份信息时,向服务方发送操作未执行的断言。

s12-3:当验证结果为所述意图对应的操作已被执行时,所述协调器向所述服务方发送操作已执行的断言。

本实施例中,当协调器在数据源中查找到了意图中对应的特征字段时,视为意图对应的操作已被执行,此时就向服务方发送操作已经执行的断言。

示例地,当意图执行的结果为在数据库中加入用户的身份信息时,协调器在身份信息数据库中查询该用户的姓名、身份证号、户籍等信息是否录入了身份信息数据库中,当查找到对应的身份信息时,向服务方发送操作已执行的断言。

s13:所述服务方根据所述断言,对所述接口调用请求进行响应。

本实施例中,服务方在接收到协调器发出的断言之后,会根据该断言,对接口调用请求进行响应,具体包括步骤s13-1和步骤s13-2:

步骤s13-1:当所述断言为操作未执行时,所述服务方执行所述意图对应的操作,并向所述调用方发送调用成功的消息。

本实施例中,当服务方接收到的断言为操作未执行,则服务方执行对应的操作的代码,对数据源进行整加、删除或者修改的操作。

示例地,当意图执行的结果为在数据库中新增用户信息时,服务方接收到的断言为操作未执行时,则服务方开始执行在数据库中新增用户信息的代码,在数据库中新增用户的身份信息。

步骤s13-2当所述断言为操作已执行时,所述服务方向所述调用方发送调用成功的消息。

本实施例中,当服务方接收到的断言为操作已执行,则服务方向调用方发送调用成功的消息。

示例地,当意图执行的结果为在数据库中新增用户信息时,服务方接收到的断言为操作已执行,则服务方向身份信息录入系统发送身份信息已成功录入的消息。

本实施例中,还包括以下步骤:

s14-1:当所述服务方对所述意图对应的操作执行完成时,向所述协调器发送意图解锁指令。

s14-2:所述协调器根据所述意图解锁指令,对所述意图进行解锁。

本实施例中,当服务方对意图对应的操作执行完成之后,向协调器发送意图解锁指令,协调器在接收到该意图解锁指令后,根据该指令对意图进行解锁,在意图解锁之后,可以继续执行相同意图对应的操作。

本实施例中,可以通过异步的方式通知协调器解锁当前意图,这样可以确保服务方和协调器中的任务的正常运行。

示例地,当意图执行的结果为在数据库中新增用户信息时,此时服务方已经在数据库中增加了用户的信息,则向协调器发出意图解锁指令,协调器对对应的意图进行解锁。

本实施例中,还包括以下步骤:

s15-1:当所述协调器在第一预设时间段内未接收到所述意图解锁指令时,每隔一个第二预设时间段,对所述意图进行验证,得到针对所述意图的断言。

本实施例中,第一预设时间段和第二预设时间段都可以自行设置。

本实施例中,因为网络抖动的原因,服务方已经执行了操作并发出了意图解锁指令,但协调器并没有接收到该意图解锁指令,因此该意图仍然处于锁定状态。当协调器在第一预设时间段内并未接收到意图解锁指令时,则每隔一个第二预设时间段,对该意图再次进行验证,得到针对该意图的断言。

s15-2:当所述断言为操作已执行时,所述协调器对所述意图进行自动解锁。

本实施例中,当断言为操作已成功时,对意图进行自动解锁,解锁后服务方可以继续执行相同的操作。

s15-3:当经过预设次数的验证后所述断言仍然为操作未执行时,所述协调器将所述意图进行挂起,并发出手动解锁通知。

本实施例中,预设次数可以自行设定,当经过预设次数的断言仍然为操作未执行时,可能是出现了问题导致意图无法解锁,此时将该意图挂起,就是暂时将该意图进行搁置,不去处理该意图,发出手动解锁通知,相关负责人员在接收到手动解锁通知后,对该意图进行手动解锁。

示例地,服务方执行完一个意图对应的操作,向协调器发出意图解锁指令,此时网络发生抖动,协调器未接收到指令,协调器在1分钟之内未接收到意图解锁指令,则协调器对该意图进行验证,发现该意图对应的操作已经执行过,则得到操作已执行过的断言,同时对该意图进行解锁。当协调器验证结果为操作未执行时,没间隔30秒钟,再次对该意图进行验证,当连续3次验证结果均为操作未执行,则程序有可能出现故障,此时将该意图挂起,向相关负责人发送手动解锁通知。

在本申请的另一个实施例中,还有以下步骤:

s21:在所述协调器中部署多个实例。

s22:在所述服务方提交给所述协调器多个不同的意图的情况下,所述协调器对所述意图进行验证,得到针对所述意图的断言,包括:

所述协调器利用自身部署的不同的实例对所述多个不同的意图进行验证,得到多个断言。

本实施例中,考虑到系统的可用性和负载压力,可以在协调器中部署多个实例,就是多个任务进程,这些任务进程可以并行执行任务,对意图进行验证。服务方可以将不同的意图,根据意图的散列码,相当于意图的分类编码,将意图发送到不同的实例中进行处理,这样可以保证处理的速度。

示例地,服务方将新增用户信息的请求对应的意图发送至协调器的实例一种进行处理,将删除用户信息的请求对应的意图发送至协调器的实例二中进行处理。

如图2所示,图2是本申请一实施例提出的接口幂等调方法的框架图。

图2中,调用方向服务方发送调用请求,服务方将调用请求和对应的接口信息封装为意图,并发送至协调器,协调器根据该意图,在数据源中验证该意图对应的操作是否已经执行过,验证完成后,将断言发送至服务方,服务方根据该断言对调用请求进行响应,在执行操作成功后向协调器发送解锁指令。

采用本实施例中的接口幂等调用方法,可以只在服务方中进行处理,调用方不用进行任何的处理,可以不用在调用方和被调用方都进行编码处理,同时调用方可以进行任意次数的重试,保证调用成功。本实施例中采用了意图来表达调用方想要执行的操作的结果,对结果进行验证之后,再向服务方发送断言,调用方只需要发送调用请求即可,处理速度得到了提升。对服务方来说,采用了对业务非侵入的sdk,在调用操作进行时,服务方本来的业务与被调用的业务可以同时进行,不会影响服务方本来的业务。调用方在进行接口调用时,若未得到操作成功的反馈,则可以多次重复发出调用请求,直到操作执行成功为止,防止因网络发生抖动而请求未被接收的情况发生。

在本申请的另一个实施例中,用户在提交文件时,重复点击了多次提交按钮,用户可以视作为调用方,服务方在接收到用户的提交请求时,将该提交请求和相应的接口信息封装为意图,发送至协调器,协调器根据该意图,验证数据库中是否有已经存在该文件,若该文件不存在,则发出操作未执行的断言,若该文件已存在,则发出操作已执行的断言,服务方根据接收到的断言向数据库中添加文件或向用户返回提交成功的信息。

另外本申请实施例中的接口幂等调用方法,还适用于微服务架构等分布式架构内系统间的接口调用。在分布式架构中,系统之间需要进行频繁的调用,当第一次调用超时时,主系统(调用方)会认为调用失败而进行重试,而第一次超时的调用可能在主系统进行重试是就已经被服务方系统处理了,如果调用过程不是幂等的,就可能造成两次重复调用最终结果不一致的情况,为了保证接口的幂等性,开发人员必须对每个接口进行编码处理,而使用本方案,对调用方无需任何处理,服务方负责封装意图并发送至协调器,对服务方本身的业务逻辑也无任何影响,因为协调器会对意图进行锁定,因此调用方可以进行任意次数的重试,保证调用成功,显著提升了分布式系统间接口调用的准确度和速度。

基于同一发明构思,本申请一实施例提供一种接口幂等调用的装置。参考图3,图3是本申请一实施例提出的接口幂等调用的装置300的示意图。

如图3所示,该装置包括:

意图封装模块301,用于服务方响应于调用方发出的接口调用请求,将所述接口调用请求以及被调用接口的相关数据封装为意图,并将所述意图提交给协调器。

断言模块302,用于所述协调器对所述意图进行验证,得到针对所述意图的断言,并将所述断言送至所述服务方;

服务模块303,用于所述服务方根据所述断言,对所述接口调用请求进行响应;

可选地,所述接口的相关数据包括被调用接口涉及的数据源、数据位置和特征字段。

可选地,所述断言模块包括:

操作验证子模块,用于所述协调器根据所述意图,在数据源中验证所述意图对应的操作是否已经执行;

第一断言子模块,用于当验证结果为所述意图对应的操作未被执行时,所述协调器对所述意图进行锁定,并向所述服务方发送操作未执行的断言;

第二断言子模块,用于当验证结果为所述意图对应的操作已被执行时,所述协调器向所述服务方发送操作已执行的断言。

可选地,所述服务模块包括:

操作执行子模块,用于当所述断言为操作未执行时,所述服务方执行所述意图对应的操作,并向所述调用方发送调用成功的消息;

消息返回子模块,用于当所述断言为操作已执行时,所述服务方向所述调用方发送调用成功的消息。

可选地,所述装置还包括:

指令发送子模块,用于当所述服务方对所述意图对应的操作执行完成时,向所述协调器发送意图解锁指令;

第一意图解锁子模块,用于所述协调器根据所述意图解锁指令,对所述意图进行解锁。

可选地,所述装置还包括:

第三断言子模块,用于当所述协调器在第一预设时间段内未接收到所述意图解锁指令时,每隔一个第二预设时间段,对所述意图进行验证,得到针对所述意图的断言;

第二意图解锁子模块,用于当所述断言为操作已执行时,所述协调器对所述意图进行自动解锁;

意图挂起子模块,用于当经过预设次数的验证后所述断言仍然为操作未执行时,所述协调器将所述意图进行挂起,并发出手动解锁通知。

可选地,所述方法还包括:

实例部署子模块,用于在所述协调器中部署多个实例;

在所述服务方提交给所述协调器多个不同的意图的情况下,所述协调器对所述意图进行验证,得到针对所述意图的断言,包括:

第四断言子模块,用于所述协调器利用自身部署的不同的实例对所述多个不同的意图进行验证,得到多个断言。

基于同一发明构思,本申请另一实施例提供一种可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如本申请上述任一实施例所述的接口幂等调用的方法中的步骤。

基于同一发明构思,本申请另一实施例提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行时实现本申请上述任一实施例所述的接口幂等调用的方法中的步骤。

对于装置实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。

本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。

本领域内的技术人员应明白,本申请实施例可提供为方法、装置、或计算机程序产品。因此,本申请实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。

本申请实施例是参照根据本申请实施例的方法、终端设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理终端设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理终端设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理终端设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理终端设备上,使得在计算机或其他可编程终端设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程终端设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

尽管已描述了本申请实施例的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请实施例范围的所有变更和修改。

最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者终端设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者终端设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者终端设备中还存在另外的相同要素。

以上对本申请所提供的一种接口幂等调用的方法、装置、设备及存储介质,进行了详细介绍,本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本申请的限制。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1