对方正在输入。。。
2022-04-14
感觉优先队列也可以实现延时队列,只要优先队列按照调度时间优先就可以了吧
作者回复: 最常见的延时队列实现方式之一就是基于优先队列的;主要是用来快速的找到最近的超时任务。
1
peter
2022-03-08
请教老师几个问题: Q1:延时队列和定时任务的区别是什么? 延时队列可以看作是一种特殊的定时任务吗? Q2:时间轮算法: A JDK是否实现了时间轮? B SpringBoot应用是否可以直接利用时间轮?比如引入一个包就可以用。 Q3:时间轮的图中,槽位“3”的队列是双向箭头,槽位“4”对应的队列用了单向箭头,为什么? Q4:ZSET部分,redis是<K:V>对,是两个值,怎么处理id:value:score三个值的情况呢? Q5:ZSET只存储任务ID,不存储具体任务,即redis中并没有具体任务信息。消费端需要维护 “任务id --- 具体任务”映射关系,根据ID找到具体任务执行,是这样吗?
2
陈斌
2022-11-17
来自广东
第三种实现方式,时间轮,是一个巧妙又高效的设计。牺牲了一定精度,但通过在内存中以循环队列的方式维护任务,降低了任务并行插入的锁竞争,也减少了取出任务的时间复杂度,特别适用于大量定时任务存在的场景,也因此成为 Kafka 实现延时队列的一种常用方式。 1、 特别适用于大量定时任务存在的场景 这个怎么理解,时间轮的设计不也是把元素放在内存中的吗,怎么就特别适合大量定时任务存在的场景,OOM了怎么办? 2、老师能简单的介绍一下 怎么基于时间轮的设计实现 一个基于Kafka的延时队列?消费Kafka的数据放入时间轮中,延时触发任务?
1
陈斌
2022-11-17
来自广东
JDK 中的 DelayedQueue 可以更好地利用系统内置的定时机制,避免轮询的成本,不过因为单机本身的限制,不能很好的扩展来支持海量的数据场景。 1、JDK的DelayedQueue 不支持海量的数据场景:是因为 DelayedQueue 是无界队列,数据量太多会造成OOM吗? 2、为了提高效率,DelayedQueue 底层还采用了一种 leader-follower 的线程模型,也非常常用,你可以理解成任务的执行会有多个线程进行。 这句话中的任务执行 指的是队列中的元素出队列 的这个操作 吗,leader-follower线程模型 就是 一个线程去读取队列的队首元素是否到期,如果到期这个线程不负责将该元素出队,而是提交任务让其他线程去负责元素的出队操作? 3、 DelayedQueue 是线程安全队列,那么在频繁写入的场景,队列中的元素是获取不到读锁的,也会导致 take 方法阻塞,导致任务被延迟执行。例如极端场景:延迟队列一直在增加数据(队列元素的写锁一直被占有),尽管队列已经有满足条件的元素可以出队了,但是take方法一直会被阻塞,这么理解对吗?
展开