13518219792

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

1分钟实现“延迟消息”功能

一、缘起

站在用户的角度思考问题,与客户深入沟通,找到彭阳网站设计与彭阳网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:做网站、网站制作、企业官网、英文网站、手机端网站、网站推广、域名与空间、虚拟空间、企业邮箱。业务覆盖彭阳地区。

很多时候,业务有“在一段时间之后,完成一个工作任务”的需求。

例如:滴滴打车订单完成后,如果用户一直不评价,48小时后会将自动评价为5星。

一般来说怎么实现这类“48小时后自动评价为5星”需求呢?

1. 常见方案:

启动一个cron定时任务,每小时跑一次,将完成时间超过48小时的订单取出,置为5星,并把评价状态置为已评价。

假设订单表的结构为:t_order(oid, finish_time, stars, status, …),更具体的,定时任务每隔一个小时会这么做一次:

 
 
 
 
  1. select oid from t_order where finish_time > 48hours and status=0; 
  2. update t_order set stars=5 and status=1 where oid in[…]; 

如果数据量很大,需要分页查询,分页update,这将会是一个for循环。

2. 方案的不足:

(1)轮询效率比较低

(2)每次扫库,已经被执行过记录,仍然会被扫描(只是不会出现在结果集中),有重复计算的嫌疑

(3)时效性不够好,如果每小时轮询一次,最差的情况下,时间误差会达到1小时

(4)如果通过增加cron轮询频率来减少(3)中的时间误差,(1)中轮询低效和(2)中重复计算的问题会进一步凸显

如何利用“延时消息”,对于每个任务只触发一次,保证效率的同时保证实时性,是今天要讨论的问题。

二、高效延时消息设计与实现

高效延时消息,包含两个重要的数据结构:

同时,启动一个timer,这个timer每隔1s,在上述环形队列中移动一格,有一个Current Index指针来标识正在检测的slot。

Task结构中有两个很重要的属性:

假设当前Current Index指向***格,当有延时消息到达之后,例如希望3610秒之后,触发一个延时消息任务,只需:

Current Index不停的移动,每秒移动到一个新slot,这个slot中对应的Set ,每个Task看Cycle-Num是不是0:

使用了“延时消息”方案之后,“订单48小时后关闭评价”的需求,只需将在订单关闭时,触发一个48小时之后的延时消息即可:

三、总结

环形队列是一个实现“延时消息”的好方法,开源的MQ好像都不支持延迟消息,不妨自己实现一个简易的“延时消息队列”,能解决很多业务问题,并减少很多低效扫库的cron任务。

【本文为专栏作者“58沈剑”原创稿件,转载请联系原作者】

戳这里,看该作者更多好文


当前标题:1分钟实现“延迟消息”功能
转载来源:http://cdbrznjsb.com/article/cdddcci.html

其他资讯

让你的专属顾问为你服务