内容简介:特点:定期轮训数据库,设置状态。特点: 无界、延迟、阻塞队列这里为什么要用leader/follower模式?
特点:定期轮训数据库,设置状态。
优点:实现简单 缺点:数据量过大时会消耗太多的IO资源,效率太低 复制代码
2.2 DelayQueue
特点: 无界、延迟、阻塞队列
a、BlockingQueue+PriorityQueue(堆排序)+Delayed b、DelayQueue中存放的对象需要实现compareTo()方法和getDelay()方法。 c、getDelay方法返回该元素距离失效还剩余的时间,当<=0时元素就失效了, 就可以从队列中获取到。 复制代码
这里为什么要用leader/follower模式?
- 如果不是队首节点,根本不需要唤醒操作!
- 假设取值时,延时时间还没有到,那么需要等待,但这个时候,队列中新加入了一个延时更短的,并放在了队首,那么 此时,for循环由开始了,取得是新加入的元素,那之前的等待就白等了,明显可以早点退出等待!
- 还有就是如果好多线程都在此等待,如果时间到了,同时好多线程会充等待队列进入锁池中,去竞争锁资源,但结果只能是一个成功, 多了写无畏的竞争!(多次的等待和唤醒)
2.3 Timer与TimerTask
- TaskQueue中的 排序 是对TimerTask中的下一次执行时间进行堆排序,每次去取数组第一个。
- 而delayQueue是对queue中的元素的getDelay()结果进行排序
Timer是一种定时器工具,用来在一个后台线程计划执行指定任务。它可以计划执行一个任务一次或反复多次。 主要方法:
2.4 时间轮(kafka)
时间轮名词解释:
- 时间格:环形结构中用于存放延迟任务的区块;
- 指针(CurrentTime):指向当前操作的时间格,代表当前时间
- 格数(ticksPerWheel):为时间轮中时间格的个数
- 间隔(tickDuration):每个时间格之间的间隔
- 总间隔(interval):当前时间轮总间隔,也就是等于ticksPerWheel*tickDuration
根据每个TimerTaskEntry的过期时间和当前时间轮的时间,选择一个合适的bucket(实际上就是TimerTaskList),把这个TimerTaskEntry对象放进去,同时如果bucket的过期时间有更新,就将这个bucket推进DelayQueue,重新排序
例子:假设编号为0的时间格或者桶保存着到期时间为t,每一个tick的持续时间(tickDuration)为20ms,在这个格子里只能保存着到期时间为[t~t+20]ms的任务,假设时间轮的时间格有n个,每一个间隔1ms,到期时间为m(ms),那么计算公式m%n = 所在的时间格或者桶,比如n=10,m=34ms,那么他所在桶或者时间格是4
2.5 RabbitMQ-延时任务
RabbitMQ本身没有直接支持延迟队列功能,但是可以通过以下特性模拟出延迟队列的功能。
RabbitMQ可以针对Queue和Message设置 x-message-tt,来控制消息的生存时间,如果超时,则消息变为dead letter RabbitMQ针对队列中的消息过期时间有两种方法可以设置。 A: 通过队列属性设置,队列中所有消息都有相同的过期时间。 B: 对消息进行单独设置,每条消息TTL可以不同。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 你以为只要努力就够了吗?
- 主键,不少人以为自己懂了,却不透彻
- 双向最大匹配和实体标注:你以为我只能分词?
- 自以为用了 OKR,为啥还是 KPI 思维?
- 你以为用了 BigDecimal 后,计算结果就一定精确了?
- 别逗了,你真以为 MySQL 分库分表支持服务无限扩容吗?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
ANSI Common Lisp
Paul Graham / Prentice Hall / 1995-11-12 / USD 116.40
For use as a core text supplement in any course covering common LISP such as Artificial Intelligence or Concepts of Programming Languages. Teaching students new and more powerful ways of thinking abo......一起来看看 《ANSI Common Lisp》 这本书的介绍吧!