在做业务时经常遇到某些一次性的延迟需求,比如新闻的定时发布,过了一个时间阈值后某个任务的状态置为超时或触发某个接口。
之前实现这种一次性的延迟需求基本会有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
相关推荐
总之,STM32串口环形队列程序通过中断驱动和环形队列技术,实现了大数据量吞吐的串口通信,确保了高速、低延迟的数据交换,适用于对实时性和数据完整性有较高要求的应用场景。对于其他单片机,只要硬件支持中断和...
为了解决上述问题,我们可以采用环形队列(Circular Queue)结合任务集合的方式实现高效的延迟消息功能。 ##### 环形队列的设计与实现 1. **环形队列**:创建一个包含3600个槽位(slot)的环形队列,每个槽位对应...
5. 时间轮(Time Wheel):这是一种高效的数据结构,通过环形队列和定时器实现,将任务分配到对应槽位,定时器推进指针来触发任务执行。 DelayQueue的实现原理: DelayQueue是一个基于优先级队列的数据结构,插入的...
在“atomic_queue”这个开源库中,我们看到一个基于原子操作的多生产者多消费者(Multiple Producer Multiple Consumer,简称MPMC)无锁队列的实现。这个库特别关注于超低延迟,这意味着它能在高并发场景下保持极低...
无锁队列的实现通常基于特定的数据结构,如环形缓冲区或链表。在C++11中,我们可以利用原子操作来安全地读写队列的头部和尾部指针,确保在没有锁的情况下,插入和删除操作不会发生冲突。例如,一个简单的无锁队列...
Disruptor是由LMAX公司开源的一款并发框架,其设计灵感来源于传统的消息队列,但通过独特的环形缓冲区(Ring Buffer)和事件处理机制,显著提升了并发性能,特别适用于高吞吐量、低延迟的场景。Disruptor的核心思想是...
- **发展趋势**:无锁化环形队列技术持续向高并发、低延迟方向演进。 - **研究热点**:基于硬件辅助的无锁化机制。 - **应用领域**:人工智能、机器学习、云计算等。 #### 五、内核态代码下推减少用户态调用 1....
- **环形缓冲区**:环形缓冲区是一种特殊的队列结构,非常适合用于有限空间下的数据存储。 #### 四、内核实现 这部分深入探讨了实时操作系统内核的具体实现细节。 - **内核架构**:介绍了实时操作系统内核的设计...
- **VLIB(Vector Library):** 这是VPP的核心库,包含了多种用于内存管理、向量操作、环形队列、哈希表等功能的基本函数。 - **VPP INFRA:** 提供了包括缓冲区管理、节点管理和线程管理在内的基础设施。 - **...
- **Ring Buffer**:环形队列是Disruptor的基础数据结构,它使用固定大小的数组,避免了动态扩容带来的开销。 - **Sequence**:序列号,用于跟踪Ring Buffer中每个槽位的状态。 - **Sequencer**:序列生成器,管理和...
- **异步网络**:在网络环境中,各个节点之间不存在统一的时钟控制,节点间的通信可能受到延迟的影响,且这些延迟是不可预测的。 #### 二、异步网络算法的特点 - 在异步网络中,假设使用的是可靠的FIFO(先进先出...
7. **信号处理**:在数字信号处理中,环形数组常用于实现延迟线,以及各种滤波器算法,如FIR滤波器。 环形数组的设计简洁且高效,能够节省内存空间,提高算法性能,尤其在需要处理循环逻辑或有限存储空间的问题中,...
1. **环形缓冲区**:通过使用环形缓冲区而非传统的队列结构,避免了加锁和解锁的过程。 2. **序列屏障**:通过维护多个Sequence来跟踪各个消费者的进度,从而实现事件的有序处理,而无需使用锁。 3. **事件处理器**...
- **核心思想**:通过环形缓冲区和单生产者、多消费者模型来实现高性能的消息传递。 - **应用场景**:适用于需要高效处理大量数据的系统,如金融交易系统等。 ##### 1.8 Memory Barrier – 西南偏南分享 Memory ...
- **通信拓扑优化**:通过优化通信拓扑结构,如使用树形或环形拓扑,来降低延迟和带宽瓶颈。 - **通信压缩**:利用FP16或梯度量化等技术减少网络流量。 - **资源管理优化**: - **自动化工具**:利用Kubernetes...
- **介绍**: Disruptor是一个高性能的消息队列,特别适合用于低延迟和高吞吐量的应用场景。 - **核心组件**: 1. **Producer**: 负责写入数据到环形缓冲区。 2. **RingBuffer**: 环形缓冲区,作为消息的存储区域。 ...
- **栈和队列**是两种基本的数据结构,栈支持后进先出(LIFO)的操作,队列支持先进先出(FIFO)的操作。 - **散列表**是一种高效的查找数据结构,通过散列函数将关键字映射到表中一个位置来访问记录,以加快查找速度。 ...
- 时轮的高效在于其空间换时间的特性,相比于传统的基于队列的定时任务解决方案,时轮在处理大量定时任务时能提供更好的性能和更低的延迟。 4. **TimingWheel-master项目解析** - `TimingWheel-master` 是一个...
- **3.8 环形队列**:用于高效的数据包存储和检索,降低了延迟。 #### 三、影响DPDK性能的因素 在使用DPDK进行网络数据包处理时,有几个关键因素可能会影响其性能: - **4.1 硬件结构的影响**:不同类型的硬件...