在做业务时经常遇到某些一次性的延迟需求,比如新闻的定时发布,过了一个时间阈值后某个任务的状态置为超时或触发某个接口。
之前实现这种一次性的延迟需求基本会有3种思路。
(1)线程轮询扫库
(2)Timer类
(3)定时框架Quartz
这三种方案都存在各自的问题
对于“线程轮询扫库”,性能开销巨大,实时性差
对于“Timer类”来说,假如项目重启,之前设置的定时就荡然无存
对于“定时框架Quartz”虽然支持DBstore,但是框架太过于重量级。
如何优雅而又高效的实现一个延迟任务呢?前不久看到一篇文章 https://mp.weixin.qq.com/s/eDMV25YqCPYjxQG-dvqSqQ ,似乎提供了一个不错的解法。
按照思路我自己实现了一个环形队列,https://git.oschina.net/spjich/RingQueue.git
引用文章里的一个图片:
这篇文章只是提出一个解决的思路,但是有几个问题并未说明
1.这种定时类似于内存里的状态机,是内存就必然会重启清除。 解决方案:需要将任务录入DB一份,重启项目构造环形队列时实现AbstractRingQueue的initData方法,将DB中还未完成的任务重新加载进来运行
2.大规模集群环境下如何保证正常运行? 解决方案:这点非常关键,在集群条件下,如果项目重启,那么一个任务就会被执行n次,此时我想到的解决方案是根据某种规则进行数据的初始化,比如某个集群里有3台机器编号分别为1,2,3,那么每台在initData的时候分别加载 taskId%3-机器编号=0 的任务。当然我提出的这种方案并不是最好的,他同样会存在热点问题,会使某台机器上运行的task比其他机器上多,大体解决思路可以参考一些负载均衡策略。
另外纠正下文章最后说“开源的MQ好像都不支持延迟消息”这句话,据我所知阿里的RocketMQ是支持延迟消息的。
原创文章转载请声明出处:http://spjich.iteye.com/blog
相关推荐
1. c++实现的无锁环形队列,注释详细,讲解了环形队列的实现原理和操作技巧 2. 在linux服务器下,可以自己编译,运行,也可以修改参数后做测试 3. 编译的命令如下:g++ -std=c++11 -o test main.cpp ring_buffer.cpp...
这是一个环形队列的源程序,配合作者的文章《缓冲区设计--环形队列》。程序是一个C++模版类。
基于STM32F103芯片串口通信例程,主要...通过环形队列来接收串口数据,可以边收边解析,达到缓冲作用,可以做较大数据接收。目前的例程没有通信协议,只是在接收时,以判断数据串有回车信号,就认为该数据串接收完成。
基于C和C++实现的嵌入式设备算法库(含PID控制器_哈夫曼编码器_哈希表_环形队列算法实现).zip 基于C和C++实现的嵌入式设备算法库(含PID控制器_哈夫曼编码器_哈希表_环形队列算法实现).zip 基于C和C++实现的嵌入式设备...
配套代码讲解:https://blog.csdn.net/songchuwang1868/article/details/90200251 ...同步队列-无锁队列-循环数组无锁队列 同步队列-无锁队列-循环数组无锁队列 同步队列-无锁队列-循环数组无锁队列
stm32环形队列
基于锁(Lock-Base)的算法实现扩充是相当容易的,但基于锁无关(Lock-Free)实现起来难度较大,下面将使用伪代码介绍基于Lock-Free实现可自适应扩充的环形并发队列算法,并提出了优化方案以使特定环境下能再提高...
【数据结构与算法 - 环形队列】 C语言实现
来自网上是一个环形队列的实现. 可以用来做TCP的接收缓冲
实现环形队列 原文:http://blog.csdn.net/billow_zhang/article/details/4420789
java实现的队列,通过图的方式来演示环形队列的结构和原理,通过图从感官上了解队列的形式,从逻辑上更好的明白环形队列的实质。
@214175590。
环形队列实现源码(c++)实现代码,做单片机或PC上位机通信程序开发经常用的数据结构,非常有用,本人已经用在多个项目中。
基于stm32f407的串口环形队列及DMA收发中断数据处理,连接了串口1的收发DMA通道,组合环形队列实现数据的缓存处理,亲测有效,可能存在变量类型不一致的问题,重新定义一下即可,欢迎交流。
环形缓冲区,适用于接收外部数据时用作缓冲 STM32 QUEUE_DATA_TYPE* cbWrite(QueueBuffer *cb); QUEUE_DATA_TYPE* cbRead(QueueBuffer *cb); void cbReadFinish(QueueBuffer *cb); void cbWriteFinish(QueueBuffer *...
环形队列 1)front变量的含义做一个调整:front就指向队列的第一个元素,也就是说arffront]就是 队列的第一个元素front的初始值=0 2)rear变量的含义做一个调整:rear指向队列的最后一个元素的后一个位置.因为希望...
C 写的一个环形队列 可扩展为无锁队列 也可扩展为变长队列
采用环形队列对串口大数据进行处理,降低了串口误码率,提高串口抗干扰性。程序中采用一定的通信协议,解决数据干扰问题,用户可根据自己的协议进行修改。该程序工程可用于项目当中,只需简单修改就可以加进去,可...
环形缓冲区读写操作的分析与实现,以及在并发条件下如何控制竞争
使用C语言开发的C语言环形队列通用模块,不限制数据类型,直接通用,结构简单。linux和window都可以使用。增加了线程安全