CN114879942B - 分布式时间轮分组注册的校验方法、装置、介质和设备 - Google Patents
分布式时间轮分组注册的校验方法、装置、介质和设备 Download PDFInfo
- Publication number
- CN114879942B CN114879942B CN202210553280.3A CN202210553280A CN114879942B CN 114879942 B CN114879942 B CN 114879942B CN 202210553280 A CN202210553280 A CN 202210553280A CN 114879942 B CN114879942 B CN 114879942B
- Authority
- CN
- China
- Prior art keywords
- event
- distributed time
- registration
- time wheel
- registration key
- 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
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/20—Software design
- G06F8/24—Object-oriented
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
- G06F8/315—Object-oriented languages
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/71—Version control; Configuration management
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5083—Techniques for rebalancing the load in a distributed system
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/546—Message passing systems or structures, e.g. queues
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2209/00—Indexing scheme relating to G06F9/00
- G06F2209/54—Indexing scheme relating to G06F9/54
- G06F2209/548—Queue
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computing Systems (AREA)
- Computer Security & Cryptography (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明实施例提供分布式时间轮分组注册的校验方法、装置、介质和设备,该校验方法包括:步骤A:从配置文件读取分布式时间轮的前缀参数,按照所述分布式时间轮的前缀参数对监听到的应用内的事件类型进行筛选,获得事件分组;步骤B:通过Lua脚本中的预设函数将所述事件分组和所述分布式时间轮的前缀参数写入Redis的预设数据结构以中对所述事件分组进行注册,获得分布式时间轮分组的注册Key;步骤C:通过Lua脚本中的预设命令对所述分布式时间轮分组的注册Key的注册结果进行校验。本发明实施例能够发现分布式时间轮分组使用的代码缺陷,便于在测试阶段进行修正,补全了分布式时间轮分组的异常机制。
Description
技术领域
本发明涉及异步通讯技术领域,尤其涉及分布式时间轮分组注册的校验方法、装置、介质和设备。
背景技术
时间轮已广泛应用于异步通讯系统中的应用中,但从设计上存在约束限制,每个应用基于前缀(Prefix参数)不同,在Redis中只能管理一个时间轮,这个时间轮上所有的任务对应事件类型,定义为“分组”,分组名就是Prefix参数。这个事件类型是指在应用代码中自定义的Java事件类“ClockTaskEvent”的子类,用于在消息广播时进行区分,从而使不同的事件精准投放到其对应的回调函数中。
由于使用Spring的异步事件机制进行了解耦,Spring广播事件时本身并不关心事件是否会被送达,这样就会带来一个问题:当不同应用使用同一个时间轮(即同一事件分组),但当代码中监听的事件不同时,会造成任务丢失。
综上所述,在同一时间轮中再次增加为不同应用监听不同事件分组的功能会引发一系列的性能不可控问题,得不偿失。中国专利公开号CN112015572A,发明名称为一种延时任务的执行方法、中心和系统,采用了时间轮相关技术。
目前采用的方案是,在开发规范中禁止应用在同一前缀的时间轮上监听不同的事件组,甚至进一步为加强控制,在整个系统中只允许一个服务作为专门的时间轮处理器。由此带来的问题是,时间轮的前缀设计并没有得到很好的发挥,硬件资源利用率低;单一的时间轮服务聚集了太多的功能而显得臃肿,也不符合微服务的设计。
发明内容
有鉴于此,本发明实施例的目的在于提供分布式时间轮分组注册的校验方法、装置、介质和设备,能够充分发挥时间轮的前缀的作用,使用自动化方式替代人工代码审查,降低了出错的概率。
为达到上述目的,第一方面,本发明提供了一种分布式时间轮分组注册的校验方法,所述方法包括如下步骤:
步骤A:从配置文件读取分布式时间轮的前缀参数,并对监听到的应用内的事件类型进行筛选,获得事件分组;
步骤B:通过Lua脚本中的预设函数将所述事件分组和所述分布式时间轮的前缀参数写入Redis的预设数据结构以中对所述事件分组进行注册,获得分布式时间轮分组的注册Key;
步骤C:通过Lua脚本中的预设命令对所述分布式时间轮分组的注册Key的注册结果进行校验。
在一些可能的实施方式中,所述步骤A可以包括:
步骤A1:在从配置文件读取分布式时间轮的前缀参数之后生成Bean;
步骤A2:在生成所述Bean过程中筛选出所述Bean中包含目标注解的方法集合;
步骤A3:判断所述方法集合是否为空,当判断所述方法集合为非空时,将所述方法集合中的事件类型放入事件清单中,获得事件分组;
步骤A4:判断是否有Bean未生成完毕,如果是,则继续执行所述步骤A1。
在一些可能的实施方式中,在所述步骤B之前,还包括:
判断所述事件清单是否为空;
当判断所述事件清单为空时,结束所述分布式时间轮分组注册的校验;
当判断所述事件清单为非空时,触发执行所述步骤B。
在一些可能的实施方式中,所述步骤B可以包括:
步骤B1:将所述事件分组和所述分布式时间轮的前缀参数传入所述Lua脚本中;
步骤B2:通过所述Lua脚本中的checkGroup函数将所述事件分组和所述分布式时间轮的前缀参数写入Redis的Set数据结构,将所述事件分组对应的所述分布式时间轮的前缀参数与所述Lua脚本中的字符串标识进行拼接,获得所述分布式时间轮分组的注册Key。
在一些可能的实施方式中,所述步骤C可以包括:
步骤C1:通过Lua脚本的scard命令检查所述分布式时间轮分组的注册Key的元素数量;
步骤C2:根据所述元素数量对所述注册Key的注册结果进行校验。
在一些可能的实施方式中,所述步骤C2可以包括:
步骤C21:判断所述分布式时间轮分组的注册Key的元素数量是否为0;
步骤C22:当所述分布式时间轮分组的注册Key的元素数量为0时,执行如下步骤:
步骤C221:将所述事件分组中的事件类型写入所述注册Key的集合中;
步骤C222:判断是否遍历所述事件分组,如果否,则继续执行所述步骤C221,如果是,则结束所述步骤C221的写入操作。
在一些可能的实施方式中,所述步骤C2还可以包括:
步骤C23:当所述分布式时间轮分组的注册Key的元素数量不为0时,执行如下步骤:
步骤C231:判断所述注册Key的元素数量与所述事件分组中的事件类型的数量是否相等;
步骤C232:当所述注册Key的元素数量与所述事件分组中的事件类型的数量不相等时,则结束Lua脚本的checkGroup函数,且checkGroup函数的返回值为注册失败。
在一些可能的实施方式中,所述步骤C23还包括:
步骤C233:当所述注册Key的元素数量与所述事件分组中的事件类型的数量相等时,则执行如下步骤:
遍历所述事件分组中的事件类型;
通过Lua脚本中的sismember命令判断所述事件分组中的事件类型是否在所述注册Key的集合中,当所述sismember命令的值有一次为0时,则结束Lua脚本的checkGroup函数,且所述checkGroup函数的返回值为注册失败。
在一些可能的实施方式中,在所述步骤C还可以包括:
步骤D:通过expire命令更新所述分布式时间轮分组的注册Key的过期时间,且所述checkGroup函数的返回值为注册成功。
第二方面,本发明实施例提供了一种分布式时间轮分组注册的校验装置,所述装置包括:
事件分组模块,用于从配置文件读取分布式时间轮的前缀参数,并对监听到的应用内的事件类型进行筛选,获得事件分组;
注册模块,用于通过Lua脚本中的预设函数将所述事件分组和所述分布式时间轮的前缀参数写入Redis的预设数据结构以中对所述事件分组进行注册,获得分布式时间轮分组的注册Key;
校验模块,用于通过Lua脚本中的预设命令对所述分布式时间轮分组的注册key的注册结果进行校验。
在一些可能的实施方式中,所述事件分组模块可以包括:
实例化子模块,用于在从配置文件读取分布式时间轮的前缀参数之后生成Bean;
筛选子模块,用于在生成所述Bean过程中筛选出所述Bean中包含目标注解的方法集合;
第一判断处理子模块,用于判断所述方法集合是否为空,当所述方法集合为非空时,将所述方法集合中的事件类型放入事件清单中,获得事件分组;
第二判断处理子模块,用于判断是否有Bean未生成完毕,如果是,则返回所述实例化子模块。
在一些可能的实施方式中,所述校验装置还可以包括:
判断处理模块,用于判断所述事件分组是否为空;如果是,则校验结束;如果否,则触发启动所述注册模块。
在一些可能的实施方式中,所述注册模块可以包括:
传入子模块,用于将所述事件分组和所述分布式时间轮的前缀参数传入所述Lua脚本中;
拼接子模块,用于通过所述Lua脚本中的checkGroup函数将所述事件分组和所述分布式时间轮的前缀参数写入Redis的Set数据结构,将所述事件分组对应的所述分布式时间轮的前缀参数与所述Lua脚本中的字符串标识进行拼接,获得所述分布式时间轮分组的注册Key。
在一些可能的实施方式中,所述校验模块可以包括:
检查子模块,用于通过Lua脚本的scard命令检查所述分布式时间轮分组的注册Key的元素数量;
执行子模块,用于根据所述元素数量对所述分布式时间轮分组的注册Key的注册结果进行校验。
在一些可能的实施方式中,所述执行子模块可以包括:
元素数量判断单元,用于判断所述分布式时间轮分组的注册Key的元素数量是否为0;
写入与判断单元,用于当所述分布式时间轮分组的注册Key的元素数量为0时,将所述事件分组中的事件类型写入所述注册Key的集合中;判断是否遍历所述事件分组,如果否,则继续执行写入操作,如果是,则结束写入操作。
在一些可能的实施方式中,所述执行子模块还可以包括判断与返回单元,用于:
当所述分布式时间轮分组的注册Key的元素数量不为0时,判断所述注册Key的元素数量与所述事件分组中的事件类型的数量是否相等;当所述注册Key的元素数量与所述事件分组中的事件类型的数量不相等时,则结束Lua脚本的checkGroup函数,且返回值为注册失败;
当所述注册Key的元素数量与所述事件分组中的事件类型的数量相等时,遍历所述事件分组中的事件类型;通过Lua脚本中的sismember命令判断所述事件分组中的事件类型是否在所述注册Key的集合中,当所述sismember命令的值有一次为0时,则结束Lua脚本的checkGroup函数,且返回值为注册失败。
在一些可能的实施方式中,在所述步骤C之后,还包括:
更新模块,用于通过expire命令更新所述分布式时间轮分组的注册Key的过期时间,且所述checkGroup函数的返回值为注册成功。
第三方面,本发明提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如上述任意一种分布式时间轮分组注册的校验方法。
第四方面,本发明实施例提供了一种电子设备,其包括:
处理器;
用于存储所述处理器可执行指令的存储器;
其中,所述处理器被配置为执行所述指令,以实现如上述任意一种分布式时间轮分组注册的校验方法。
上述技术方案具有如下有益效果:
本发明实施例提供分布式时间轮分组注册的校验方法、装置、介质和设备,该校验方法包括:步骤A:从配置文件读取分布式时间轮的前缀参数,按照所述分布式时间轮的前缀参数对监听到的应用内的事件类型进行筛选,获得事件分组;步骤B:通过Lua脚本中的预设函数将所述事件分组和所述分布式时间轮的前缀参数写入Redis的预设数据结构以中对所述事件分组进行注册,获得分布式时间轮分组的注册Key;步骤C:通过Lua脚本中的预设命令对所述分布式时间轮分组的注册Key的注册结果进行校验。本发明实施例能够发现分布式时间轮分组使用的代码缺陷,便于在测试阶段进行修正,补全了分布式时间轮分组的异常机制。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例提供的一种分布式时间轮分组注册的校验方法的流程图;
图2是本发明实施例提供的在Spring加载机制中嵌入事件分组的流程图;
图3是本发明实施例提供的对事件类型进行事件分组的方法的部署图;
图4是本发明实施例提供的对事件分组进行注册获得分布式时间轮分组的注册Key的方法流程图;
图5是本发明实施例的一种checkGroup函数定义的示意图;
图6是本发明实施例的分布式时间轮分组注册的架构图;
图7是本发明实施例的一种对注册Key进行校验的部署流程图;
图8是本发明实施例的第一种分布式时间轮分组注册的校验装置的结构框图;
图9是本发明实施例的事件分组模块的结构框图;
图10是本发明实施例的第二种分布式时间轮分组注册的校验装置的结构框图;
图11是本发明实施例的注册模块的结构框图;
图12是本发明实施例的校验模块的结构框图;
图13是本发明实施例的一种计算机可读存储介质的功能框图;
图14是本发明实施例的一种电子设备的功能框图;
图15是本发明的一个实施例电子设备的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
相关术语说明:
1、Redis数据结构:String、Hash、List、Set都是Redis API提供的数据存储结构。
2、Redis Lua:Redis内嵌的脚本语言,可以组合一定的业务逻辑。Lua脚本具有独占性,即Lua脚本执行期间不受理杀死该脚本外的任何Redis操作请求,可以确保其中执行的Redis数据变更的原子特性。
3、分布式时间轮:时间轮是Linux内核对低精度定时器(最小刻度1Hz,秒级)的实现机制,是时间复杂度最优的一种定时器。分布式时间轮着重于实时交易,通过负载均衡处理海量的并发交易,更接近于延迟消息队列,易于与业务系统、服务进行集成;Redis存储的只是静态资源,并没有提供给用户的API可以实现自动轮转。因此需要通过Java本地的时间轮来推动全局时间轮,全局时间轮是Redis中存储的静态资源,是作为分布式时间轮的组件之一向前运动。也就是说,当所有Java客户端都下线后,时间轮停止。这里客户端指时间轮的客户端,也可以理解为SDK(Software Development Kit,软件开发工具包)的与全局时间轮交互的部分。而Java应用应该是包括调用了SDK开发的具体业务代码的整个Java进程。
4、Spring:Spring是Java EE编程领域的一个轻量级开源框架,是为了解决企业级编程开发中的复杂性,实现敏捷开发的应用型框架。Spring框架通过对Bean(Java类)的生命周期进行管理,可以在类实例化(创建)阶段进行相应的扫描、增强等事件。
5、分布式时间轮分组:每个使用了分布式时间轮的应用,只能管理一个分布式时间轮。相应的,一个Redis中可以有多个不同应用的多个分布式时间轮,这些分布式时间轮以不同的前缀进行区分,那么需要对多个不同应用的多个分布式时间轮进行分组管理,称为分布式时间轮分组。
6、事件分组:同一前缀的分布式时间轮,应用可以监听多个不同类型的事件,但为了防止任务丢失,规定使用同一前缀的时间轮,所有应用监听的事件集合必须相同,这些事件的集合叫做“事件分组”。
以下对现有技术中存在的问题进行更加详细的分析:
由于使用Spring的异步事件机制进行了解耦,Spring广播事件时本身并不关心事件是否会被送达,这样就会带来一个问题:当不同应用使用同一个时间轮(即同一事件分组),但当代码中监听的事件不同时,会造成任务丢失。
例如,在@EventListener注解的方法中,应用A监听了事件a、b、c、d,应用B监听了事件b、c、d,由于时间轮在负载均衡时可能将事件a的任务分发给应用B,而应用B并没有监听该事件a,就造成了消息的丢失。没有对此问题进行处理的原因在于,时间轮数据结构设计需满足的条件:
条件1:每个时间片的任务列表应该可以在O(1)的时间复杂度下被检索到;时间复杂度是指算法的时间复杂度,是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,描述算法所用时间与执行数据规模之间的关系。
条件2:应该是一个操作时间复杂度为O(1)的双向链表,便于插入和提取;
条件3:取出任务的操作,应该可以负载均衡;
条件4:多次执行的任务,应该可以自带参数以便于快速操作;
条件5:避免不可预知的大规模操作阻塞Redis主线程。
如果将事件作为任务检索的参数写入任务节点(指在Redis中以Hash存储的任务详情的这一键值对)中可能存在如下的情况:
1、事件作为任务节点的字段,需要遍历每个时间片的任务列表以排查每个任务的事件,这样就会存在如下问题:
i、增加了事件的写入的字段数,时间复杂度提升;
ii、需要将参数表传入事件列表,增加了循环次数,可能引发Redis阻塞风险,违背了条件5;
iii、由于不同的事件分组(按应用监听的事件分组)和任务添加顺序的问题,任务在事件列表中分布不均,可能某个事件类型任务数量很少,但极度分散在整个事件列表的头和尾,从而引起任务从List中频繁取出、放入与遍历次数不可控。由此负载均衡失效,也会增加阻塞的风险,甚至不适合再使用List作为数据结构,违背了条件2、条件3和条件5。
2、事件作为Redis中key的一部分,同样会存在如下问题:
i、事件直接作为时间分片的任务列表,由于事件名称的不确定性,在时间轮的管理、任务列表的检索上,时间复杂度不可计算,违背了条件1;
ii、将任务列表的key作为时间片任务列表的元素,即增加一层任务列表,则相当于任务列表变成了检索树,检索树的深度由1变成2,整体时间复杂度翻倍,性能急剧下降。
综上所述,在同一时间轮中再次增加为不同应用监听不同事件分组的功能会引发一系列的性能不可控问题,得不偿失。因此如果应用需要对监听的事件进行分组,应直接放在不同的时间轮中。
实施例一
图1是本发明实施例提供的一种分布式时间轮分组注册的校验方法的流程图,如图1所示,该校验方法包括如下步骤:
步骤A:从配置文件读取分布式时间轮的前缀参数,并对监听到的应用内的事件类型进行筛选,获得事件分组。
具体的,一个Redis中有多个不同应用的多个分布式时间轮,这些分布式时间轮以不同的前缀参数进行区分,Spring启动时从配置文件读取分布式时间轮的前缀参数,并对监听到的应用内的事件类型进行筛选,获得事件分组。
步骤B:通过Lua脚本中的预设函数将事件分组和分布式时间轮的前缀参数写入Redis的预设数据结构中以对事件分组进行注册,获得分布式时间轮分组的注册Key。
其中,注册Key(registerKey)是指在Lua脚本内部定义的变量,用于执行zcard、zadd等指令时的键名的参数值。其中,Redis Zcard命令用于计算集合中元素的数量;RedisZadd命令用于将一个或多个成员元素及其分数值加入到有序集当中。
步骤C:通过Lua脚本中的预设命令对分布式时间轮分组的注册Key的注册结果进行校验。
具体地,本实施例中,通过校验就可以确定分布式时间轮分组的注册Key是注册成功还是注册失败,如果是注册成功,则启动分布式时间轮,如果Lua脚本的预设函数的返回值为注册失败,则通过抛出运行时异常来中断Spring的启动过程,从而避免消息被分发到错误的应用中去。
本发明实施例能够及时发现分布式时间轮分组使用的代码缺陷,便于在测试阶段进行修正,补全了分布式时间轮分组的异常机制。
图2是本发明实施例提供的在Spring加载机制中嵌入事件分组的流程图,图6是本发明实施例的分布式时间轮分组注册的架构图,如图2和图6所示,步骤A包括如下步骤:
步骤A1:在从配置文件读取分布式时间轮的前缀参数之后生成Bean;
本实施例中,在Spring从配置文件读取分布式时间轮的前缀参数之后生成Bean,生成每个Bean的过程中,会通过BeanPostProcessor接口实现类的postProcessAfterInitialization方法进行额外的处理,由于在Bean创建过程中被调用的BeanPostProcessor具有更高的优先级,因此通过Spring接口的BeanPostProcessor的postProcessAfterInitialization方法生成Bean,生成Bean也可以称为Bean实例化,Bean实例化的方式有三种,具体包括:构造器实例化、静态工厂方式实例化和实例工厂方式实例化。
构造器实例化,通过构造器的方式来实例化Bean,Spring容器通过Bean对应的默认的构造函数来实例化Bean;
静态工厂方式实例化,首先要求创建一个静态工厂类,然后在类中定义一个静态方法来创建Bean实例;
实例工厂方式实例化,在这种方式的工厂类中,不再使用静态方法创建Bean实例,而是采用直接创建Bean实例的方式。并且在配置文件中,需要实例化的Bean也不是通过class属性直接指向其实例化的类,而是通过factory-bean属性配置一个实例工厂,然后使用factory-method属性确定使用实例工厂中哪个方法。
步骤A2:在生成Bean过程中筛选出Bean中包含目标注解的方法集合;
具体的,在生成bean的过程中,从bean中筛选出包含的目标注解(例如@EventListener注解)中获得事件类型,通过Spring接口的MethodIntrospector.selectMethods方法筛选出Bean中包含@EventListener注解的方法集合。另外,生成Bean是Spring作为框架管理Java类的基础能力,Spring通过Java的反射机制将Java类生成实例对象,然后根据规则再对这个类进行包装、增强、属性赋值等处理,最后完成的、供业务逻辑可访问的对象就是Bean。也就是说,业务逻辑可能认为自己访问了一个Java类A1的对象,但实际上Spring提供给它的是经过增强的BeanA1,其内部可能包含了A1的对象。
步骤A3:判断方法集合是否为空,当确定方法集合为非空时,将方法集合中的事件类型放入事件清单中,获得事件分组。其中,事件分组是概念性的,事件清单是事件分组这个全局变量的具体体现,事件清单即“全局变量事件分组”这一个整体。
步骤A4:判断是否有Bean未完成实例化,如果是,则继续执行步骤A1。
本实施例中,在所有bean生成完毕时将事件分组作为参数传递给lua脚本函数。
图3是本发明实施例提供的对事件类型进行事件分组的方法的部署图,如图3所示,具体的,其包括如下步骤:
启动分布式时间轮SDK(SDK,Software Development Kit,软件开发工具包),一般都是一些软件工程师为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件时的开发工具的集合);
在生成bean的过程中,从bean的目标注解(例如@EventListener注解)中获得事件类型,筛选出Bean中包含@EventListener注解的方法集合;
判断该方法集合是否为空;
当确定该方法集合为非空时,将该方法集合中的事件类型放入事件分组中;
本实施例中,通过判断Bean的生成情况,来充分完成对所有事件类型的事件分组。在所有bean生成完毕时将事件分组作为参数传递给Lua脚本函数,通过调用Lua脚本中的预设函数执行步骤B。
在步骤B之前,还包括如下步骤:判断事件分组是否为空;如果事件分组为空,则校验结束;如果事件分组为非空,则执行步骤B。另外,当事件分组为空时,说明没有时间轮分组的注册Key,所以无需对分布式时间轮分组的注册Key进行校验。
图4是本发明实施例提供的对事件分组进行注册获得分布式时间轮分组的注册Key的方法流程图,如图4和图6所示,在一些实施例中,步骤B可以包括:
步骤B1:将事件分组和分布式时间轮的前缀参数传入Lua脚本中。
步骤B2:通过Lua脚本中的checkGroup函数将事件分组和分布式时间轮的前缀参数写入Redis的Set数据结构,将事件分组对应的分布式时间轮的前缀参数与Lua脚本中的字符串标识进行拼接,获得分布式时间轮分组的注册Key。在应用的配置文件里的,事件分组也会作为参数传入Lua脚本,Lua脚本中会在分布式时间轮的前缀参数(prefix)前面拼上“TimeWheelListener__”这个字符串标识(“TimeWheelListener__”为Lua脚本中的字符串标识),将拼接后的字符串“TimeWheelListener__+prefix”作为redis中存储的set数据结构的registerKey(注册Key),即registerKey=TimeWheelListener__+prefix。
图5是本发明实施例的一种checkGroup函数定义的示意图,如图5所示,将checkGroup函数作为一个函数调用,检查时间轮分组包含有参数表的入参和返回值,参数KEY[1]为时间轮前缀,参数ARGV[]为监听的事件明细,返回值为true为注册成功,返回值为false为注册失败,监听的事件明细包括所有事件类型和事件清单,registerKey是在Lua脚本内部定义的变量,即用于执行zcard、zadd等指令时的键名的参数值。
本发明实施例能够充分发挥时间轮的前缀的作用,及时发现分布式时间轮分组使用的代码缺陷,便于在测试阶段进行修正,补全了分布式时间轮分组的异常机制。
图7是本发明实施例的一种对注册Key进行校验的部署流程图,如图6和图7所示,在一些实施例中,在通过Lua脚本中的checkGroup函数将事件分组和分布式时间轮的前缀参数写入Redis的预设数据结构以中对事件分组进行注册,获得分布式时间轮分组的注册Key之后,执行步骤C对注册Key进行校验。具体的,步骤C可以包括:
步骤C1,通过Lua脚本的scard命令检查分布式时间轮分组的注册Key的元素数量;
步骤C2,根据元素数量对注册key的注册结果进行校验。
其中,步骤C2具体可以包括:
步骤C21,首先判断当前Redis中的分布式时间轮分组的注册Key的元素数量是否为0;
步骤C22,当判断确定分布式时间轮分组的注册Key的元素数量为0时,执行如下步骤:
步骤C221,将事件分组中的事件类型写入注册Key的集合中;
步骤C222,判断是否遍历事件分组,如果否,则继续执行步骤C221,如果是,则结束步骤C221的写入操作。
在一些实施例中,步骤C2还可以包括:步骤C23,当判断分布式时间轮分组的注册Key的元素数量不为0时,执行如下步骤:
步骤C231,判断注册Key的元素数量与事件分组中的事件类型的数量是否相等;
步骤C232,当注册Key的元素数量与事件分组中的事件类型的数量不相等时,则结束Lua脚本的checkGroup函数,且checkGroup函数的返回值为注册失败(Return false)。
步骤C233,当注册Key的元素数量与事件分组中的事件类型的数量相等时,则执行如下步骤:
步骤C2331,通过Lua脚本中的sismember命令判断事件分组中的事件类型是否在注册Key的集合中;
步骤C2332,当sismember命令的值有一次为0时,则结束Lua脚本的checkGroup函数,且checkGroup函数的返回值为注册失败(Return false);当通过Lua脚本中的sismember命令判断事件分组中的事件类型全部都在注册Key的集合中后,执行步骤D。
步骤C2333,判断是否遍历事件分组中的全部事件类型,如果否,则继续执行步骤C2331。
本实施例中,如果Lua脚本的checkGroup函数的返回值为注册失败,则通过抛出运行时异常,中断Spring的启动过程,从而避免消息被分发到错误的应用。另外,如果注册成功,就是将事件分组这个数据集合转化为了redis中的set数据结构,此时启动分布式时间轮。如果已经注册的,需要判断传入Lua脚本的事件分组中的元素是否与Redis中对应set数据结构是同一个集合,如果集合不相同,则注册失败,中断Spring的启动过程。
在一些实施例中,在步骤C之后,还可以包括:
步骤D:通过expire命令更新分布式时间轮分组的注册Key的过期时间,且checkGroup脚本函数的返回值为注册成功。
具体地,Redis Expire命令用于设置key的过期时间,key过期后将不再可用,单位以秒计。本实施例中,通过步骤C的校验,当分布式时间轮分组的注册Key注册成功后,通过expire命令更新对应分布式时间轮分组的注册Key(registerKey)的过期时间(例如但不限于300秒),此时,checkGroup脚本函数的返回值为注册成功。
在时间轮的轮转过程中,每次轮数增加时,通过执行expire命令为分布式时间轮分组的注册Key进行续约,当所有应用下线一定时间(例如5分钟,这个时间可以根据实际需要任意设定)后,可以确定该事件分组的注册Key已过期,此时可以使用新的事件分组的注册Key,以支持应用的大规模更新,例如,增加或减少时间轮监听器监听的事件。
此外,分布式时间轮在同步本地时间轮和全局时间轮时,也会做更新过期时间的操作,保障了在长时间没有新的应用启动的情况下,这个注册也不会过期。只有在所有事件分组的应用全部停止后,又经过过期时间,在此事件分组中事件类型不同的应用才可以被启动。例如,应用版本升级,增加了一个监听的事件类型,就需要按此更新方法执行版本升级。
实施例二
图8是本发明实施例的第一种分布式时间轮分组注册的校验装置的结构框图,如图8所示,该校验装置100a包括:
事件分组模块10,用于从配置文件读取分布式时间轮的前缀参数,并对监听到的应用内的事件类型进行筛选,获得事件分组;
注册模块20,用于通过Lua脚本中的预设函数将事件分组和分布式时间轮的前缀参数写入Redis的预设数据结构中以对事件分组进行注册,获得分布式时间轮分组的注册Key;
校验模块30,用于通过Lua脚本中的预设命令对分布式时间轮分组的注册Key的注册结果进行校验。
具体细节请参见图1所示的方法实施例。
图9是本发明实施例的事件分组模块的结构框图,如图9所示,在一些实施例中,事件分组模块10具体可以包括:
实例化子模块101,用于在从配置文件读取分布式时间轮的前缀参数之后生成Bean;
筛选子模块102,用于在生成Bean过程中筛选出Bean中包含目标注解的方法集合;
第一判断处理子模块103,用于判断方法集合是否为空,当方法集合为非空时,将方法集合中的事件类型放入事件清单中,获得事件分组;
第二判断处理子模块104,用于判断是否有Bean未生成完毕,如果是,则返回实例化子模块。
具体细节请参见图2和图3所示的方法实施例。
图10是本发明实施例的第二种分布式时间轮分组注册的校验装置的结构框图,如图10所示,在一些实施例中,该校验装置100b还包括:
判断处理模块40,用于判断事件分组是否为空;如果是,则校验结束;如果否,则触发启动注册模块。
图11是本发明实施例的注册模块的结构框图,如图11所示,在一些实施例中,注册模块20具体包括:
传入子模块201,用于将事件分组和分布式时间轮的前缀参数传入Lua脚本中;
拼接子模块202,用于通过Lua脚本中的checkGroup函数将事件分组和分布式时间轮的前缀参数写入Redis的Set数据结构,将事件分组对应的分布式时间轮的前缀参数与Lua脚本中的字符串标识进行拼接,获得分布式时间轮分组的注册Key;
具体细节请参见图4所示的方法实施例。
图12是本发明实施例的校验模块的结构框图,如图12所示,在一些实施例中,校验模块30具体包括:
检查子模块301,用于通过Lua脚本的scard命令检查分布式时间轮分组的注册Key的元素数量;
执行子模块302,用于根据元素数量对分布式时间轮分组的注册key的注册结果进行校验。
在一些实施例中,执行子模块302可以包括:
元素数量判断单元3021,元素数量判断子模块,用于判断分布式时间轮分组的的注册Key的元素数量是否为0;
写入与判断单元3022,用于当分布式时间轮分组的注册Key的元素数量为0时,将事件分组中的事件类型写入注册Key的集合中;判断是否遍历事件分组,如果否,则继续执行写入操作,如果是,则结束写入操作。
在一些实施例中,执行子模块302还包括判断与返回单元3023,用于:
当分布式时间轮分组的注册Key的元素数量不为0时,判断注册Key的元素数量与事件分组中的事件类型的数量是否相等;当注册Key的元素数量与事件分组中的事件类型的数量不相等时,则结束Lua脚本的checkGroup函数,且返回值为注册失败;
当注册Key的元素数量与事件分组中的事件类型的数量相等时,遍历事件分组中的事件类型;通过Lua脚本中的sismember命令判断事件分组中的事件类型是否在注册Key的集合中,当sismember命令的值有一次为0时,则结束Lua脚本的checkGroup函数,且返回值为注册失败。
本实施例中,如果Lua脚本的checkGroup函数的返回值为注册失败,则通过抛出运行时异常,中断Spring的启动过程,从而避免消息被分发到错误的应用。本发明实施例能够充分发挥时间轮的前缀的作用,及时发现分布式时间轮分组使用的代码缺陷,便于在测试阶段进行修正,补全了分布式时间轮分组的异常机制。
具体细节请参考图6和7所示的方法实施例。
图13是本发明实施例的第三种分布式时间轮分组注册的校验装置的结构框图,如图13所示,在一些实施例中,该校验装置100c还包括:更新模块50,用于通过expire命令更新分布式时间轮分组的注册Key的过期时间,且checkGroup函数的返回值为注册成功。
所属领域的技术人员可以清楚地了解到,为了描述的方便和简洁,仅以上述各功能单元、模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能单元、模块完成,即将装置的内部结构划分成不同的功能单元或模块,以完成以上描述的全部或者部分功能。实施例中的各功能单元、模块可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中,上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。另外,各功能单元、模块的具体名称也只是为了便于相互区分,并不用于限制本发明的保护范围。上述系统中单元、模块的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
实施例三
如图14所示,本发明实施例还提供了一种计算机可读存储介质300,计算机可读存储介质300内存储有计算机程序310,该计算机程序310被处理器执行时,实现:
步骤A:从配置文件读取分布式时间轮的前缀参数,并对监听到的应用内的事件类型进行筛选,获得事件分组;
步骤B:通过Lua脚本中的预设函数将事件分组和分布式时间轮的前缀参数写入Redis的预设数据结构中以对事件分组进行注册,获得分布式时间轮分组的注册Key;
步骤C:通过Lua脚本中的预设命令对分布式时间轮分组的注册Key的注册结果进行校验。
一种可能的处理中,该计算机程序310被处理器执行时,步骤A包括如下步骤:
步骤A1:在从配置文件读取分布式时间轮的前缀参数之后生成Bean;
步骤A2:在生成Bean过程中筛选出Bean中包含目标注解的方法集合;
步骤A3:判断方法集合是否为空,当判断方法集合为非空时,将方法集合中的事件类型放入事件清单中,获得事件分组;
步骤A4:判断是否有Bean未生成完毕,如果是,则继续执行步骤A1。
一种可能的处理中,该计算机程序310被处理器执行时,在步骤B之前,还包括:
判断事件清单是否为空;
如果是,则结束分布式时间轮分组注册的校验;
如果否,则触发执行步骤B。
一种可能的处理中,该计算机程序310被处理器执行时,步骤B包括:
步骤B1:将事件分组和分布式时间轮的前缀参数传入Lua脚本中;
步骤B2:用于通过Lua脚本中的checkGroup函数将事件分组和分布式时间轮的前缀参数写入Redis的Set数据结构,将事件分组对应的分布式时间轮的前缀参数与Lua脚本中的字符串标识进行拼接,获得分布式时间轮分组的注册Key。
一种可能的处理中,该计算机程序310被处理器执行时,步骤C具体包括:
步骤C1:通过Lua脚本的scard命令检查分布式时间轮分组的注册Key的元素数量;
步骤C2:根据元素数量对注册key的注册结果进行校验。
一种可能的处理中,该计算机程序310被处理器执行时,步骤C2具体包括:
步骤C21:判断分布式时间轮分组的注册Key的元素数量是否为0;
步骤C22:当分布式时间轮分组的注册Key的元素数量为0时,执行如下步骤:
步骤C221:将事件分组中的事件类型写入注册Key的集合中;
步骤C222:判断是否遍历事件分组,如果否,则继续执行步骤C221,如果是,则结束步骤C221的写入操作。
一种可能的处理中,该计算机程序310被处理器执行时,步骤C2还包括:
步骤C23:当断分布式时间轮分组的注册Key的元素数量不为0时,执行如下步骤:
步骤C231:判断注册Key的元素数量与事件分组中的事件类型的数量是否相等;
步骤C232:当注册Key的元素数量与事件分组中的事件类型的数量不相等时,则结束Lua脚本的checkGroup函数,且checkGroup函数的返回值为注册失败。
一种可能的处理中,该计算机程序310被处理器执行时,步骤C23还包括:
步骤C233:当注册Key的元素数量与事件分组中的事件类型的数量相等时,则执行如下步骤:
遍历事件分组中的事件类型;
通过Lua脚本中的sismember命令判断事件分组中的事件类型是否在注册Key的集合中,当sismember命令的值有一次为0时,则结束Lua脚本的checkGroup函数,且checkGroup函数的返回值为注册失败。
一种可能的处理中,该计算机程序310被处理器执行时,在步骤C之后,还包括:
步骤D:通过expire命令更新分布式时间轮分组的注册Key的过期时间,且checkGroup函数的返回值为注册成功。
图1至图7所述集成的模块/单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明实现上述实施例方法中的全部或部分流程,也可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一计算机可读存储介质中,该计算机程序在被处理器执行时,可实现上述各个方法实施例的步骤。其中,所述计算机程序包括计算机程序代码,所述计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。所述计算机可读介质可以包括:能够携带所述计算机程序代码的任何实体或装置、记录介质、U盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、电载波信号、电信信号以及软件分发介质等。当然,还有其他方式的可读存储介质,例如量子存储器、石墨烯存储器等等。需要说明的是,所述计算机可读介质包含的内容可以根据司法管辖区内立法和专利实践的要求进行适当的增减,例如在某些司法管辖区,根据立法和专利实践,计算机可读介质不包括电载波信号和电信信号。
实施例四
图15是本发明的一个实施例电子设备的结构示意图。本发明实施例还提供一种电子设备,请参考图15,在硬件层面,该电子设备包括处理器,可选地还包括内部总线、网络接口、存储器。其中,存储器可能包含内存,例如高速随机存取存储器(Random-AccessMemory,RAM),也可能还包括非易失性存储器(non-volatile memory),例如至少1个磁盘存储器等。当然,该电子设备还可能包括其他业务所需要的硬件。
处理器、网络接口和存储器可以通过内部总线相互连接,该内部总线可以是工业标准体系结构ISA总线、外设部件互连标准PCI总线或扩展工业标准结构EISA总线等。所述总线可以分为地址总线、数据总线、控制总线等。为便于表示,图15中仅用一个双向箭头表示,但并不表示仅有一根总线或一种类型的总线。
存储器,用于存放程序。具体地,程序可以包括程序代码,所述程序代码包括计算机操作指令。存储器可以包括内存和非易失性存储器,并向处理器提供指令和数据。处理器,执行存储器所存放的程序,并具体用于执行图1至图5所示实施例揭示的一种分布式时间轮分组注册的校验方法。
上述如图1至图7所示实施例揭示的一种分布式时间轮分组注册的校验方法可以应用于处理器中,或者由处理器实现。处理器可能是一种集成电路芯片,具有信号的处理能力。在实现过程中,上述方法的各步骤可以通过处理器中的硬件的集成逻辑电路或者软件形式的指令完成。上述的处理器可以是通用处理器,包括中央处理器(CentralProcessingUnit,CPU)、网络处理器(Network Processor,NP)等;还可以是数字信号处理器(DigitalSignal Processor,DSP)、专用集成电路(Application Specific IntegratedCircuit,ASIC)、现场可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。可以实现或者执行本发明实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合本发明实施例所公开的方法的步骤可以直接体现为硬件译码处理器执行完成,或者用译码处理器中的硬件及软件模块组合执行完成。软件模块可以位于随机存储器,闪存、只读存储器,可编程只读存储器或者电可擦写可编程存储器、寄存器等本领域成熟的存储介质中。该存储介质位于存储器,处理器读取存储器中的信息,结合其硬件完成上述方法的步骤。
当然,除了软件实现方式之外,本发明的电子设备并不排除其他实现方式,比如逻辑器件抑或软硬件结合的方式等等,也就是说以下处理流程的执行主体并不限定于各个逻辑单元,也可以是硬件或逻辑器件。上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机。具体的,计算机例如可以为个人计算机、膝上型计算机、车载人机交互设备、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任何设备的组合。
虽然本发明提供了如实施例或流程图所述的方法操作步骤,但基于常规或者无创造性的手段可以包括更多或者更少的操作步骤。实施例中列举的步骤顺序仅仅为众多步骤执行顺序中的一种方式,不代表唯一的执行顺序。在实际中的装置或终端产品执行时,可以按照实施例或者附图所示的方法顺序执行或者并行执行(例如并行处理器或者多线程处理的环境,甚至为分布式数据处理环境)。
本发明是参照根据本发明实施例的方法、设备、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
本说明书中的各个实施例均采用相关的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置、电子设备及可读存储介质实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内所作的任何修改、等同替换、改进等,均包含在本发明的保护范围内。
Claims (11)
1.一种分布式时间轮分组注册的校验方法,其特征在于,所述方法包括如下步骤:
步骤A:从配置文件读取分布式时间轮的前缀参数,并对监听到的应用内的事件类型进行筛选,获得事件分组;
步骤B:通过Lua脚本中的预设函数将所述事件分组和所述分布式时间轮的前缀参数写入Redis的预设数据结构中以对所述事件分组进行注册,获得分布式时间轮分组的注册Key;
步骤C:通过Lua脚本中的预设命令对所述分布式时间轮分组的注册Key的注册结果进行校验;
所述步骤C包括:
步骤C1:通过Lua脚本的scard命令检查所述分布式时间轮分组的注册Key的元素数量;
步骤C2:根据所述元素数量对所述注册Key的注册结果进行校验;
所述步骤C2具体包括:
步骤C21:判断所述分布式时间轮分组的注册Key的元素数量是否为0;
步骤C22:当判断所述分布式时间轮分组的注册Key的元素数量为0时,执行如下步骤:步骤C221:将所述事件分组中的事件类型写入所述注册Key的集合中;步骤C222:判断是否遍历所述事件分组,如果否,则继续执行所述步骤C221,如果是,则结束所述步骤C221的写入操作;
步骤C23:当所述分布式时间轮分组的注册Key的元素数量不为0时,执行如下步骤:步骤C231:判断所述注册Key的元素数量与所述事件分组中的事件类型的数量是否相等;步骤C232:当所述注册Key的元素数量与所述事件分组中的事件类型的数量不相等时,则结束Lua脚本的checkGroup函数,且checkGroup函数的返回值为注册失败;步骤C233:当所述注册Key的元素数量与所述事件分组中的事件类型的数量相等时,则执行如下步骤:遍历所述事件分组中的事件类型;通过Lua脚本中的sismember命令判断所述事件分组中的事件类型是否在所述注册Key的集合中,当所述sismember命令的值有一次为0时,则结束Lua脚本的checkGroup函数,且所述checkGroup函数的返回值为注册失败。
2.根据权利要求1所述的方法,其特征在于,所述步骤A包括:
步骤A1:在从配置文件读取分布式时间轮的前缀参数之后生成Bean;
步骤A2:在生成所述Bean过程中筛选出所述Bean中包含目标注解的方法集合;
步骤A3:判断所述方法集合是否为空,当判断所述方法集合为非空时,将所述方法集合中的事件类型放入事件清单中,获得事件分组;
步骤A4:判断是否有Bean未生成完毕,如果是,则继续执行所述步骤A1。
3.根据权利要求2所述的方法,其特征在于,在所述步骤B之前,还包括:
判断所述事件清单是否为空;
当判断所述事件清单为空时,结束所述分布式时间轮分组注册的校验;
当判断所述事件清单为非空时,触发执行所述步骤B。
4.根据权利要求3所述的方法,其特征在于,所述步骤B包括:
步骤B1:将所述事件分组和所述分布式时间轮的前缀参数传入所述Lua脚本中;
步骤B2:通过所述Lua脚本中的checkGroup函数将所述事件分组和所述分布式时间轮的前缀参数写入Redis的Set数据结构,将所述事件分组对应的所述分布式时间轮的前缀参数与所述Lua脚本中的字符串标识进行拼接,获得所述分布式时间轮分组的注册Key。
5.根据权利要求1所述的方法,其特征在于,在所述步骤C之后,还包括:
步骤D:通过expire命令更新所述分布式时间轮分组的注册Key的过期时间,且所述checkGroup函数的返回值为注册成功。
6.一种分布式时间轮分组注册的校验装置,其特征在于,所述装置包括:
事件分组模块,用于从配置文件读取分布式时间轮的前缀参数,并对监听到的应用内的事件类型进行筛选,获得事件分组;
注册模块,用于通过Lua脚本中的预设函数将所述事件分组和所述分布式时间轮的前缀参数写入Redis的预设数据结构中以对所述事件分组进行注册,获得分布式时间轮分组的注册Key;
校验模块,用于通过Lua脚本中的预设命令对所述分布式时间轮分组的注册Key的注册结果进行校验;
所述校验模块包括:
检查子模块,用于通过Lua脚本的scard命令检查所述分布式时间轮分组的注册Key的元素数量;
执行子模块,用于根据所述元素数量对所述分布式时间轮分组的注册key的注册结果进行校验;
所述执行子模块包括:
元素数量判断单元,用于判断所述分布式时间轮分组的注册Key的元素数量是否为0;
写入与判断单元,用于当所述分布式时间轮分组的注册Key的元素数量为0时,将所述事件分组中的事件类型写入所述注册Key的集合中;判断是否遍历所述事件分组,如果否,则继续执行写入操作,如果是,则结束写入操作;
判断与返回单元,用于当所述分布式时间轮分组的注册Key的元素数量不为0时,判断所述注册Key的元素数量与所述事件分组中的事件类型的数量是否相等;当所述注册Key的元素数量与所述事件分组中的事件类型的数量不相等时,则结束Lua脚本的checkGroup函数,且返回值为注册失败;当所述注册Key的元素数量与所述事件分组中的事件类型的数量相等时,遍历所述事件分组中的事件类型;通过Lua脚本中的sismember命令判断所述事件分组中的事件类型是否在所述注册Key的集合中,当所述sismember命令的值有一次为0时,则结束Lua脚本的checkGroup函数,且返回值为注册失败。
7.根据权利要求6所述的校验装置,其特征在于,所述事件分组模块具体包括:
实例化子模块,用于在从配置文件读取分布式时间轮的前缀参数之后生成Bean;
筛选子模块,用于在生成所述Bean过程中筛选出所述Bean中包含目标注解的方法集合;
第一判断处理子模块,用于判断所述方法集合是否为空,当所述方法集合为非空时,将所述方法集合中的事件类型放入事件清单中,获得事件分组;
第二判断处理子模块,用于判断是否有Bean未生成完毕,如果是,则返回所述实例化子模块。
8.根据权利要求6所述的校验装置,其特征在于,所述校验装置还包括:
判断处理模块,用于判断所述事件分组是否为空;如果是,则校验结束;如果否,则触发启动所述注册模块。
9.根据权利要求8所述的校验装置,其特征在于,所述注册模块包括:
传入子模块,用于将所述事件分组和所述分布式时间轮的前缀参数传入所述Lua脚本中;
拼接子模块,用于通过所述Lua脚本中的checkGroup函数将所述事件分组和所述分布式时间轮的前缀参数写入Redis的Set数据结构,将所述事件分组对应的所述分布式时间轮的前缀参数与所述Lua脚本中的字符串标识进行拼接,获得所述分布式时间轮分组的注册Key。
10.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现如权利要求1-5中任意一项所述的一种分布式时间轮分组注册的校验方法。
11.一种电子设备,其特征在于,其包括:
处理器;
用于存储所述处理器可执行指令的存储器;
其中,所述处理器被配置为执行所述指令,以实现如权利要求1-5中任意一项所述的一种分布式时间轮分组注册的校验方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210553280.3A CN114879942B (zh) | 2022-05-20 | 2022-05-20 | 分布式时间轮分组注册的校验方法、装置、介质和设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210553280.3A CN114879942B (zh) | 2022-05-20 | 2022-05-20 | 分布式时间轮分组注册的校验方法、装置、介质和设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN114879942A CN114879942A (zh) | 2022-08-09 |
CN114879942B true CN114879942B (zh) | 2023-02-03 |
Family
ID=82677780
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210553280.3A Active CN114879942B (zh) | 2022-05-20 | 2022-05-20 | 分布式时间轮分组注册的校验方法、装置、介质和设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114879942B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116149790B (zh) * | 2023-02-15 | 2023-11-21 | 北京景安云信科技有限公司 | 一种基于减少JVM进程启动多个Springboot项目的方法 |
Citations (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6289395B1 (en) * | 1997-11-24 | 2001-09-11 | International Business Machines Corporation | Generic Java-based event processor for scripting Java beans |
CN103677976A (zh) * | 2013-12-09 | 2014-03-26 | 大唐移动通信设备有限公司 | 一种基于时间轮定器的事件处理方法及装置 |
WO2016123511A1 (en) * | 2015-01-30 | 2016-08-04 | Vision Service Plan | Systems and methods for tracking motion, performance, and other data for a bicycle, other vehicle, and/or an individual such as a winter sports athlete |
CN109995842A (zh) * | 2018-01-02 | 2019-07-09 | 北京奇虎科技有限公司 | 一种用于分布式服务器集群的分组方法及装置 |
CN111226186A (zh) * | 2018-03-16 | 2020-06-02 | 华为技术有限公司 | 唤醒管理方法、定时器管理方法及终端设备 |
CN111722973A (zh) * | 2019-03-20 | 2020-09-29 | 顺丰科技有限公司 | 一种事件超时监控方法、系统及存储介质 |
CN112015572A (zh) * | 2020-08-25 | 2020-12-01 | 广州鲁邦通物联网科技有限公司 | 一种延时任务的执行方法、中心和系统 |
CN112650572A (zh) * | 2020-12-30 | 2021-04-13 | 平安普惠企业管理有限公司 | 一种分布式任务调度方法、装置、计算机设备及存储介质 |
CN112771983A (zh) * | 2018-09-26 | 2021-05-07 | 联想(新加坡)私人有限公司 | 执行两步随机接入信道过程 |
CN114265845A (zh) * | 2021-12-27 | 2022-04-01 | 上海淇玥信息技术有限公司 | 一种延时任务的处理方法、装置和电子设备 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106210792B (zh) * | 2016-06-24 | 2019-04-23 | 武汉斗鱼网络科技有限公司 | 基于时间轮盘和页面行为的活跃用户集维护方法及系统 |
CN106681813B (zh) * | 2016-12-15 | 2020-06-12 | 腾讯科技(深圳)有限公司 | 一种系统管理方法及装置 |
CN111930700B (zh) * | 2020-07-13 | 2024-05-31 | 车智互联(北京)科技有限公司 | 一种分布式日志处理方法、服务器、系统和计算设备 |
-
2022
- 2022-05-20 CN CN202210553280.3A patent/CN114879942B/zh active Active
Patent Citations (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6289395B1 (en) * | 1997-11-24 | 2001-09-11 | International Business Machines Corporation | Generic Java-based event processor for scripting Java beans |
CN103677976A (zh) * | 2013-12-09 | 2014-03-26 | 大唐移动通信设备有限公司 | 一种基于时间轮定器的事件处理方法及装置 |
WO2016123511A1 (en) * | 2015-01-30 | 2016-08-04 | Vision Service Plan | Systems and methods for tracking motion, performance, and other data for a bicycle, other vehicle, and/or an individual such as a winter sports athlete |
CN109995842A (zh) * | 2018-01-02 | 2019-07-09 | 北京奇虎科技有限公司 | 一种用于分布式服务器集群的分组方法及装置 |
CN111226186A (zh) * | 2018-03-16 | 2020-06-02 | 华为技术有限公司 | 唤醒管理方法、定时器管理方法及终端设备 |
CN112771983A (zh) * | 2018-09-26 | 2021-05-07 | 联想(新加坡)私人有限公司 | 执行两步随机接入信道过程 |
CN111722973A (zh) * | 2019-03-20 | 2020-09-29 | 顺丰科技有限公司 | 一种事件超时监控方法、系统及存储介质 |
CN112015572A (zh) * | 2020-08-25 | 2020-12-01 | 广州鲁邦通物联网科技有限公司 | 一种延时任务的执行方法、中心和系统 |
CN112650572A (zh) * | 2020-12-30 | 2021-04-13 | 平安普惠企业管理有限公司 | 一种分布式任务调度方法、装置、计算机设备及存储介质 |
CN114265845A (zh) * | 2021-12-27 | 2022-04-01 | 上海淇玥信息技术有限公司 | 一种延时任务的处理方法、装置和电子设备 |
Non-Patent Citations (5)
Title |
---|
Improved Task Management Techniques for Enforcing EDF Scheduling on Recurring Tasks;Michael Short;《2010 16th IEEE Real-Time and Embedded Technology and Applications Symposium》;20100518;1-6 * |
Improvement Strategy of Distributed Delay Task Based on Timing Wheel Algorithms;Ping Wu;《International Conference on Machine Learning and Big Data Analytics for IoT Security and Privacy》;20211103;1-6 * |
一种基于时间轮机制的软件定时器算法;高光;《万方》;20181015;104-106 * |
分布式列式内存数据库事务系统的设计与实现;韩锋;《中国优秀硕士学位论文全文数据库 (信息科技辑)》;20220115;I138-906 * |
深度剖析 -- 时间轮算法(TimingWheel)是如何实现的?;天秤座的架构师;《https://blog.csdn.net/u012921921/article/details/120196048》;20210909;1-7 * |
Also Published As
Publication number | Publication date |
---|---|
CN114879942A (zh) | 2022-08-09 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110941528B (zh) | 一种基于故障的日志埋点设置方法、装置及系统 | |
US8347108B2 (en) | System and method for automated safe reprogramming of software radios | |
US20030055809A1 (en) | Methods, systems, and articles of manufacture for efficient log record access | |
US20030216927A1 (en) | System and method for automated safe reprogramming of software radios | |
US10171315B2 (en) | Orchestration process template for generation of orchestration process to tolerate errors | |
CN111914194B (zh) | 一种业务系统变更方法、装置、电子设备及存储介质 | |
US10284660B1 (en) | Data flow tokens to trace execution of services in a service provider network | |
CN114879942B (zh) | 分布式时间轮分组注册的校验方法、装置、介质和设备 | |
CN111461886B (zh) | 区块链上不依赖智能合约的系统配置的管理方法和装置 | |
CN111258726A (zh) | 任务调度方法和装置 | |
CN110457132B (zh) | 一种功能对象的创建方法、装置和终端设备 | |
CN112598529B (zh) | 数据处理方法及装置、计算机可读存储介质、电子设备 | |
CN111782502A (zh) | 一种自动化测试的方法及装置 | |
CN110716943A (zh) | 缺失数据补录方法、装置、计算机设备及存储介质 | |
CN111367694B (zh) | 事件处理方法、服务器及计算机存储介质 | |
CN108710658B (zh) | 一种数据记录的存储方法及装置 | |
CN115983991A (zh) | 一种流程调整方法、装置、设备及介质 | |
CN113706146B (zh) | 一种基于区块链执行批量交易的处理方法、装置和系统 | |
CN110989985B (zh) | 基于Maven的依赖包的管理方法、装置、计算机设备及存储介质 | |
CN111652580B (zh) | 一种对节点的数据处理方法及装置 | |
CN110618943B (zh) | 安防服务测试方法、装置、电子设备及可读存储介质 | |
CN113469814A (zh) | 交易时长数据的确定方法及装置 | |
CN112783954A (zh) | 数据访问方法、装置及服务器 | |
CN111176762A (zh) | 批量处理程序的执行方法及装置、电子设备和可存储介质 | |
CN107122164B (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 |