秒杀功能
nginx 转发配置
背景
在秒杀活动功能点上,后端服务并不是单机完成,有多个服务集群部署,解决大量请求,前端统一请求到ngixn,有nginx做代理转发,负载均衡,默认轮询策略。
秒杀主要使用技术
nginx + springboot + redis + lua + LinkedBlockingDeque + 锁 + mysql
初始化:定时任务 LTS 初始化数据到redis中
秒杀:lua 脚本 +redis 保证预减库存的原子性 以及快速响应用户
队列:秒杀成功的记录 在缓存中 以及队列中 进行异步处理 ,加锁保证DB数据库减库存以及秒杀成功日志下单成功 一致性
nginx配置文件
#简单配置
#user nobody;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
##
# Gzip 压缩配置
##
#是告诉nginx采用gzip压缩的形式发送数据。这将会减少我们发送的数据量。
#gzip on;
#为指定的客户端禁用gzip功能。我们设置成IE6或者更低版本以使我们的方案能够广泛兼容。
#gzip_disable "msie6";
# 命名不要用下划线 400异常
upstream backstage-ant {
#weight=3 权重 max_fails=5 重试次数 fail_timeout=10s 超时时间
server localhost:8083; # 后端本地服务及端口
server localhost:8082;
server localhost:8080;
}
server {
listen 8088;
server_name backstage_ant.com;
location / {
# 转发的地址 与upstream 的命名一致
proxy_pass http://backstage-ant;
#Proxy Settings
proxy_http_version 1.1;
proxy_set_header X-Client-IP $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
秒杀功能压测
压测工具:jmeter
测重点:
后端服务为集群部署
是否能保证秒杀高并发请求
是否能避免超卖问题
队列是否处理秒杀成功记录
数据库是否生成订单
以及秒杀成功记录,减库存
秒杀大致流程图(只考虑了部分问题)
springboot 本地启动多个相同服务
工具:idea