小电商的延时队列设计概要

zithan · · 72 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
基于Redis实现的延迟队列

应用场景

  • 未支付订单定时取消关闭
  • 检测退款的订单的第三方退款状态
  • 余额支付回调(通知概率=2n+n)
  • 订单15天后自动评价
  • ......

设计实现

传统实现

  • 使用redis的特性实现,对普通的传统扫表优化

设计目标

  • 可靠性:延迟队列保证被消费一次

系统结构及实现要点

  • job(json{uuid,job_id,job_name,job_data})

    • 关闭未支付的订单
    • 检测第三方退款状态
    • 余额支付回调
  • 延迟队列(redis的zset)

    1. 结构:score:过期时间戳;value:job_id
    2. 轮询延迟队列,将分发到各个消息队列

      1. value = zrangebyscore(key, 0,now_time, start=0, num=1)
      2. 如果value空值,则sleep(1)
      3. 如果value非空,则取出value,result = zrem(key, value)

        1. 如果result为真,则rpush相关的队列
  • 执行消息队列(reidis的list)

    • 关闭未支付的订单
    • 检测第三方退款状态
    • 余额支付回调

本文来自:Segmentfault

感谢作者:zithan

查看原文:小电商的延时队列设计概要

72 次点击  
加入收藏 微博
0 回复
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet