记一次抢购的实践(2016.11.23)

因为是极速开发然后上线,没压测不知道,一压测发现bug一堆,只记录一下本次秒杀从找问题到上线的过程(线上阿里云8核16G压测780并发压测1分钟结果喜人)

  1. php-fpm进程数不够

主要是pm.max_children和pm.max_requests
#pm.max_children 子进程最大数
#pm.max_requests  设置每个子进程重生之前服务的请求数. 对于可能存在内存泄漏的第三方模块来说是非常有用的. 如果设置为 '0' 则一直接受请求. 等同于 PHP_FCGI_MAX_REQUESTS 环境变量. 默认值: 0.
参考: http://www.cnblogs.com/argb/p/3604340.html
  1. PDO连接时间过短,PDO::ATTR_TIMEOUT

#PDO::ATTR_TIMEOUT  设置连接数据库的超时秒数。
参考: http://www.runoob.com/php/php-pdo-constants.html
  1. Nginx连接数调整

#worker_rlimit_nofile   65535
此选项依赖于Linux系统的最大打开文件数:ulimit -n 65535
参考:http://blog.chinaunix.net/uid-20662363-id-3051474.html
  1. 如果不用队列比如用我们目前的方式应该是先减库存,如果成功了再去下单,否则直接返回抢购失败,减库存代码

$key = 'goods:13';  //13为商品id
$incr = $redis->incrby($key, -1);
return $incr>=0 ? true : false;    //true:减库存成功代表可以继续下单
  1. 后续工作

  1. 抢购完成后商品的库存应该是负很多,是一个很大的负数,此时如果取消订单回复库存应该有单独的逻辑/代码来处理
  2. 抢购商品是否需要分开,抢购商品需要走单独的接口,如果遇到大促需要给抢购集群临时加机器
  1. 收获

  1. redis做为简单缓存,存储数组、对象等内容可以用msgpack代替json、serialize
  2. 开发、测试环境如果用同一个redis 则可以切换不同的db
  3. phpredis的使用可以
    参考:https://www.zybuluo.com/a5635268/note/265296
    或者:https://github.com/phpredis/phpredis

你可能感兴趣的:(记一次抢购的实践(2016.11.23))