具体实施方式
为了使本技术领域的人员更好地理解本说明书一个或多个实施例中的技术方案,下面将结合本说明书一个或多个实施例中的附图,对本说明书一个或多个实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本说明书一部分实施例,而不是全部的实施例。基于本说明书一个或多个实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都应当属于本说明书保护的范围。
业务标识序列(sequence)可以作为一种业务对象的标识。例如,一个大型的交易系统,将处理数量巨大的交易笔数,可以使用sequence区分不同的交易。当接收到业务请求时,可以使用序列值,加上业务来源、操作时间等业务属性,构建成业务对象的标识,从而在业务处理中唯一的有效标识一个业务对象。
图1示例了一个使用业务标识序列的系统,如图1所示,该系统中的业务系统是一个分布式的系统,可以包括多个应用服务器,例如,应用服务器11、应用服务器12、应用服务器13等,这些应用服务器可以属于同一个业务应用。
应用服务器可以在本地存储序列区间,该序列区间可以是一个包括多个序列值的序列值集合,例如,一个序列区间可以是[100~300],该区间的最小序列值是100,最大序列值是300,其中包括101、102、103等多个序列值。在一个例子中,应用服务器可以将序列值存储在内存,以加快业务处理时获取序列值的速度。在业务处理时,应用服务器可以由内存中获取序列值,并将序列值、操作时间、业务来源等多个属性共同标识一个业务对象,比如标识一笔交易。
请继续参见图1,应用服务器可以由序列源获取所需要的序列区间,该序列源可以产生业务标识序列的序列值,例如,该序列源可以是图1中的数据库14。数据库14作为序列源(当然,数据库也可以具有其他功能),可以产生多个序列记录,每个序列记录可以用于记录一个业务标识序列sequence的信息。如下的表1示例了其中一个业务标识序列的序列记录:
表1序列记录
序列名称 |
当前序列值 |
最小值 |
最大值 |
步长 |
morc_fund_pool_seq |
3001 |
1 |
99999999 |
1000 |
根据表1记录的信息,该业务标识序列的序列记录可以包括如下信息:
序列名称:如上所述,数据库可以生成多个序列,每个序列可以有自己的序列名称,以与其他的序列进行区分,如morc_fund_pool_seq。
最小值和最大值:一个业务标识序列其实是一个由最小值到最大值的一个序列区间,例如,表1中的[1~99999999],其中的最小值是1,最大值是99999999。该序列中包括很多的序列值,例如,1、2、3等。
当前序列值:最小值到当前序列值之间的序列值已经被分配使用,例如,[1~3000]这些序列值已经被数据库14分配给某个应用服务器使用。该当前序列值表示本次分配序列值时,3001是本次分配的起始序列值。
步长:数据库在向应用服务器分配序列值时,一次分配一个步长的序列区间。例如,某一个应用服务器在请求数据库提供序列时,数据库14可以将这些待分配的序列值[3001~99999999]中的某个序列区间[3001~4000]提供给应用服务器使用,并且在提供时一次分配步长1000的范围。
示例一个数据库向应用服务器分配序列值的例子:
假设当前数据库端记录如下(最小值:1;当前值:20;步长:10;最大值:9999);
应用服务器A启动序列值的拉取,获得序列区间“20-30”(当前值20+步长10),获得这10个可用的sequence流水号(20、21、22、23...29);
在应用服务器A拉取以后,数据库端的记录如下(最小值:1;当前值:30;步长:10;最大值:9999);
接着应用服务器B启动序列值的拉取,获得序列区间“30-40”(当前值30+步长10),获得这10个可用的sequence流水号(30、31、32、33...39);
在应用服务器B拉取以后,数据库端的记录如下(最小值:1;当前值:40;步长:10最大值:9999)。
在上述表1的序列记录的各个信息中,其中的序列名称可以用于应用服务器在向数据库请求序列时使用,不同的业务或者应用可以使用不同序列中的序列区间。以某个业务来说,该业务具有分布式的多个应用服务器,应用服务器在向数据库请求获取序列区间时,可以是请求对应该业务的序列中的序列区间,例如,应用服务器11至应用服务器13在向数据库14请求序列区间时,可以是都向名称是morc_fund_pool_seq的序列请求。一个业务对应的序列可以是数据库上的某一个序列,或者,一种业务也可以使用多个序列。而序列记录中的当前序列值和步长,可以应用于序列区间分配。以当前序列值为分配的起始值,以步长为分配的范围。
假设在一个高并发的环境下,各个应用服务器将很快的用完自己存储的序列值,都向数据库请求同一个序列中的序列值。比如,图1中的各个应用服务器都请求数据库14提供名称为morc_fund_pool_seq序列中的序列值,此时就会出现竞争。数据库的记录锁机制可以保证竞争的多个应用服务器不会同时对同一个序列记录进行更改,但是也会使得应用服务器等待锁释放,进而影响到应用服务器的业务执行。若可以尝试将步长调整变大,使得应用服务器向数据库请求序列的时间间隔长一些,可以减轻对数据库的压力,又保证业务的顺序执行。然而,在高并发场景下,如果通过人工方式更改数据库的序列记录中的步长,几乎是不可能的,高并发下数量较多的应用服务器都要同时访问同一个序列记录,对记录中步长的调整耗时将可能达到半小时以上,严重影响业务进行。
基于此,本说明书一个或多个实施例提供了一种业务标识序列的获取方法,以在高并发的场景下加快对步长的调整,尽可能的降低对业务的影响。当然,即使是非高并发的场景,也可以使用该方法。
请继续参见图2所示,在每个应用服务器上都设置一个序列管理器21,该序列管理器21可以负责存储和管理序列值,并且在应用服务器存储的序列值用完时,负责向数据库请求获取新的序列区间。
在至少一个实施例中,每一个应用服务器可以接收到本地步长启用指令,该指令用于指示应用服务器在向序列源(如,数据库)获取序列时使用本地步长。在想要调整步长时,该本地步长区别于序列源侧存储的步长,例如,序列源的步长是100,本地步长可以是200。即本地步长是应用服务器侧存储的步长。
应用服务器可以根据本地步长向序列源请求获取对应所述本地步长的序列区间,以将所述序列区间中的各序列值应用于业务标识。比如,假设本地步长是200,那么序列源可以向应用服务器返回1100~1300这个序列区间的200个序列值。其中,应用服务器侧存储的步长可以是由其他装置通知给应用服务器,或者也可以是应用服务器预先存储在内存中并在接收到本地步长启用指令时才使用,或者,还可以是应用服务器根据某种条件来确定的步长,等。应用服务器在接收到本地步长启用指令时,可以根据该指令去确定要使用的本地步长。
如下的示例性例子,用于描述由推送装置向应用服务器推送本地步长启用指令和本地步长。其中,该序列管理器21可以是一个设置在应用服务器上的客户端,推送装置22可以是对应于该客户端的服务端,可以负责向客户端推送配置消息。
图3示例了本说明书一个或多个实施例的业务标识序列的获取方法,包括:
在步骤300中,应用服务器接收推送装置发送的本地步长启用指令,所述本地步长启用指令用于指示所述应用服务器在获取序列时使用本地步长;还接收推送装置发送的步长作为本地步长。
例如,如图2所示,推送装置22可以向各个应用服务器发送本地步长启用指令,该指令用于指示应用服务器在向数据库14请求序列时,依据本地步长,废弃使用数据库14侧记录的步长(例如,表1中记录的步长)。涉及到要调整序列获取的步长时,本地步长可以与序列源侧的步长不同。
示例性的,所述本地步长启用指令可以包括推送装置发送的启用标识,当应用服务器接收到推送装置发送的启用标识时,相当于接收到了本地步长启用指令。其中,启用标识可以有两个选项值,一个是“use-local”,另一个是“use-global”。当该启用标识的值是“use-global”时,表示要使用数据库14存储的步长来获取序列区间;当启用标识的值是“use-local”时,表示要使用应用服务器侧的本地步长来获取序列区间。因此,本步骤中,可以设置启用标识是“use-local”。
此外,推送装置除了向应用服务器发送启用标识,还可以发送一个步长,使得应用服务器将该步长作为本地步长。
其中,本地步长可以是业务人员根据业务实际运行情况设置的一个数值,例如,表1中的步长是1000,本地步长可以是2000,表示要将步长放大,使得应用服务器由数据库获取序列区间时,一次获取的序列值更多一些。在本说明书的步长调整方法中,通常本地步长与序列源处的步长不同,例如,在高并发的场景中,步长的数值可以提高。
此外,实际实施中,还可以有其他实施方式:
例如,推送装置也可以向应用服务器发送启用标识,而不发送上述的步长,而是由应用服务器预先在内存中存储预设步长,当应用服务器接收到本地步长启用指令时,比如接收到上述的启用标识时,才开始使用上述的预设步长作为本地步长去向序列源获取序列。当然,这种存储预设步长的方式,接收到的本地步长启用指令也可以是直接在应用服务器上配置而非推送装置推送获得。
例如,应用服务器已经在本地存储了一个步长值(例如,2000),只是何时启用该步长值要根据启用标识确定。当启用标识是“use-global”时,应用服务器采用数据库的步长获取序列区间,当启用标识是“use-local”时,启用本地存储的步长。
又例如,还有一种情况可以是,推送装置向应用服务器直接推送一个步长,即使不包括启用标识,可以设置应用服务器默认在接收到新的步长时,依据该接收的步长作为本地步长获取序列区间。那么这种情况下,应用服务器接收到了推送装置发送的新步长,就可以认为相当于接收到了本地步长启用指令,并将该新步长作为本地步长。
再者,还需要说明的是,图2示例的是由推送装置指示应用服务器调整步长,在其他的例子中,还可以是直接在应用服务器上配置,触发应用服务器使用本地步长,也相当于应用服务器接收到了本地步长启用指令,同样,该指令可以包括启用标识和本地步长的至少一项。
而不论是直接在应用服务器上配置步长调整,还是由推送装置推送,接收本地步长启用指令的应用服务器也可以选择性配置,比如,可以先向一部分应用服务器配置本地步长启用指令,待实施测试一段时间效果较好时,可以继续向全部的应用服务器推送本地步长启用指令。又例如,对于不同的应用服务器,也可以设置不同的本地步长,某一个应用服务器设置本地步长S1,另一个应用服务器设置本地步长S2。
在步骤302中,应用服务器根据该本地步长,向序列源请求获取对应所述本地步长的序列区间。
例如,示例一种应用服务器向数据库请求序列区间的过程:
首先,应用服务器可以给某一条序列记录上锁:
select val,step from t_squence where seq_name=‘morc_fund_pool_seq’for update.
上述指令表示该应用服务器要给序列名称是‘morc_fund_pool_seq’的序列记录上锁,其他的应用服务器不允许再对该记录进行更新操作。并且,应用服务器还由序列记录中获取了两个参数val和step,其中的val是当前序列值,step是步长。可以参见表1所示,表1的序列记录可以称为目标序列记录,序列名称是‘morc_fund_pool_seq’的序列可以是目标序列,该目标序列是一个序列区间[1~99999999]。
给序列记录上锁的过程,可以是由多个应用服务器在竞争,哪个服务器竞争获胜,则可以继续进行下一步更新操作,其他的应用服务器继续等待。
接着,应用服务器可以更新序列记录中的当前序列值。
update t_sequence set val=val+[本地step]where seq_name='morc_fund_pool_seq'
上述指令表示应用服务器要对序列记录morc_fund_pool_seq中的当前序列值进行更新。假设本地步长是2000,当前序列值是3001,则更新序列值可以是2000+3001=5001。数据库可以将表1中的当前序列值更改为5001。
需要说明的是,数据库在将当前序列值更新为5001时,也会将3001~5000的这2000个序列值发送给应用服务器。[3001~5000]即为数据库向应用服务器返回的序列区间。
最后,应用服务器释放锁,以供其他应用服务器向数据库请求序列区间。
本例子的步长调整方法,对于数据库来说,可以基本不做变化,仍然是为序列记录上锁、更新当前序列值和返回序列区间,而对于应用服务器来说进行了改进,可以接收本地步长启用指令,并按照本地步长向数据库请求序列区间。例如,在上述的更新当前序列值的指令中,“set val=val+[本地step]”,这里的step步长不再是数据库侧保存的步长,而是采用了应用服务器的本地步长。
在步骤304中,应用服务器在接收到序列源返回的序列区间后,将所述序列区间中的序列值存储至内存,以供业务处理使用。例如,可以将序列值用于作为业务标识使用。
本例子的步长调整方法,由应用服务器根据调整后的本地步长向数据库请求获取序列,只要应用服务器竞争到对序列记录的更改权,就可以获取到本地步长对应的序列范围,对步长的调整速度会加快。
并且,在高并发的场景下,可以将步长增大,使得本地步长比序列源侧的步长要大,这样应用服务器存储的序列区间中的序列值增多,可以使用的时间长一些,减小了高并发对业务的影响,不至于很快出现序列短缺的情况。由于各个应用服务器有了相对较多的序列值使用,也减轻了对数据库的压力,如果对各个应用服务器的步长进行差异化设置,也可以将应用服务器向数据库请求序列的时间错开,对数据库压力的降低以及降低对业务的影响的效果会更好。
此外,在上述的例子中,应用服务器获取的本地步长,可以是推送装置发送的,或者也可以是应用服务器本地存储的。这两种情况都可以依据外部触发,比如,推送装置发送的本地步长启用指令中可以包括启用标识,以指示应用服务器使用本地步长。在另一个例子中,还可以是,应用服务器可以预先存储步长调整条件,示例如下的表2:
请参见表2所示,应用服务器可以接收业务请求,并根据业务请求进行业务处理,并且,序列值sequence的使用也是应用于业务处理中,序列值短缺时可能影响到业务的处理速度,反过来,业务请求的频率高低也会影响到序列值消耗的快慢。因此,可以将业务发生的实际情况作为步长调整的依据,预先存储在应用服务器,并由应用服务器自身进行检测,当接收的业务请求较多时,可以使用存储的预设步长Step-1,当接收的业务请求较少时,可以使用存储的预设步长Step-2。Step-1和Step-2都可以称为本地步长。
表2步长调整条件
这种方式中,当应用服务器检测到满足了步长调整条件时,比如检测到预定时间段T内接收的业务请求数量大于或等于阈值N,则可以认为相当于应用服务器接收到了本地步长启用指令。应用服务器可以使用对应所述步长调整条件的预设步长,作为本地步长。
需要说明的是,本地步长的获取方式,不限于上述的检测步长调整条件、推送装置发送、或者本地存储等方式,也可以采用其他方式获取。
为了实现上述的方法,本说明书一个或多个实施例还提供了一种业务标识序列的获取装置,如图4所示,所述装置可以包括:启用指示模块41、步长确定模块42和序列获取模块43。
启用指示模块41,用于接收本地步长启用指令,所述本地步长启用指令用于指示所述应用服务器在获取序列时使用本地步长;所述本地步长与序列源存储的步长不同;
步长确定模块42,用于根据所述本地步长启用指令,确定所述应用服务器使用的本地步长;
序列获取模块43,用于向所述序列源请求获取对应所述本地步长的序列区间,以将所述序列区间中的各序列值应用于业务标识。
在一个例子中,启用指示模块41,用于接收推送装置发送的启用标识,所述启用标识用于指示所述应用服务器在获取序列时使用本地步长。
在一个例子中,所述本地步长是所述推送装置发送的步长。
上述实施例阐明的装置或模块,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机,计算机的具体形式可以是个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件收发设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任意几种设备的组合。
为了描述的方便,描述以上装置时以功能分为各种模块分别描述。当然,在实施本说明书一个或多个实施例时可以把各模块的功能在同一个或多个软件和/或硬件中实现。
上述图中所示流程中的各个步骤,其执行顺序不限制于流程图中的顺序。此外,各个步骤的描述,可以实现为软件、硬件或者其结合的形式,例如,本领域技术人员可以将其实现为软件代码的形式,可以为能够实现所述步骤对应的逻辑功能的计算机可执行指令。当其以软件的方式实现时,所述的可执行指令可以存储在存储器中,并被设备中的处理器执行。
例如,对应于上述方法,本说明书一个或多个实施例同时提供一种业务标识序列的获取设备,例如,该设备可以是应用服务器。该设备可以包括处理器、存储器、以及存储在存储器上并可在处理器上运行的计算机指令,所述处理器通过执行所述指令,用于实现如下步骤:
接收本地步长启用指令,所述本地步长启用指令用于指示所述应用服务器在获取序列时使用本地步长;所述本地步长与序列源存储的步长不同;
根据所述本地步长启用指令,确定所述应用服务器使用的本地步长;
向所述序列源请求获取对应所述本地步长的序列区间,以将所述序列区间中的各序列值应用于业务标识。
此外,图2示例了一种业务标识序列的获取系统,该系统可以包括:
数据库14,用于生成业务标识序列sequence;
推送装置22,用于向至少一个应用服务器推送本地步长启用指令;此外,推送装置22还可以向应用服务器发送步长作为应用服务器的本地步长;
多个应用服务器,例如,应用服务器11、应用服务器12等,其中每个应用服务器用于在接收到所述推送装置22发送的本地步长启用指令时,根据所述应用服务器的本地步长向数据库14请求获取对应所述本地步长的序列区间。该本地步长可以是推送装置22发送的步长,也可以是应用服务器存储的预设步长。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
本领域技术人员应明白,本说明书一个或多个实施例可提供为方法、系统或计算机程序产品。因此,本说明书一个或多个实施例可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本说明书一个或多个实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本说明书一个或多个实施例可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本说明书一个或多个实施例,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于数据处理设备实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
以上所述仅为本说明书一个或多个实施例的较佳实施例而已,并不用以限制本说明书一个或多个实施例,凡在本说明书一个或多个实施例的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本说明书一个或多个实施例保护的范围之内。