定时的任务调度分布系统
场景如下, 你在淘宝买了一个衣服, 然后忘了评论了, 淘宝为了让你的购物更有意义, 自动给了好评. 这个就是一个定时的(几个小时或者几天)的任务. 如何分布式处理这些任务,是今天的话题.
对于这个问题, Java的原生代码有一个完全符合需求的实现, DelayQueue. 这个queue是一个blocked queue, 他可以让消费者通过take方法, 获得最靠前的已经到期的item(比如已经可以自动好评的淘宝买单). 而生产者通过实现java.util.concurrent.Delayed
借口, 可以往queue里放入item.
另外就是 http://www.cse.wustl.edu/~cdgill/courses/cs6874/TimingWheels.ppt 这是一个名为 HashedWheelTimer的环状计时器. 每个环上的节点都有一个计数器, 代表当前节点是第几圈到期. 而一个环被分为512个ticks, 每个tick是100 毫秒.这样就可以通过mod把过期的具体时间分配到换上的不同tick上. 以下是Netty的具体实现 HashedWheelTimer.java
最后就是 Redis Keyspace Notification, 让人意想不到的是…Redis对Expire( https://redis.io/commands/expire), 仅仅是用unix的timestamp…而整个系统, 也只是配合了pub/sub的架构. 没有新的算法