Java 秒杀系统的设计,秒杀中的削峰,秒杀中的服务性能优化

news 投稿 1500 0 评论

一、秒杀中的削峰

犹豫服务器的处理资源是恒定的,用或者不用它的处理能力都是一样的,出现峰值的话,很容易导致忙到处理不过来,闲的时候却又没有什么要处理。为了保证服务质量,很多处理资源只能按照忙时预估,而这会导致资源浪费。 削峰可以让服务端处理变得更加平稳,还可以节省服务器的资源成本。针对秒杀这一场景,削峰从本质上来说就是更多地延缓用户请求的发出,以便减少和过滤掉一些无效请求。

1.消息队列

其中最容易想到的解决方案就是用消息队列来缓冲瞬时流量,把同步的直接调用转换成异步的间接推送,通过队列在一端承接瞬时的流量洪峰,在另一端平滑地将消息推送出去,在这里,消息队列就像“水库"一样,拦蓄上游的洪水,削减进入下游的洪峰流量。

2.答题器

添加答题器第一个目的是防止部分买家使用秒杀器在参加秒杀时作弊,第二个目的就是延缓请求,起到削峰的作用。把请求的时间从瞬时延长到了几秒,这样会大大减轻对服务器的压力。而且后续请求到达服务器时已经没有库存了,真正的并发处理就很有限了。

3.数据过滤

这里提到的数据过滤有点像某些企业在招聘时,把简历随机抽出一部分扔掉一样,只不过抽取的过程可以设置一定的规则,过滤掉那些无效的请求。在不同的处理层根据不同的规则有效的过滤,例如对写数据进行基于时间的合理分片,过滤掉过期的失效请求;对写数据进行强一致性校验,只保留最后有效的数据。

二、秒杀中的服务性能优化

服务端性能, 一般用QPS来衡量, 还有一个和QPS息息相关的是响应时间, 它可以理解为服务器处理响应的耗时。

这个两个因素到底会造成什么样的影响?首先, 我们先来看看响应时间和QPS的关系,对于大部分的Web系统而言响应时间一般都是由CPU执行时间和线程等待时间组成,也许你会说为什么不去减少这种等待时间,其实减少线程等待时间对提升性能的影响没有我们想象得那么大, 这点在很多代理服务器上可以做验证,如果代理服务器本身没有CPU消耗, 我们在每次给代理服务器代理的请求加个延时, 即增加响应时间,这对代理服务器本身的吞吐量并没有多大的影响,因为代理服务器本身的资源并没有被消耗。

对于Java系统可优化的地方很多,除了常见的代码优化外,以下的内容值得注意。

针对这些请求, 我们可以使用以下手段进行优化:

2.数据输出时推荐使用JSON而不是模板引擎来输出页面。

像商品中的标题和描述这些本身不变的数据,会在秒杀开始之前全量推送到缓存直到到秒杀结束。

编程学习分享 » Java 秒杀系统的设计,秒杀中的削峰,秒杀中的服务性能优化

赞 (0) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽

高效,专业,符合SEO

联系我们