网站制作公司 顺的,企业展厅建设公司,做外包网站,辽宁建设工程招投标信息网需要解决的问题
瞬时流量的承接防止超卖预防黑产避免对正常服务的影响兜底方法
前端设计
利用 CDN 缓存静态资源#xff0c;减轻服务器的压力在前端随机限流按钮防抖#xff0c;防止用户重复点击
后端设计
Nginx 做统一接入#xff0c;进行负载均衡与限流用 sentinel 等…需要解决的问题
瞬时流量的承接防止超卖预防黑产避免对正常服务的影响兜底方法
前端设计
利用 CDN 缓存静态资源减轻服务器的压力在前端随机限流按钮防抖防止用户重复点击
后端设计
Nginx 做统一接入进行负载均衡与限流用 sentinel 等进行业务端限流服务拆分将秒杀功能拆分为独立的服务避免对现有服务产生影响秒杀数据的缓存使用分布式缓存或本地缓存方案需要缓存预热精准地库存扣减防止超卖风控识别黑产需要动态黑名单设置验证码防止脚本秒杀幂等设计防止重复下单兜底方案如果服务压力过大或者代码有漏洞直接关闭秒杀及时止损
业务手段
通过预约、预售等方式避免秒杀的高并发流量。
详细分析
一、瞬时流量的承接
1、 秒杀活动即将开始时用户会不断刷新页面前端资源的访问也会消耗大量的资源。可以把这部分压力给到 CDN 厂商。 2、 秒杀的大部分请求都是无效的可以在前端设置随机限流使部分请求直接返回失败。 3、 对于发出的请求再次通过 lvs、nginx、sentinel 层层限流。 4、 打到后端服务后可以利用分布式缓存Redis或本地缓存Caffeine承接读写。
二、库存扣减
库存扣减需要防止并发导致的超卖。常用的是通过乐观锁解决问题
update items set num num - 1 where id 1 and num 0;使用这个语句会产生热点行问题压测下性能不高。优化方式如下
数据库补丁优化。可以使用阿里云的 RDS结合 Inventory Hint 单行热点更新性能可达 3.1 万 TPS。原理简单来说就是会把相同行的修改请求分为一组仅组内第一条语句需要抢锁后续语句直接修改即可不需要再次查询仅需一次分组提交事务即可。库存拆分。将 1000 个库存拆分成 100 个小库存每个小库存内有 10 个库存。使用 redis lua 脚本控制库存的扣减。redis 扣减完毕后可以通过 MQ 发送一个异步消息把数据库中的库存扣掉实现最终一致性。如果 redis 操作成功 MQ 发送失败怎么办 为 MQ 设置死信队列、重试等机制 redis 扣减库存时记录日志如果 MQ 故障则检查日志进行补偿。