> 백엔드 개발 > PHP 튜토리얼 > 最近折腾一个一元云购,碰到一个获取幸运号码问题发出来讨论一下。

最近折腾一个一元云购,碰到一个获取幸运号码问题发出来讨论一下。

WBOY
풀어 주다: 2016-06-06 20:13:01
원래의
1033명이 탐색했습니다.

取码(我这么称呼他)

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

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

$goods->save();
// 如果发生异常,回滚事务,退还已经取出的码到 Redis 中</code>
로그인 후 복사
로그인 후 복사

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

回复内容:

取码(我这么称呼他)

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

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

$goods->save();
// 如果发生异常,回滚事务,退还已经取出的码到 Redis 中</code>
로그인 후 복사
로그인 후 복사

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

解决:

  1. 在抛出异常的同时,将code放回库存,同时向支付网关返回错误信息,让网关进行重试;

  2. 控制并发量,若并发量很大且集中的话可以把你的业务逻辑放到MQ后进行;

问题:
若redis中存在数据,但是spop操作由于网络抖动$codes未获取到值,会造成购买失败退款,这样不太好吧。

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿