java高并发秒杀方案

秒杀场景

秒杀场景:高并发,大流量,有限库存,有限时间;此时需要保证系统的高可用,防止系统崩溃。

秒杀场景下处理的问题

1.限流:根据压测系统瓶颈,进行限流,在nginx层面,网关层面,接口层面。

2.动静分离:静态资源增加cdn进行缓存,评估网络带宽,减少非必要请求,活动开始前预取下cdn。

3.优化服务节点数量:根据秒杀特点,增大活动服务的节点数量,评估各服务耦合情况,不要出现单点服务,核心服务(网关服务,认证服务,订单服务)根据压测评估,提高服务节点。

4.如果使用的是云服务,且使用了云服务厂商提供的动态负载均衡等类似功能,则需设置云服务中的真实ip透传,否则用户真实ip无法到达nginx及服务层面,对后续ip相关操作,造成影响。

5.降低线上服务的日志级别,不要将线上服务日志级别调成debug,线上日志调成info,防止日志过多造成硬盘使用过大,日志文件过大会影响服务系统。

6.秒杀场景下,将核心秒杀逻辑尽量使用缓存,不要直接交互数据库,在活动开始前,将秒杀相关的商品信息预取到缓存中,商品详情,商品数量,价格日历等信息,提前入缓存,并根据使用场景可采用分布式锁,或者lua脚本等形式,在缓存层面去处理库存。

7.核心日志尽量入库,不要同步入库,与主业务流程无关的数据,埋点数据,日志数据,短信功能等采用异步入库的方式,要合理配置线程池,合理配置最大线程数,核心线程数,等待时间,等待队列,丢弃策略;如果是核心业务,丢弃策略尽量自定义化处理。

8.秒杀页面中接口尽量精细化,没必要的接口尽量砍掉,页面尽量不要使用图片,如果有尽量压缩,秒杀时间可通过nginx拿到。

9.在mysql的主从同步上,开启mysql的多线程同步,不要使用mysql的默认单线程同步,高并发时单线程同步会造成同步不及时,核心逻辑不要走从库,核心逻辑尽量走主库查询,如果逻辑复杂的查询,则可以放到程序中处理。

10.做好防重策略,前台限制,后台也要做限制,具体方式可借助redis实现根据请求参数和路径token生成key值放入redis中,如果在多少秒内存在则不处理请求。

11.如果服务上云,可购买web防护产品,来防止ddos等攻击,如果没有则可以在nginx根据ip来进行,ip封禁,也可以在应用层面进行防护,建议购买成熟化防护产品。

12.项目中对线上web服务器,中间件,es,消息队列,redis要对核心参数进行调优。着重关注根据服务能力,进行内存,最小线程,最大线程,连接数,等待队列等核心参数调优。

13.如果秒杀业务中涉及到与第三方系统数据传递,且是核心数据交互,要评估第三发服务能力,根据第三发服务能力来进行设计,如果数据要保持强一致性,则需要根据第三方服务来做定制限流,也可异步化操作,这里可使用mq消息的队列进行消息传递,进行解耦,数据传递过程要有交互的中间状态进行标识。

14.提高业务门槛来增大用户群体,比如加验证码,答题,前台在3秒内随机发送请求,都可以达到服务更多用户的目的。

你可能感兴趣的:(java,开发语言)