Loading

认识过延迟队列吗?什么场景需要延迟队列?

其实这个问题有个面试官问过我,但被我搪塞过去了。其实说到底是那会儿对这个玩意不是特别熟悉,仅仅是听说过。现如今,已经了解了很多了,所以拿出来说一说。

其实这道题属于偏“业务”类型的问题。延迟队列首先是个消息队列,其次是个带延迟功能的消息队列,你这么理解就对了。相对于普通消息队列,延迟队列中的消息除了消息本身外,还要有一个重要元素就是说明这条消息应该何时被消费掉!也就说在指定时间消费掉指定消息。

首先说这玩意能解决什么问题吧。

  1. 抢了一个小米手机,超过30分钟未支付,订单自动作废
  2. 有些退款的订单,那么退款到账是如何检测的
  3. 注册后到现在已经30天的用户,如何发短信撩动

这些业务场景就是典型的需要延迟队列的case。就比如说第一个案例,如果没有延迟队列怎么办?就是写脚本用定时器的方法去轮训,只能如此这样做,没有更好的办法。假如延迟队列后,这件事情就变得好玩了。

好了,回答了面试官的第一个问题:知道延迟队列吗?或者说“订单30分钟超时,如何做?”这个问题得到了解决。

第二个问题,好了现在你要做了,作为phper你准备如何实现延迟队列?

kafka是不可能的,我光听过名字,连摸都没摸过。还是用redis凑合做吧。redis中有个比较屌的数据结构叫做zset,给每个键都添加了一个score的元素,就是分数。我们可以拿时间戳当作score给这个key,然后通过zrevrange获取key的时候指定score范围即可。这样,就可以通过redis实现了一个最简单的延迟队列,而且,吞吐量也不算特别小,足够一般公司支撑一段时间业务了。

 

 

转:https://t.ti-node.com/

posted @ 2018-09-18 10:51  王召波  阅读(6132)  评论(1编辑  收藏  举报