秒杀系统的“核心”之快速返回信息
Posted 南京柯普瑞信息技术有限公司
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了秒杀系统的“核心”之快速返回信息相关的知识,希望对你有一定的参考价值。
对于秒杀系统而言,更快的返回信息是用户对系统的要求,也是系统架构的目标。
那么如何更快的返回信息呢?总结下来无非几点,传输的数据尽量少,需要获取的信息离用户尽量近。如果顺着这两点思路往下想,减少传输的数据就需要将数据做分离,将静态数据和动态数据做分离;让数据离用户更近一点,就是将数据放到离用户最近的服务器缓存中。
今天,我们主要讲第一个方案: 动静分离的页面设计。
01
秒杀页面的动静分离
静态数据:商品详情和订单的html、包括图片、CSS、基本功能和样式的JS文件。页面的URL提前用Hash算法生成,在秒杀前发布。
动态数据:用户权限验证、下单功能、秒杀开始时间的验证功能。另外这些动态数据中可能包含一些JS异步请求,虽然其功能是需要请求应用服务器的,但是承载这些功能的JS可以作为静态资源缓存起来的。
除了动静分离的设计以外,为了减少系统的冲击。并且杜绝机器人参与秒杀,在客户端也会设计一些问答或者滑块的功能,减少此类机器人对服务器的压力。
例如:商品信息页面的HTML和下订单需要JS文件。将这些文件提前放到CDN上面,当秒杀开始的时候用户就可以从最近的网路节点拿到这些资源了。
02
Nginx实现动静分离
nginx是目前用的比较多的负载均衡器,就以它为例给大家一个参考。假设有一个HTML页面,其中有静态和动态的数据。当用户通过改页面向服务器发送请求的时候,Nginx拦截请求后会分别将静态数据和动态数据路由到不同的服务器上。
如下,我们假设有一个JSP的页面。动态数据的部分通过Random函数请求服务器,静态数据只是显示一张图片“picture.png”。
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>
<title>TestPage</title>
</head>
<body>
<%
Random rand = new Random();
out.println("<h2>我是动态数据</h2>");
out.println(rand.nextInt(99));
%>
<h2>我是静态数据</h2>
<img src="picture.png" />
</body>
</html>
server {
listen 80;
server_name ds.com;
location / {
proxy_pass http://127.0.0.1:8000;
}
location ~* \.(png|jpg) {
root /staticResource;
}
}
03
静态数据进行缓存
如何对静态数据进行缓存?这里给大家介绍HTTP的缓存方式。
当用户通过浏览器请求服务器的时候,会发起HTTP请求,如果对每次HTTP请求进行缓存,那么可以减少应用服务器的压力。当第一次请求的时候浏览器本地缓存库没有缓存数据,会从服务器取数据,并且放到浏览器的缓存库中,下次再进行请求的时候会根据缓存的策略来读取本地或者服务的信息。
如图所示,客户端请求数据之前看本地缓存是否有数据,如果是第一次请求本地没有缓存数据,会向服务器请求。如果已经缓存了数据会从本地缓存获得数据直接返回。
一般信息的传递通过HTTP请求头 Header 来传递。聊聊目前比较常见的对比缓存。
对比缓存
需要对比前后两次的缓存标志来判断是否使用缓存。浏览器第一次请求时,服务器会将缓存标识与数据一起返回,浏览器将二者备份至本地缓存库中。浏览器再次请求时,将备份的缓存标识发送给服务器。
服务器根据缓存标识进行判断,如果判断数据没有发生变化,把判断成功的304状态码发给浏览器。这时浏览器就可以使用缓存的数据来。服务器返回的就只是Header,不包含Body。下面介绍两种标识规则。
Last-Modified规则
如图所示,在客户端第一次请求的时候,服务器会返回资源最后的修改时间,记作Last-Modified。客户端将这个字段连同资源缓存起来。Last-Modified被保存以后,在下次请求时会以Last-Modified-Since字段被发送。
当客户端再次请求服务器时,会把Last-Modified连同请求的资源一起发给服务器,这是Last-Modified会被命名为If-Modified-Since,存放的内容都是一样的。
服务器收到请求,会把If-Modified-Since字段与服务器上保存的Last-Modified字段作比较。
若服务器上的Last-Modified最后修改时间大于请求的If-Modified-Since,说明资源被改动过,就会把资源(包括Header +Body)重新返回给浏览器,同时返回状态码200;若资源的最后修改时间小于或等于If-Modified-Since,说明资源没有改动过,只会返回Header,并且返回状态码304。浏览器接受到这个消息就可以使用本地缓存库的数据。
ETag规则
客户端第一次请求的时候,服务器会给每个资源生成一个ETag标记。这个ETag是根据每个资源生成的唯一Hash串,资源如何发生变化ETag随之更改,之后将这个ETag返回给客户端,客户端把请求的资源和ETag都缓存到本地。ETag被保存以后,在下次请求时会当作If-Noe-Match 字段被发送出去。
在浏览器第二次请求服务器相同资源时,会把资源对应的ETag一并发送给服务器。在请求时ETag转化成If-None-Match,但其内容不变。服务器收到请求后,会把 If-None-Match与服务器上资源的ETag进行比较。
如果不一致,说明资源被改动过,则返回资源(Header+Body),返回状态码200;如果一致,说明资源没有被改过,则返回Header,返回状态码304。浏览器接受到这个消息就可以使用本地缓存库的数据。
注意:ETag和If-None-Match指的是同一个值,只是在客户端和服务器端的叫法不同。
在承载大流量高并发系统的时候,通常会采用服务器集群的策略,负载均衡的技术是必不可少的,同时针对秒杀系统流量的控制和过滤也会在这里使用。
柯普瑞企业IT学院
企业使命:
为员工创造价值,为客户创造价值,为社会创造价值,为推动全社会进步而努力!
企业愿景:
成为中国一流的企业IT人才培养解决方案提供商!
南京校区:南京市中山东路300号
长发中心A栋23楼
杭州校区:杭州市文晖路46号
现代置业大厦西楼10层
学院网址:www.china-esp.com
以上是关于秒杀系统的“核心”之快速返回信息的主要内容,如果未能解决你的问题,请参考以下文章