引子
最近接触了一个抽奖的项目,由于用户量比较大,而且第三方提供的认证接口并发量有限,为了保证服务的高可用性,所以对高并限制发有一定的要求。经过一系列研究和讨论,做出了以下一些优化方案。
需求分析
根据用户量和日活情况,估算出并发值在100左右,所以该项目的并发量就当在100上以,初期目标定为600-800
特定页面的并发量不超过300,为了保证不对第三方服务造成访问压力,特将并发控制在150以内
由于奖品数量有限,故得奖时,需要进行并发写入控制,防止奖品超发
实施步骤
前端方面
减少客户端访问次数。
使用CDN对网站的静态资源进行优化,可以答复静态请求次数。
抽奖结果一次性生成。
每个用户有有一次抽奖机会,但只能有一次中奖,其他两次随机弹出推荐产品。所以有一次抽奖中,只需要访问一次服务器的抽奖接口。
- 使用本地缓存。
将抽奖次数,是否中奖等信息记录在本地,避免超次抽奖和多余的服务器请求。例如,一旦该用户中过将,就不需要再访问服务器抽奖接口。
服务端优化
使用缓存
- 使用服务端缓存。
将页面和相关数据查询进行缓存,减少数据库访问次数。
部分业务逻辑异步处理
对于不需要实时处理的业务逻辑,压入队列,实现异步处理。例如优惠券的发放。
Nginx 优化
- 提高 Nginx 处理性能
使用 worker_processes
,worker_cpu_affinity
,worker_rlimit_nofile
, worker_connections
,open_file_cache
等命令,提高nginx的处理性能。
- Nginx 并发控制。
先看实例,如下:
1 | limit_req_zone $binary_remote_addr zone=req_ip:10m rate=40r/s; // #每个IP平均处理的请求频率为每秒40次 |
在这里,限制了每个IP的请求频率,限制了同一IP的并发连接数,限制了服务器的总连接数
- 使用 Docker 实现负载均衡
配置 nginx, 使用负载均衡
1 | upstream icontact_pool { |
如上,通过 Docker 启动多个处理请求的服务容器,在 nginx 中配置每个服务的地址,权重等信息,扩大请求的处理能力
- 其他服务器环境优化
例如,增加服务器配置(CPU,内存,带宽),如果是PHP, 开启 opcache, 并使用较新版本(php7+), 各种依赖尽量使用最新版本。
1 | zend_extension=opcache.so |