一种多语言交互跨平台的延迟队列实现方法与流程

文档序号:17818211发布日期:2019-06-05 22:00阅读:392来源:国知局
一种多语言交互跨平台的延迟队列实现方法与流程

本发明涉及一种延迟队列实现方法,更具体地说,涉及一种多语言交互跨平台的延迟队列实现方法。



背景技术:

在生活中,会遇到很多需要在一定时间后,执行某件事的需求;例如:在用户预约时间到达前10分钟发短信通知;在用户预约时间结束后要判断用户是否取号了,不然记录为爽约;在用户取号后,等待30分钟后要发送短信提醒是否需要其他渠道办理等类似的场景;最简单的做法就是,做个定时任务去扫表。这样每个业务都要维护自己的扫表逻辑。当业务越来越多时,我们会发现扫表部分的逻辑会非常类似;而且随着时间的推移数据量会越来越大,有的数据的延迟会比较大;所以考虑将这部分逻辑从业务中抽取出来,变成一个公共的部分;目前的实现多是基于beanstalkd实现的,但是在删除消息时特别的不方便,需要更多的成本,并且它是基于c语言实现,目前的网站和软件系统多是基于java开发实现的,所以基于java重新设计实现了一个跨平台的延迟队列。

现有技术方案之一是基于beanstalkd实现的延迟队列,它的每个job有多种状态,状态之间可以相互转换,使用异步的,高效的epoll作为事件驱动框架,但使用的单线程模式。beanstalkd没有内存管理模块,这对于后台服务程序来说,是非常不便的。目前的beanstalkd堆是通过数组来实现的,这种实现相对来说,实现简单,但是扩容效率不高。另外,就是目前beanstalkd不支持数据持久化,在数据量特别大的时候,存在恢复难的问题。

现有技术方案之二是基rabbitmq来实现延迟队列。此技术非常高效,并且由于rabbitmq的分布式特性,可以轻易进行横向扩展,且支持持久化。基于rabbitmq的延迟队列不支持对已发送的消息进行管理,一个消息比同一个队列中的其他消息提前过期,提前过期的消息也不会优先进入死信队列,缺乏灵活性。



技术实现要素:

本发明要解决的技术问题在于,针对现有技术中的缺陷,提供一种多语言交互跨平台的延迟队列实现方法,解决延迟队列中消息传输的可靠性,客户端支持的丰富性,高可用性,实时性,支持消息的删除等问题。

本发明解决其技术问题所采用的技术方案是:构造一种多语言交互跨平台的延迟队列实现方法,基于http通信协议,通过文本协议(json)与客户端交互,解决延迟队列中消息传输的可靠性。

在本发明所述的多语言交互跨平台的延迟队列实现方法中,所述多语言交互跨平台的延迟队列实现方法步骤为:

s1.用户执行某个指令,生成指令的同时,往延迟队列里发送一个job;

s2.延迟队列手动该job后,先往jobpool中存入job信息,然后根据delay计算出执行时间,并以轮询的方式将改jobid存入摸个bucket中;

s3.timer每时每刻都在轮询各个bucket,当轮询到,某个job的执行时间到了,取的jobid从jobpool中获取信息;如果该job处于deleted状态,则pass,继续做轮询;如果job处于非deleted状态,首先再次确认元信息中delay是否大于等于当前时间,如果满足则根据topic将jobid放入对应的readyqueue,然后从bucket中移除;如果不满足则重新计算delay时间,再次放入bucket,并将之前的jobid从bucket中移除;

s4.执行端轮询对应的topic的readyqueue,获取job后做自己的业务逻辑;服务端将已经被消费端获取的job按照其设定的ttr,重新计算执行时间,并将其放入bucket;

s5.执行端处理完业务后向服务端响应finish,服务端根据jobid删除对应的元信息。

实施本发明的一种多语言交互跨平台的延迟队列实现方法,具有以下有益效果:本发明消息传输可靠,多客户端支持丰富,高可用性,支持多实例部署。挂掉一个实例后,还有后备实例继续提供服务。本发明允许存在一定的时间误差,使用本发明,业务使用方可以随时删除指定消息。

附图说明

下面将结合附图及实施例对本发明作进一步说明,附图中:

图1是本发明的多语言交互跨平台的延迟队列实现方法流程图

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

如图1所示,所述多语言交互跨平台的延迟队列实现方法步骤为:s1.用户执行某个指令,生成指令的同时,往延迟队列里发送一个job;

s2.延迟队列手动该job后,先往jobpool中存入job信息,然后根据delay计算出执行时间,并以轮询的方式将改jobid存入摸个bucket中;

s3.timer每时每刻都在轮询各个bucket,当轮询到,某个job的执行时间到了,取的jobid从jobpool中获取信息。果这时该job处于deleted状态,则pass,继续做轮询;如果job处于非deleted状态,首先再次确认元信息中delay是否大于等于当前时间,如果满足则根据topic将jobid放入对应的readyqueue,然后从bucket中移除;如果不满足则重新计算delay时间,再次放入bucket,并将之前的jobid从bucket中移除;

s4.执行端轮询对应的topic的readyqueue,获取job后做自己的业务逻辑。与此同时,服务端将已经被消费端获取的job按照其设定的ttr,重新计算执行时间,并将其放入bucket;

s5.执行端处理完业务后向服务端响应finish,服务端根据jobid删除对应的元信息。

进一步地,所述job具有以下属性:

topic:job类型;id:job的唯一标识;

delay:job需要延迟的时间,单位是秒;

ttr:全名为time-to-run,job执行超时时间,单位是秒;

body:job内容,供执行者做具体的业务处理,以json格式存储。

进一步地,所述延长列队包括4部分:

jobpool,用来存放所有的job信息;

delaybucket,是一组以时间为维度的有序队列,用来存放所有的延迟队列job;

timer,负责实时扫描各个bucket,并将delay时间大于等于当前时间的job放入对应的readyqueue;

readyqueue,存放处于ready状态的job,以供消费程序消费。

尽管通过以上实施例对本发明进行了揭示,但本发明的保护范围并不局限于此,在不偏离本发明构思的条件下,对以上各构件所做的变形、替换等均将落入本发明的权利要求范围内。



技术特征:

技术总结
本发明涉及一种多语言交互跨平台的延迟队列实现方法,一种多语言交互跨平台的延迟队列实现方法,基于http通信协议,通过文本协议(json)与客户端交互,解决延迟队列中消息传输的可靠。本发明消息传输可靠,多客户端支持丰富,高可用性,支持多实例部署。挂掉一个实例后,还有后备实例继续提供服务。本发明允许存在一定的时间误差,使用本发明,业务使用方可以随时删除指定消息。

技术研发人员:仝兴舜;刘延鹏
受保护的技术使用者:深圳竹云科技有限公司
技术研发日:2018.12.28
技术公布日:2019.06.04
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1