CN115936608A - 基于交易链路的分布式流水号生成方法、装置及存储介质 - Google Patents

基于交易链路的分布式流水号生成方法、装置及存储介质 Download PDF

Info

Publication number
CN115936608A
CN115936608A CN202211527791.4A CN202211527791A CN115936608A CN 115936608 A CN115936608 A CN 115936608A CN 202211527791 A CN202211527791 A CN 202211527791A CN 115936608 A CN115936608 A CN 115936608A
Authority
CN
China
Prior art keywords
transaction
service
sub
calling
link
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.)
Granted
Application number
CN202211527791.4A
Other languages
English (en)
Other versions
CN115936608B (zh
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.)
Shenzhen Ylink Computing System Co ltd
Original Assignee
Shenzhen Ylink Computing System 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 Shenzhen Ylink Computing System Co ltd filed Critical Shenzhen Ylink Computing System Co ltd
Priority to CN202211527791.4A priority Critical patent/CN115936608B/zh
Publication of CN115936608A publication Critical patent/CN115936608A/zh
Application granted granted Critical
Publication of CN115936608B publication Critical patent/CN115936608B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Exchange Systems With Centralized Control (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明公开了一种基于交易链路的分布式流水号生成方法、装置及存储介质,包括:业务系统收到业务请求后,首先获取全局业务号GlobalBusinessNo及子交易号SubTxNo;根据系统调用类型,确定应使用的子交易号生成及变动规则函数类型;使用所述子交易号生成及变动规则函数更新子交易号SubTxNo;所述全局业务号GlobalBusinessNo与更新后的所述子交易号SubTxNo组合为更新后的流水号,并存储在输出的日志中。本发明能够不依赖特定资源,且高并发、高效率地生成流水号,生成的流水号能够通过自带信息自动记录调用关系,高效率定位各个交易节点,提高对交易链路监控分析效率。

Description

基于交易链路的分布式流水号生成方法、装置及存储介质
技术领域
本发明涉及计算机数据处理领域,具体为基于交易链路的分布式流水号生成方法、装置及存储介质。
背景技术
相关术语解释:
流水号:在软件应用系统中,通常需要生成唯一的流水号作为每笔业务或者交易数据的唯一标识,便于记录、检索、分析和审计。其最基本的要求是一定范围内确保唯一不重复,可由一组号码组成,也可由多组号码共同组成。
全局业务号GlobalBusinessNo:在实际应用系统中,每一笔业务需要由多个系统或模块共同协作处理完成。为了在多个系统或模块中定位和跟踪某笔业务,需要生成一个的编号即全局业务号来标识该笔业务,该笔业务流转到任一节点,全局业务号均保持不变,且应保证其全局各系统或模块范围内唯一不重复。
子交易号SubTxNo:因全局业务号流转过程中保持不变,为了区分识别跟踪该笔业务在各个系统或模块的流转情况,在该笔业务经过每一个系统或模块时,为其分配一个序号作为子交易号用来标记该处理节点。子交易号要求在一笔业务流经的链路节点范围内确保唯一且有序。
全局业务号GlobalBusinessNo、子交易号SubTxNo两者共同组成分布式流水号(简称流水号)。
目前,生成流水号方法大致包括两类:集中式生成方式及分布式生成方式,但通常存在以下缺陷:
(1)集中式生成方式是应用系统中各模块借助一个集中式资源来生成并保证流水号唯一不重复,需要依赖某个特定资源,比如数据库Sequence对象或者全局流水号服务器,若集中式资源发生故障则会导致应用系统整体不可用,存在并发性能低、可靠性低及不适用于与分布式系统等不足;
(2)分布式生成方式虽无需借助集中式资源,应用系统中各个模块分别生成流水号,通过合理的设计来确保生成的流水号全局唯一不重复,但现阶段通过分布式机制生成的流水号通常无法携带业务信息,比如基于雪花算法或其改进方案(CN111930765A)生成的流水号无法携带日期等,不便于业务人员根据流水号快速定位业务;
(3)业务流转多个节点时,无法通过流水号的自带信息自动记录调用顺序及层级关系,也无法根据流水号定位各个交易节点,交易链路监控分析效率较低。
因此,我们需要开发出一种基于交易链路的分布式流水号生成方法及装置,能够不依赖特定资源,且高并发、高效率地生成流水号,生成的流水号能够通过自带信息自动记录调用关系,高效率定位各个交易节点,提高对交易链路监控分析效率。
发明内容
本发明的目的在于提供一种基于交易链路的分布式流水号生成方法、装置及存储介质,以解决上述背景技术中提到的现有的过于依赖特定资源、并发性能低、无法通过流水号自带信息自动记录调用关系,定位各个交易节点等问题。
为实现上述目的,本发明采用以下技术方案:
根据本发明的一个方面,提供一种基于交易链路的分布式流水号生成方法,所述方法包括:
业务系统收到业务请求后,首先获取全局业务号GlobalBusinessNo及子交易号SubTxNo;
根据系统调用类型,确定应使用的子交易号生成及变动规则函数类型;
使用所述子交易号生成及变动规则函数更新子交易号SubTxNo;
所述全局业务号GlobalBusinessNo与更新后的所述子交易号SubTxNo拼装为更新后的流水号,并存储在输出的日志中。
根据本发明的另一个方面,提供一种基于交易链路的分布式流水号生成装置,其特征在于,包括:
获取模块:用于系统收到业务请求后,首先获取全局业务号GlobalBusinessNo及子交易号SubTxNo;
调用模块:用于根据系统调用类型,确定应使用的子交易号生成及变动规则函数类型;
子交易号更新模块:用于使用所述子交易号生成及变动规则函数更新子交易号SubTxNo;
流水号输出模块:用于将所述全局业务号GlobalBusinessNo与更新后的所述子交易号SubTxNo拼装为更新后的流水号,并存储在输出的日志中。
基于前述方案,上述系统调用类型包括横向维度与纵向维度:
若业务流转经过新的节点,调用层级增加,则所述系统调用类型为横向维度;
若在同一节点内,对外调用次数增加,则所述系统调用类型为纵向维度。
基于前述方案,上述子交易号生成及变动规则函数包括横向维度函数getSubTxNoX()及纵向维度函数getSubTxNoY();所述系统调用类型为横向维度时,使用getSubTxNoX()函数,所述系统调用类型为纵向维度时,使用getSubTxNoY()函数。
通过横向、纵向两个维度生成交易链路内子交易号,能够全面的记录业务流转所经过的各个节点,便于需要时追踪定位。
基于前述方案,上述getSubTxNoX()函数的定义:
如果,传入参数原子交易号original_SubTxNo为空值,则生成交易链路纵横点编号初始值:首位为1,其余位为0;
否则,从原子交易号original_SubTxNo取出交易链路纵横点编号,从交易链路纵横点编号中从左至右找出第一个“0值”位,对该位值赋值为1;
将调用方系统标识、调用方系统运行实例编号、新得到的交易链路纵横点编号拼装得到新子交易号;
将所述新子交易号作为结果返回。
基于前述方案,上述getSubTxNoY()函数的定义:
如果,传入参数原子交易号original_SubTxNo为空值,则生成交易链路纵横点编号初始值:首位为1,其余位为0;
否则,从原子交易号original_SubTxNo取出交易链路纵横点编号,从交易链路纵横点编号中从左至右找出最后一个“非0值”位,取出该位的值并依次选用“1-9-A-Z-a-z”赋值该位;
将调用方系统标识、调用方系统运行实例编号、新得到的交易链路纵横点编号拼装得到新子交易号;
将所述新子交易号作为结果返回。
通过横向、纵向维度调用函数生成交易链路纵横点编号,效率高、不重复且通过其能够直观的确定业务发生调用的层级及某个节点对外调用的次数。
基于前述方案,上述业务系统收到业务请求后,若所述业务系统为始端系统,所述始端系统首先获取所述全局业务号GlobalBusinessNo,并通过getSubTxNoX()函数获取子交易号SubTxNo初始值。
基于前述方案,上述全局业务号GlobalBusinessNo包括时间戳,始端系统标识、始端系统运行实例编号以及序列号;
所述时间戳为业务发起的时间;
所述始端系统标识为提前为每个系统分配定义的系统编号;
所述始端系统运行实例编号为始端系统内部的服务或微服务实例编号,在一个系统内部具有唯一性,包括IDC数据中心或机房编号、服务或微服务代号及每个服务或微服务的实例序号;
所述序列号为每个运行实例自身的序列号生成器生成的序号,其单向递增、达最大值后归零。
全局业务号涵盖时间信息、业务发起的始端系统信息等,在交易链路上的各个节点均保持不变,通过其能够准确确定在某一链路发生的所有业务。
基于前述方案,上述子交易号SubTxNo包括调用方系统标识、调用方系统运行实例编号及交易链路纵横点编号;
所述调用方系统标识为提前为每个调用方系统分配定义系统编号;
所述调用方系统运行实例编号为调用方系统内部的服务或微服务实例编号,在一个系统内部具有唯一性,包括IDC数据中心或机房编号、服务或微服务代号及每个服务或微服务的实例序号;
所述交易链路纵横点编号为横向、纵向两个维度的调用链路标记。
基于前述方案,上述子交易号SubTxNo在交易链路上具有唯一性。
具体地,系统调用类型为纵向维度时,子交易号中的调用方系统标识、调用方系统运行实例编号保持不变,交易链路纵横点编号通过getSubTxNoY()函数更新,记录调用次数增加;系统调用类型为纵向维度时,通过getSubTxNoX()函数,获取当前节点的调用方系统标识、调用方系统运行实例编号、更新交易链路纵横点编号,记录调用层级增多。全局业务号与子交易号一静一动,相互结合,在实现交易链路追踪业务流转节点的同时,也能对交易链路及链路上的各个分支进行唯一标识。
本发明实施例还提供了一种计算机存储介质,所述计算机存储介质存储有计算机可执行代码;所述计算机可执行代码被执行后,能够实现前述一个或多个技术方案提供的流水号生成方法。
由上述技术方案可知,本发明与现有技术相比至少具备以下优点和积极效果:
(1)本发明采用分布式的方法生成流水号,不依赖于特定集中化资源的生成机制,生成效率及并发性高。
(2)本发明的流水号中自身携带重要的业务与技术信息,通过流水号即可直观、快速地定位信息(如发生时间、所属系统、所属服务和实例节点等),监控人员无需借助其他辅助信息,只通过流水号即可直观获取某项业务的发生时间、所属链路、所属系统、所属实例节点及发生调用的次数等有效信息,获取有效信息的效率提高。
(3)本发明的流水号包括全局业务号及子交易号两部分,全局业务号全流程共用,一直持续到业务处理链路结束,子交易号兼备系统信息、横向维度调用计数及纵向维度调用计数,以占位符的方式表述,并沿着交易链路向后传递,保证该交易链路上任一节点的子交易号具有唯一性,两者一静一动,相互结合,在实现交易链路追踪业务流转节点的同时,也能对交易链路及链路上的各个分支进行唯一标识,在实际应用中,流水号信息自动记录调用关系,无需依赖其他信息,即可根据流水号定位各个交易节点,直观的追踪及定位业务的流转情况,有效提高对交易链路监控分析效率。
本发明应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本发明。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本发明的实施例,并与说明书一起用于解释本发明的原理。显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。在附图中:
图1为本发明分布式流水号生成方法流程框图;
图2为本发明全局业务号构成示意图;
图3为本发明子交易号构成示意图;
图4为本发明业务系统间调用关系的示意图;
图5为本发明getSubTxNoX()函数的定义规则的流程框图;
图6为本发明getSubTxNoY()函数的定义规则的流程框图;
图7为本发明交易链路流水号使用场景和流程示意图;
图8为本发明基于分布式流水号生成装置示意图。
具体实施方式
为了更加清楚的阐述本发明的目的、技术方案和优点,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明的一部分实施例,而不是全部的实施例,示例实施方式能够以多种形式实施,且不应被理解为限于在此阐述的范例;相反,提供这些实施方式使得本发明将更加全面和完整,并将示例实施方式的构思全面地传达给本领域的技术人员。
此外,所描述的特征、结构或特性可以以任何合适的方式结合在一个或更多实施例中。在下面的描述中,提供许多具体细节从而给出对本发明的实施例的充分理解。然而,本领域技术人员将意识到,可以实践本发明的技术方案而没有特定细节中的一个或更多,或者可以采用其它的方法、组元、装置、步骤等。在其它情况下,不详细示出或描述公知方法、装置、实现或者操作以避免模糊本发明的各方面。
附图中所示的方框图仅仅是功能实体,不一定必须与物理上独立的实体相对应。即,可以采用软件形式来实现这些功能实体,或在一个或多个硬件模块或集成电路中实现这些功能实体,或在不同网络和/或处理器装置和/或微控制器装置中实现这些功能实体。
附图中所示的流程图仅是示例性说明,不是必须包括所有的内容和操作/步骤,也不是必须按所描述的顺序执行。例如,有的操作/步骤还可以分解,而有的操作/步骤可以合并或部分合并,因此实际执行的顺序有可能根据实际情况改变。
下面结合具体实施例对本发明进行详细的说明:
实施例1
如图1所示,本实施例提供了一种基于交易链路的分布式流水号生成方法,该方法的具体步骤如下:
S1:业务系统收到业务请求后,首先获取全局业务号GlobalBusinessNo及子交易号SubTxNo;
在本实施例中,优选地,业务系统可以分为两种,一种为每笔业务开始时,在交易链路中,作为首个业务系统直接受理用户请求的始端系统;一种为业务流转过程中,在交易链路中流经的除始端系统以外的任意中间系统。
进一步地,若所述业务系统为始端系统,始端系统首先根据时间戳、始端系统标识、始端系统运行实例编号以及序列号获取全局业务号GlobalBusinessNo;获取的原子交易号original_SubTxNo为空值,通过getSubTxNoX()函数获取当前节点调用方系统标识、调用方系统运行实例编号,更新交易链路纵横点编号初始值,具体地,初始值的交易链路纵横点首位为1,其余位为0。
进一步地,若所述业务系统为任意中间系统,则从收到的请求报文中获取全局业务号GlobalBusinessNo与子交易号SubTxNo。
在本实施例中,具体地,全局业务号GlobalBusinessNo采用4段32位编码方式,包括14位时间戳、5位始端系统标识、7位始端系统运行实例编号以及6位序列号。
表1示例性的展示了全局业务号GlobalBusinessNo的编码规则,具体如下;
表1
Figure BDA0003975490000000081
具体地,时间戳为业务发起的时间,时间戳通常排在全局业务号的第一段,可以对始端系统发起的业务按时间进行初步的排序,在本实施例中,长度为14位,精确到秒,格式为YYYYMMDDHHMMSS。如此,便于工作人员快速定位某笔业务的发生日期,并对后续性能分析有一定帮助。
进一步地,始端系统标识表示业务发起的始端系统,为提前为每个系统分配定义的系统编号,在本实施例中,长度为5位;
进一步地,始端系统运行实例编号为始端系统内部的服务或微服务实例编号,运行实例指运行时部署的实例,每个实例具体到运行时的最小部署单元(如一个Java进程/JVM、容器、C进程组/进程等)。在本实施例中,长度为7位,在一个系统内部自行编排并保证其唯一性。优选地,始端系统运行实例编号包括1位IDC数据中心或机房编号,如1代表北京IDC数据中心、2代表深圳IDC数据中心、3代表贵州IDC数据中心等;2位服务或微服务代号,如01代表客户管理服务、02代表订单服务、03代表资金账务服务等;4位每个服务或微服务的实例序号,对同个服务或微服务部署时通常存在多个运行实例,每个运行实例按顺序编排。如始端系统运行实例编号“1030001”表示位于北京IDC数据中心的资金账务服务的1号运行实例,服务实例编号“2010004”表示位于深圳IDC数据中心的客户管理服务的4号运行实例。需要说明的是,上述7位始端系统运行实例编号编排规则仅仅是示例性展示的一种方案,实际应用中,在确保一个系统范围内的始端系统运行实例编号具有唯一性前提下,可以结合系统具体情况调整规则。
进一步地,序列号为每个运行实例自身的序列号生成器生成的序号,其单向递增、达最大值后归零,长度为6位。优选地,可从0开始递增,每取出一个序列号后即向上加1,到达999999之后,从0重复开始循环。序列号与时间不相关,因为机器的系统时间会被手动调整或自动同步而可能出现相同的时间,因此禁止到达某一时间点即对序列号清零,应保证服务重启、系统重启、断电后重启等情况下序列号单仍然保持向前递增,禁止出现如下情形:当前序列号为120000,重启后,序列号从0开始。
为了达到保证序列号单向递增的目的,优选地,可采用记录“下一脚印”的方式。具体地,如当前序列号为120000,设步幅为10000,则“下一脚印”为130000,将130000这个数值固化存储到磁盘,正常情形下序列号从120000不断加1向前递增,如因重启等原因而导致序列号中断,则重启后从磁盘中读取“下一脚印”的数值,序列号直接从130000开始递增,跳过120000至130000之间的其余数值。每走完一个步幅,则将“下一脚印”对应的序列号更新到磁盘。在实际应用中,步幅的长度可由应用的实际情况调节,不宜过大也不宜过小。
如图2所示,示例性的呈现了一个全局业务号的构成。
在本实施例中,全局业务号支持分布式方式生成,由于系统采用多实例并且在多台机器上部署,每个实例可各自独立生成全局业务号,能够支持高并发的全局业务号生成。
全局业务号对业务人员通常可见,业务人员通过全局业务号,可以直观的得到业务发起的时间、业务发起的始端系统、业务发起的数据中地点、业务类型以及运行实例发生的先后顺序等信息,在业务层面,全局业务号作为业务流水的标识,且其全流程共用,一直持续到业务处理链路结束。即同一业务在各系统或各平台或各组件或各事务流转处理时继承同一全局业务号;若一个业务触发多个子业务,子业务也继承同一全局业务号。
因此,通过全局业务号,可以高效的定位某项业务流经的各个节点以及触发的子业务等。此外,由于在银行、保险、证券等金融领域,柜员等业务人员习惯于高频通过数字小键盘输入,本发明的32位全局业务号为纯数字,更便于业务人员快速输入,符合金融行业实际操作习惯。
需要说明的是,以上示例性的展示不作为全局业务号中编码的段数、各段编码的位数、各段编码的先后组合方式的限制,在本实施例的基础上,对全局业务号中编码的段数、各段编码的位数、各段编码的先后组合方式等进行修改或演变的结果,均属于本发明的保护范围。
在本实施例中,子交易号SubTxNo采用3段48位编码方式,包括5位调用方系统标识、7位调用方系统运行实例编号及36交易链路纵横点编号。
表2示例性的展示了子交易号SubTxNo的编码规则,具体如下:
表2
Figure BDA0003975490000000101
进一步地,调用方系统标识为提前为每个调用方系统分配定义系统编号,具体编码方式与始端系统标识相同,在此不再赘述;
进一步地,调用方系统运行实例编号为调用方系统内部的服务或微服务实例编号,在一个系统内部具有唯一性,包括IDC数据中心或机房编号、服务或微服务代号及每个服务或微服务的实例序号,具体涉及的内容及定义与始端系统运行实例编号相同,此处不再赘述;
进一步地,交易链路纵横点编号为横向、纵向两个维度的调用链路标记,长度为36位,业务未发起前,交易链路纵横点编号为空值。横向维度用于记录交易链路上调用层级增加,最多支持记录36层级的服务调用;纵向用于记录同层调用内的对外调用的次数(自身也算一次)。优选地,在本实施例中纵向维度单节点最多支持记录61次系统调用。
交易链路纵横点编号兼备横向计数、纵向计数,以占位符的方式表述,并沿着交易链路向后传递,保证交易链路上各节点的子交易号具有唯一性。
如图3所示,示例性的呈现了一个子交易号的构成。
子交易号是对全局业务号的补充,用于在流转在多个系统或模块的过程中,对交易链路上各个分支进行标识,由每个调用方系统(组件)负责生成。典型应用场景是组合交易在服务组合点采用子交易号区分所组合的服务,非组合交易也需生成子交易号。
在本实施例中,在某项业务的流经的交易链路中,全局业务号贯穿整条链路保持不变,子交易号随业务流转而变化,两者一静一动,相互结合,在实现交易链路追踪业务流转节点的同时,也能对交易链路及链路上的各个分支进行唯一标识。此外,流水号中自身携带重要的业务与技术信息(如发生时间、所属系统、所属服务和实例节点等),监控人员无需借助其他辅助信息,只通过流水号即可直观、快速地获取某项业务的发生时间、所属链路、所属系统、所属实例节点及发生调用的次数等有效信息,通过该流水号能直观的追踪及定位业务的流转情况的同时,也能提高获取有效信息的效率,进而提高业务处理的效率。
需要说明的是,以上示例性的展示不作为子交易号中编码的段数、各段编码的位数、各段编码的先后组合方式的限制,在本实施例的基础上,对子交易号中编码的段数、各段编码的位数、各段编码的先后组合方式等进行修改或演变的结果,均属于本发明的保护范围。
S2:根据系统调用类型,确定应使用的子交易号生成及变动规则函数类型;
所述系统调用类型包括横向维度与纵向维度:
若业务流转经过新的节点,调用层级增加,则所述系统调用类型为横向维度;
若在同一节点内,对外调用次数增加,则所述系统调用类型为纵向维度。
在本实施例中,具体地,如图4所示,若始端系统或当前业务处理的中间系统为系统1,业务将流转至系统2,系统2为被调用方系统。系统1执行完业务逻辑后,需要调用系统2执行下一步业务逻辑,系统2接收到调用申请后执行业务逻辑,业务处理系统发生变化,调用层级增加,即系统调用类型为横向维度;而系统1在向系统2发起调用申请后,系统1内部对外调用次数发生变化,则应更新其发起调用的次数,即系统调用类型为纵向维度。
如图4所示,系统1依次向系统2、系统3、系统4发起调用,相对系统1而言,对外调用次数均增加,系统调用类型均为纵向维度,相对系统系统2、3、4而言,各系统接收到调用申请的报文后,执行业务逻辑的系统均发生改变,则系统调用类型均为横向维度;系统2向系统5发起调用,相对系统2而言,系统调用类型为纵向维度,相对系统5而言,系统调用类型为横向维度。
S3:使用所述子交易号生成及变动规则函数更新子交易号SubTxNo;
在本实施例中,优选地,子交易号生成及变动规则函数包括横向维度函数getSubTxNoX()及纵向维度函数getSubTxNoY()。通过S2确定系统调用类型后,从函数存储单元调用对应的函数,利用调用的函数将获取到的子交易号进行更新。结合图4,系统1向系统2发起调用,相对系统1而言,则在发出请求报文前应通过getSubTxNoY()函数对原子交易号进行更新,以记录调用次数加1,系统2接收到请求报文后,通过getSubTxNoX()函数对从请求报文中获取的子交易号进行更新,以体现调用层级增加。
S4:所述全局业务号GlobalBusinessNo与更新后的所述子交易号SubTxNo拼装为更新后的流水号,并存储在输出的日志中。
在本实施例中,优选地,全局业务号与子交易号组合得到完整的流水号,在整个交易链路中,全局业务号保持不变,子交易号随系统调用保持更新,更新后的子交易号与全局业务号重新拼装,形成最新的流水号,在业务流转过程中,存储于输出的日志中,便于监控人员只通过流水号即可直观定位到服务实例所属系统及节点。
实施例2
如图5所示,本实施例提供了getSubTxNoX()函数的定义,具体如下:
SX1:如果,传入参数原子交易号original_SubTxNo为空值,则生成交易链路纵横点编号初始值:首位为1,其余位为0;
优选地,对应施例1中业务系统可以分为两种的情况,通过S1获取到的原子交易号original_SubTxNo也存在两种情况,若是作为首个业务系统直接受理用户请求的始端系统,则原子交易号original_SubTxNo为空值;若为业务流转过程中的任意中间系统,则获取的原子交易号original_SubTxNo不为空值。
结合实施例1,作为首个业务系统直接受理用户请求的始端系统,在接收到业务请求时,获取的原子交易号original_SubTxNo为空值,将交易链路纵横点编号首位即最高位赋值为1,其余为0。
SX2:否则,从原子交易号original_SubTxNo取出交易链路纵横点编号,从交易链路纵横点编号中从左至右找出第一个“0值”位,对该位值赋值为1;
系统接收到的请求报文中携带的子交易号SubTxNo作为原子交易号original_SubTxNo。在业务流转过程中,除始端系统外途径任意中间系统时,该原子交易号original_SubTxNo不为空值。进一步地,从该原子交易号original_SubTxNo中提取出交易链路纵横点编号,遍历交易链路纵横点编号的数值,从左至右找出第一个“0值”位,以非0值填充表示已占用,本实施例优选地非0值为1,体现调用层级增加。图3示例性的展示了子交易号的构成,及从左至右第一个“0值”位的示例。
SX3:将调用方系统标识、调用方系统运行实例编号、新得到的交易链路纵横点编号拼装得到新子交易号;
系统调用类型为纵向维度,业务处理的节点未发生变化,则调用方系统标识、调用方系统运行实例编号保持不变,只有交易链路纵横点编号需要更新,将更新后的交易链路纵横点编号与原子交易号original_SubTxNo中的调用方系统标识、调用方运行实例编号重新拼装,得到更新后的子交易号。
SX4:将所述新子交易号作为结果返回。
更新后的子交易号作为结果返回,用于与原全局业务号拼装。
如图6所示,本实施例提供了getSubTxNoY()函数的定义,具体如下:
SY1:如果,传入参数原子交易号original_SubTxNo为空值,则生成交易链路纵横点编号初始值:首位为1,其余位为0;
具体地,作为首个业务系统直接受理用户请求的始端系统,在接收到业务请求时,获取的原子交易号original_SubTxNo为空值。
SY2:否则,从原子交易号original_SubTxNo取出交易链路纵横点编号,从交易链路纵横点编号中从左至右找出最后一个“非0值”位,取出该位的值并依次选用“1-9-A-Z-a-z”赋值该位;
进一步地,系统接收到的请求报文中携带的子交易号SubTxNo作为原子交易号original_SubTxNo。在业务流转过程中,除始端系统外途径任意中间系统时,该原子交易号original_SubTxNo不为空值。进一步地,从该原子交易号original_SubTxNo中提取出交易链路纵横点编号,遍历交易链路纵横点编号的数值,从左至右找出最后一个“非0值”位,并根据该位的当前值,依次选用“1-9-A-Z-a-z”赋值该位,体现调用次数增加。图3示例性的展示了从左至右最后一个“非0值”位的示例。
SY3:将调用方系统标识、调用方系统运行实例编号、新得到的交易链路纵横点编号拼装得到新子交易号;
系统调用类型为横向维度,业务处理系统发生改变,每经过一个新的节点,均需要获取当前节点的调用方系统标识、调用方系统运行实例编号,将更新的交易链路纵横点编号与当前节点调用方系统标识、调用方系统运行实例编号拼装得到新子交易号;
SY4:将所述新子交易号作为结果返回。
更新后的子交易号做为结果返回,用于与原全局业务号拼装。
实施例3
如图7所示,本实施例示例性的展示了交易链路上流水号使用场景和流程,具体如下:
在本实施例中,系统A直接接收前端用户发起的业务请求,则系统A为始端系统,系统B、系统C、系统D、系统E、系统F、系统G均为中间系统,将系统A中的运行实例定义为运行实例A,其他系统与之相同。需要说明的是,业务开始时,若前端用户直接对系统B或系统C或系统D或系统E或系统F或系统G直接发起业务请求时,则系统B或系统C或系统D或系统E或系统F或系统G也可作为始端系统。
S101:始端系统A接收到业务请求后,获取全局业务号及子交易号;
全局业务号:根据业务发起的时间及系统A的相关信息,获取单元获取时间戳、始端系统标识、始端系统运行实例编号以及序列号,在本实施例中,获取到的全局业务号为20220101121212903331010008000001,其构成示意图如图2所示。
子交易号:运行实例A在首端系统A,故原子交易号original_SubTxNo为空值。由实施例2知应使用getSubTxNoX()函数更新子交易号,将36位交易链路纵横点编号的最高位赋值为1,其余35位为“0”;当前节点的调用方系统标识、调用方运行实例编号与始端系统标识、始端系统运行实例编号分别相同;将更新后的交易链路纵横点编号与获取的调用方系统标识、调用方运行实例编号进行拼装,即得运行实例A的子交易号为:903331010008100000000000000000000000000000000000。
需要说明的是,本实施例提供的是某一业务交易链路上流水号的使用场景及流程,故全局业务号GlobalBusinessNo统一,流转至任一节点都不发生变化。
S102:拼装完整的子交易号与全局业务号组成流水号,存储于输出日志中,随请求报文在发生系统调用时进行流转;
S103:系统A中的运行实例A对外(如系统B、系统E、系统F等)发出调用。在发出请求报文前通过getSubTxNoY()函数更新子交易号,以记录对外调用次数增加。
运行实例A向系统B发出调用申请,运行实例A发生纵向维度调用,通过getSubTxNoY()函数对子交易号进行更新。具体地,获取运行实例A的原子交易号original_SubTxNo中的交易链路纵横点编号,从左至右找出最后一个“非0值”位,取出该位并依次选用1-9-A-Z-a-z赋值该位。进一步地,结合图7及本实施例S101可知,最后一个“非0值”位为1,则应选用2赋值该位;调用方系统标识、调用方运行实例编号不变,则第一次更新后的子交易号为903331010008200000000000000000000000000000000000,调用次数加1。
运行实例A向系统E发出调用申请,运行实例A发生纵向维度调用。子交易号在第一次更新后的基础上,通过getSubTxNoY()函数进行第二次更新。具体地,结合图7及第一次更新后的交易链路纵横点编号可知,最后一个“非0值”位为2,则应选用3赋值该位;调用方系统标识、调用方运行实例编号不变,则第二次更新后的子交易号为:903331010008300000000000000000000000000000000000,调用次数加1。
运行实例A向系统F发出调用申请,运行实例A发生纵向维度调用。子交易号在第二次更新后的基础上,通过getSubTxNoY()函数进行第三次更新。具体地,结合图7及第二次更新后的交易链路纵横点编号可知,最后一个“非0值”位为3,则应选用4赋值该位。调用方系统标识、调用方运行实例编号不变,则第三次更新后的子交易号为:903331010008400000000000000000000000000000000000,调用次数加1。
需要说明的是,以上调用完成后,全局业务号不发生改变。
S104:将全局业务号与更新后的子交易号随请求报文传送至被调用系统(如系统B、系统E、系统F等);
S105:被调用系统(如系统B、系统E、系统F等)收到请求后,首先从收到的请求报文中获取全局业务号与子交易号,然后以请求报文中的子交易号作为入参,通过getSubTxNoX()函数获取当前节点的调用方系统标识、调用方运行实例编号,更新交易链路纵横点编号,以体现调用层级增加,进而更新子交易号。
系统B收到运行实例A的请求报文后,运行实例B发生横向维度调用,通过getSubTxNoX()函数对子交易号进行更新。具体地,提取出交易链路纵横点编号,结合图7及本实施例S103第一次更新后的交易链路纵横点编号可知,应在200000000000000000000000000000000000的基础上更新,从左至右找出第一个“0值”位,对该位赋值为“1”,更新后为210000000000000000000000000000000000;进一步地,执行业务逻辑的系统发生改变,则需要获取系统B的调用方系统标识、调用方运行实例编号。在本实施例中,更新后的交易链路纵横点编号与系统B的调用方系统标识、调用方运行实例编号进行拼装,即可获得运行实例B的子交易号:922021220005210000000000000000000000000000000000,调用层级增加。
系统E收到运行实例A的请求报文后,运行实例E发生横向维度调用。结合图7及本实施例S103第二次更新后的交易链路纵横点编号可知,应在300000000000000000000000000000000000的基础上更新,更新后为310000000000000000000000000000000000;进一步地,与系统E的调用方系统标识、调用方运行实例编号进行拼装,即可获得运行实例E的子交易号:755062090066310000000000000000000000000000000000,调用层级增加。
系统F收到运行实例A的请求报文后,运行实例F发生横向维度调用。结合图7及本实施例S103第三次更新后的交易链路纵横点编号可知,应在400000000000000000000000000000000000的基础上更新,更新后为410000000000000000000000000000000000;进一步地,与系统F的调用方系统标识、调用方运行实例编号进行拼装,即可获得运行实例F的子交易号:200061180038410000000000000000000000000000000000,调用层级增加。
需要说明的是,以上调用完成后全局业务号不发生改变。
S106:拼装完整的子交易号与全局业务号组成流水号,存储于输出日志中,并随请求报文在发生系统调用时进行流转;
S107:被调用系统(如系统B)如果需要对外(如系统C、系统D等)发出调用,则参照S103-S106执行。
系统B向系统C发出调用,子交易号的更新过程如下:
运行实例B向系统C发出调用申请,运行实例B发生纵向维度调用,子交易号通过getSubTxNoY()函数进行第一次更新。具体地,结合图7及本实施例S105获得的运行实例B子交易号可知,最后一个“非0值”位为1,则应选用2赋值该位;调用方系统标识、调用方运行实例编号不变,则更新后的行实例B的交易号为922021220005220000000000000000000000000000000000,调用次数加1;
系统C接收运行实例B的请求报文后,运行实例C发生横向维度调用。结合图7及上一步可知,交易链路纵横点编号应在220000000000000000000000000000000000的基础上更新,更新后为221000000000000000000000000000000000;进一步地,在本实施例中,与系统C的调用方系统标识、调用方运行实例编号拼装,获得运行实例C的子交易号:333031130033221000000000000000000000000000000000,调用层级增加。
系统B向系统D发出调用,子交易号的更新过程如下:
运行实例B向系统D发出调用申请,运行实例B发生纵向维度调用,子交易号通过getSubTxNoY()函数进行第二次更新。具体地,结合图7及本实施例S107获取的更新后的行实例B的子交易号可知,最后一个“非0值”位为2,则应选用3赋值该位。调用方系统标识、调用方运行实例编号不变,则再次更新后的行实例B的子交易号为922021220005230000000000000000000000000000000000,调用次数加1;
系统D接收运行实例B的请求报文后,运行实例D发生横向维度调用。结合图7及上一步可知,交易链路纵横点编号应在230000000000000000000000000000000000的基础上更新,更新后为231000000000000000000000000000000000;进一步地,在本实施例中,与系统D的调用方系统标识、调用方运行实例编号拼装,获得运行实例D子交易号:550033040017231000000000000000000000000000000000,调用层级增加。
系统F向系统G发出调用,子交易号的更新过程如下:
运行实例F向系统G发出调用申请,运行实例F发生纵向维度调用,子交易号通过getSubTxNoY()函数进行更新。具体地,结合图7及本实施例S105获得的运行实例F的子交易号,最后一个“非0值”位为1,则应选用2赋值该位;调用方系统标识、调用方运行实例编号不变,更新后的子交易号为200061180038420000000000000000000000000000000000,调用次数加1;
系统G接收运行实例F的请求报文后,运行实例G发生横向维度调用,结合图7及上一步可知,交易链路纵横点编号应在420000000000000000000000000000000000的基础上更新,更新后为421000000000000000000000000000000000;进一步地,在本实施例中,与系统G的调用方系统标识、调用方运行实例编号拼装,获得运行实例G子交易号:880021080009421000000000000000000000000000000000,调用层级增加。
实施例4
如图8所示,本实施例示例性的呈现了一种基于交易链路的分布式流水号生成装置,其包括获取模块、调用模块、子交易号更新模块及流水号输出模块,具体如下:
获取模块:用于系统收到业务请求后,首先获取全局业务号GlobalBusinessNo及子交易号SubTxNo;
在本实施例中,优选地,获取模块包括接收单元和获取单元。
接收单元用于接收业务请求信息,对照实施例1,业务系统可以分为两种,则接收单元接收的信息也分为两类,一类为直接受理前端用户发起的业务请求信息,一类为业务流转中,接收其他系统发出的调用申请报文。
获取单元用于获取全局业务号GlobalBusinessNo及子交易号SubTxNo,与接收单元相对应,若接收到的为用户发起的业务请求信息,则获取单元根据时间、始端系统标识、始端系统运行实例编号以及序列号获取全局业务号GlobalBusinessNo,通过getSubTxNoX()函数将当前为空值的子交易号进行更新;若接收到的为其他系统发出的调用申请报文,则直接从请求报文中获取当前全局业务号GlobalBusinessNo及子交易号SubTxNo。
调用模块:用于根据系统调用类型,确定应使用的子交易号生成及变动规则函数类型;
在本实施例中,优选地,根据各应用系统之间的调用关系,确定系统调用类型为横向维度或纵向维度。
确定系统调用类型,指定应使用的函数类型,具体地,系统调用类型为横向维度时,使用getSubTxNoX()函数,系统调用类型为纵向维度时,使用getSubTxNoY()函数。
子交易号更新模块:用于使用子交易号生成及变动规则函数更新子交易号SubTxNo;
优选地,子交易号更新模块包括函数存储单元及更新单元。
根据需要调用的函数类型从函数存储单元调用对应的函数;在更新单元,发生纵向维度调用时,使用getSubTxNoY()函数更新子交易号;发生横向维度调用时,使用getSubTxNoX()函数更新子交易号。
流水号输出模块:用于将全局业务号GlobalBusinessNo与更新后的子交易号SubTxNo组合为更新后的流水号,并存储在输出的日志中。
优选地,流水号输出模块包括拼装单元及输出单元。
在拼装单元,更新后的子交易号与全局业务号拼装,获得更新后的流水号,通过输出单元存储在输出日志中,作为后续业务流转中请求报文的携带信息,同时便于工作人员查看流水号信息。
在本发明示例性实施方式中,还提供了一种能够实现上述方法的计算机存储介质。其上存储有能够实现本说明书上述方法的程序产品。在一些可能的实施例中,本公开的各个方面还可以实现为一种程序产品的形式,其包括程序代码,当上述程序产品在设备上运行时,上述程序代码用于使上述设备执行本说明书上述“示例性方法”部分中描述的根据本公开各种示例性实施方式的步骤。
本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本发明的其它实施方案。本申请旨在涵盖本发明的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本发明的一般性原理并包括本发明未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本发明的真正范围和精神由权利要求指出。应当理解的是,本发明并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本发明的范围仅由所附的权利要求来限制。

Claims (10)

1.一种基于交易链路的分布式流水号生成方法,其特征在于,所述方法包括:
业务系统收到业务请求后,首先获取全局业务号GlobalBusinessNo及子交易号SubTxNo;
根据系统调用类型,确定应使用的子交易号生成及变动规则函数类型;
使用所述子交易号生成及变动规则函数更新子交易号SubTxNo;
所述全局业务号GlobalBusinessNo与更新后的所述子交易号SubTxNo拼装为更新后的流水号,并存储在输出的日志中。
2.根据权利要求1所述的一种基于交易链路的分布式流水号生成方法,其特征在于,所述系统调用类型包括横向维度与纵向维度:
若业务流转经过新的节点,调用层级增加,则所述系统调用类型为横向维度;
若在同一节点内,对外调用次数增加,则所述系统调用类型为纵向维度。
3.根据权利要求1所述的一种基于交易链路的分布式流水号生成方法,其特征在于,所述子交易号生成及变动规则函数包括横向维度函数getSubTxNoX()及纵向维度函数getSubTxNoY();所述系统调用类型为横向维度时,使用getSubTxNoX()函数,所述系统调用类型为纵向维度时,使用getSubTxNoY()函数。
4.根据权利要求3所述的一种基于交易链路的分布式流水号生成方法,其特征在于,所述getSubTxNoX()函数的定义:
如果,传入参数原子交易号original_SubTxNo为空值,则生成交易链路纵横点编号初始值:首位为1,其余位为0;
否则,从原子交易号original_SubTxNo取出交易链路纵横点编号,从交易链路纵横点编号中从左至右找出第一个“0值”位,对该位值赋值为1;
将调用方系统标识、调用方系统运行实例编号、新得到的交易链路纵横点编号拼装得到新子交易号;
将所述新子交易号作为结果返回。
5.根据权利要求3所述的一种基于交易链路的分布式流水号生成方法,其特征在于,所述getSubTxNoY()函数的定义:
如果,传入参数原子交易号original_SubTxNo为空值,则生成交易链路纵横点编号初始值:首位为1,其余位为0;
否则,从原子交易号original_SubTxNo取出交易链路纵横点编号,从交易链路纵横点编号中从左至右找出最后一个“非0值”位,取出该位的值并依次选用“1-9-A-Z-a-z”赋值该位;
将调用方系统标识、调用方系统运行实例编号、新得到的交易链路纵横点编号拼装得到新子交易号;
将所述新子交易号作为结果返回。
6.根据权利要求1所述的一种基于交易链路的分布式流水号生成方法,其特征在于,所述业务系统收到业务请求后,若所述业务系统为始端系统,所述始端系统首先获取所述全局业务号GlobalBusinessNo,并通过getSubTxNoX()函数获取子交易号SubTxNo初始值。
7.根据权利要求1所述的一种基于交易链路的分布式流水号生成方法,其特征在于,所述全局业务号GlobalBusinessNo包括时间戳、始端系统标识、始端系统运行实例编号以及序列号;
所述时间戳为业务发起的时间;
所述始端系统标识为提前为每个系统分配定义的系统编号;
所述始端系统运行实例编号为始端系统内部的服务或微服务实例编号,在一个系统内部具有唯一性,包括IDC数据中心或机房编号、服务或微服务代号及每个服务或微服务的实例序号;
所述序列号为每个运行实例自身的序列号生成器生成的序号,其单向递增、达最大值后归零。
8.根据权利要求1所述的一种基于交易链路的分布式流水号生成方法,其特征在于,所述子交易号SubTxNo包括调用方系统标识、调用方系统运行实例编号及交易链路纵横点编号;
所述调用方系统标识为提前为每个调用方系统分配定义的系统编号;
所述调用方系统运行实例编号为调用方系统内部的服务或微服务实例编号,在一个系统内部具有唯一性,包括IDC数据中心或机房编号、服务或微服务代号及每个服务或微服务的实例序号;
所述交易链路纵横点编号为横向、纵向两个维度的调用链路标记。
9.一种计算机存储介质,所述计算机存储介质存储有计算机可执行代码;所述计算机可执行代码被执行后,能够实现权利要求1-8任一项提供的方法。
10.一种基于交易链路的分布式流水号生成装置,其特征在于,包括:
获取模块:用于系统收到业务请求后,首先获取全局业务号GlobalBusinessNo及子交易号SubTxNo;
调用模块:用于根据系统调用类型,确定应使用的子交易号生成及变动规则函数类型;
子交易号更新模块:用于使用所述子交易号生成及变动规则函数更新子交易号SubTxNo;
流水号输出模块:用于将所述全局业务号GlobalBusinessNo与更新后的所述子交易号SubTxNo拼装为更新后的流水号,并存储在输出的日志中。
CN202211527791.4A 2022-12-01 2022-12-01 基于交易链路的分布式流水号生成方法、装置及存储介质 Active CN115936608B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202211527791.4A CN115936608B (zh) 2022-12-01 2022-12-01 基于交易链路的分布式流水号生成方法、装置及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202211527791.4A CN115936608B (zh) 2022-12-01 2022-12-01 基于交易链路的分布式流水号生成方法、装置及存储介质

Publications (2)

Publication Number Publication Date
CN115936608A true CN115936608A (zh) 2023-04-07
CN115936608B CN115936608B (zh) 2024-03-05

Family

ID=86697271

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202211527791.4A Active CN115936608B (zh) 2022-12-01 2022-12-01 基于交易链路的分布式流水号生成方法、装置及存储介质

Country Status (1)

Country Link
CN (1) CN115936608B (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117808570A (zh) * 2024-02-29 2024-04-02 梅州客商银行股份有限公司 银行分布式系统的全链路监控的方法、装置和电子设备

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106875173A (zh) * 2010-12-14 2017-06-20 极限移动有限公司 一种认证交易的方法
CN109150977A (zh) * 2018-07-24 2019-01-04 中信百信银行股份有限公司 基于交易链路自动生成全局流水号的方法
CN114691732A (zh) * 2022-03-09 2022-07-01 中国邮政储蓄银行股份有限公司 定位异常交易的方法、装置、非易失性存储介质与处理器
CN115205040A (zh) * 2022-07-08 2022-10-18 中国银行股份有限公司 流水号的生成方法及装置

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106875173A (zh) * 2010-12-14 2017-06-20 极限移动有限公司 一种认证交易的方法
CN109150977A (zh) * 2018-07-24 2019-01-04 中信百信银行股份有限公司 基于交易链路自动生成全局流水号的方法
CN114691732A (zh) * 2022-03-09 2022-07-01 中国邮政储蓄银行股份有限公司 定位异常交易的方法、装置、非易失性存储介质与处理器
CN115205040A (zh) * 2022-07-08 2022-10-18 中国银行股份有限公司 流水号的生成方法及装置

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117808570A (zh) * 2024-02-29 2024-04-02 梅州客商银行股份有限公司 银行分布式系统的全链路监控的方法、装置和电子设备
CN117808570B (zh) * 2024-02-29 2024-05-07 梅州客商银行股份有限公司 银行分布式系统的全链路监控的方法、装置和电子设备

Also Published As

Publication number Publication date
CN115936608B (zh) 2024-03-05

Similar Documents

Publication Publication Date Title
CN107608773B (zh) 任务并发处理方法、装置及计算设备
CN108959386A (zh) 分布式全局唯一id生成方法、装置、设备和存储介质
CN109597853B (zh) 业务场景元素序列号生成方法、装置、介质和计算机设备
CN107092686B (zh) 一种基于云存储平台的文件管理方法及装置
CN110069346B (zh) 多进程间资源共享方法、装置、电子设备
CN109359147B (zh) 业务组件处理方法、组件服务器和系统
CN110119292A (zh) 系统运行参数查询方法、匹配方法、装置及节点设备
CN115936608B (zh) 基于交易链路的分布式流水号生成方法、装置及存储介质
EP2224381A1 (en) Method and apparatus for case-based service composition
US20050102350A1 (en) Pattern based web services
CN112463790A (zh) 一种微服务架构下快速生成id的方法、系统
CN112395313A (zh) 全局序列生成方法、装置、电子设备及计算机存储介质
CN115496470A (zh) 全链路配置化数据处理方法、装置和电子设备
US20040177017A1 (en) Distributed system and brokering method using context
CN108763498B (zh) 用户身份识别方法、装置、电子设备及可读存储介质
CN111901149B (zh) 自动生成和检测Fabric网络配置文件的方法及系统
CN111782346A (zh) 基于同库模式的分布式事务全局id生成方法及装置
CN112445800A (zh) 一种数据流水号的生成方法、系统及电子设备
CN117632966A (zh) 一种分布式自增唯一id方法装置、设备及可读存储介质
CN102063596B (zh) 动态评价系统及其使用方法
CN115904872B (zh) 一种交易链路监控方法、系统及存储介质
CN113469423B (zh) 一种资源分配方法、装置、存储介质及电子设备
CN113179176B (zh) 一种日志处理方法、装置、设备及机器可读存储介质
CN117632965A (zh) 标识生成方法、装置、计算机设备和存储介质
CN110569362B (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