V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cevincheung
V2EX  ›  PHP

最近折腾一个类似一元云购的东西,碰到一个问题发出来共享讨论一下。

  •  
  •   cevincheung · 2016-04-02 12:49:11 +08:00 · 3265 次点击
    这是一个创建于 3194 天前的主题,其中的信息可能已经有所发展或是发生改变。

    取码(我这么称呼他)

    创建订单并支付完成后(创建订单不减“库存”),支付网关回调,走如下流程: 取订单号关联的所有第 X 期的商品和购买数量,然后循环取码

    
    foreach ($goods as &$good)
    {
        // 从 Redis 的一个 Sets 中取$number 个号码(随机)
        // SPOP 第二个参数在 3.2 才有
        $codes = \Redis::spop("code:".$good->id,$good->number);
        
        // 没码了(也就是卖完了) 返回 NULL
        if (!$codes)
        {
            // 这一期的商品执行退款操作到网站账户余额
            // 并删除
        }
        // 如果取的码的数量小于需求数量 也表示卖完了
        if (count($codes)<$good->number)
        {
            // 退回多余的支付款项到网站账户余额
        }
        
        $good->codes = $codes;
        
        // 创建购买完成订单数据记录 balabalabalabala
        // 记录已经售完的商品期数ID
        $finish_goods_ids = [....,.....,.....,.....];
    }
    if ($finish_goods_ids) {
        // 访问彩票接口获取下期开奖时间和彩票期数
        // 循环设置
        // 接口访问失败,前台友好提示,入故障队列
    }
    
    $goods->save();
    // 如果发生异常,回滚事务,退还已经取出的码到 Redis 中
    

    如果在高并发情况下, redis 已取出,最终异常又退回的。怎么保障其他支付结果仍能顺利的取到码?

    5 条回复    2016-04-02 13:24:48 +08:00
    publicAdmin
        1
    publicAdmin  
       2016-04-02 13:00:02 +08:00 via iPhone
    一元云购还有人折腾。。
    cevincheung
        2
    cevincheung  
    OP
       2016-04-02 13:07:55 +08:00
    zcg121314
        3
    zcg121314  
       2016-04-02 13:15:14 +08:00
    送钱的?
    dapang1221
        4
    dapang1221  
       2016-04-02 13:20:21 +08:00 via Android
    没明白。。什么叫发生异常?支付异常吗?取码不是发生在支付成功后的回调时吗,这时候如果能顺利取出码,说明已经付款且库存足够了,如果回调后没能取出码,说明库存不足,这时候退款或是开下一期。。如果实在要在取完后再退回,再把码 sadd 进去不就好了。。
    cevincheung
        5
    cevincheung  
    OP
       2016-04-02 13:24:48 +08:00
    @dapang1221 就是担心并发 如果并发上来了会不会发生这种情况:前一个取码成功,后面失败。同时后面的根本就取不到码。开新一期还是放在队列里执行吧。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1145 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 23:08 · PVG 07:08 · LAX 15:08 · JFK 18:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.