当前位置: 首页 > 后端技术 > PHP

基于Redis实现的延迟队列

时间:2023-03-29 23:03:11 PHP

delay-queue是基于Redis实现的延迟队列。参考有赞延迟队列设计实现项目地址应用场景。订单超过30分钟未付款,将自动关闭。,到期前3天发短信提醒猜猜支付宝异步通知间隔是怎么实现的(通知间隔频率一般为:2m,10m,10m,1h,2h,6h,15h)订单支付成功后,一个通知任务生成,放入消息队列。任务内容包括数组{0,0,2m,10m,10m,1h,2h,6h,15h}和通知次数N(这里N=1,即第一次)。消费算子从队列中取出任务,根据N为0获取对应的时间间隔,立即发送通知。第一次通知失败,N+=1=>2从2m的Array中获取间隔时间,加上2m的延迟时间任务进入延迟队列,任务内容仍然包括Array和N。第二次通知fails,N+=1=>3,取出对应的间隔时间10m,加入一个task到延迟队列,同上...第7次Notificationfailed,N+=1=>8,取出对应间隔时间15h,加入一个任务到延迟队列,同第8次通知失败,N+=1=>9,拿不到间隔时间,结束通知实现原理使用Redis的有序集合,成员为JobId,score是任务执行的时间戳,每秒扫描一次集合,取出执行时间小于等于当前时间的任务。依赖Redis运行./delay-queue-cdelay-queue.confHTTP服务器监听0.0.0.0:9277,Redis连接地址127.0.0.1:6379,数据库号1HTTP接口请求方式POST请求体和返回值均为json返回值{"code":0,"message":"添加成功","data":null}参数名称类型含义备注codeint状态码0:成功非0:失败messagestring状态描述信息dataobject,null附加信息添加任务地址/推送{"topic":"order","id":"15702398321","delay":3600,"ttr":120,"body":"{\"uid\":10829378,\"created\":1498657365}"}参数名称类型含义备注topicstringJob类型idstringJob唯一标识需要保证唯一的JobIDdelayintJob需要延迟时间,单位:秒ttrintJob执行timeout时间,单位:秒bodystringJob的内容是消费者做具体的业务处理。如果是json格式,需要转义。轮询队列获取任务。服务器将保持连接,直到队列中有任务或在180秒超时后返回。Task执行完成后,需要调用finish接口删除任务,否则任务会重复投递,消费者必须能够处理同一个任务的多次投递URL地址/pop{"topic":"order"}参数名类型含义备注topicstringJob类型queue有Task返回值{"code":0,"message":"操作成功","data":{"id":"15702398321","body":"{\"uid\":10829378,\"created\":1498657365}"}}队列为空返回值{"code":0,"message":"操作成功","data":null}删除任务URL地址/delete{"id":"15702398321"}参数名称类型含义备注idstringJob唯一标识完成的任务URL地址/finish{"id":"15702398321"}参数名称类型含义备注idstringJob唯一标识