秒杀系统设计(三)——动静分离改造

531 阅读2分钟

这是我参与2022首次更文挑战的第11天,活动详情查看:2022首次更文挑战

前言

我们了解了动静分离的概念,以及为什么要进行动静分离的理由,那么我们怎么进行动静分离呢?

动静分离改造

我们需要考虑以下的几种要素,我们通过典型的商品详情页面来进行分析。

URL唯一化

商品详细页面的话可以很自然的做到这一特性,我们可以根据商品的唯一ID来进行标识,那么 item.xxx.com/item.htm?id… 就可以作为唯一的 URL 标识。这样我们在缓存整个HTTP连接时,就可以以URL作为换成的KEY值,进行唯一区分。

分离浏览者相关的因素

浏览者相关的因素包括是否已登录,以及登录身份等,这些相关因素我们可以单独拆分出来,通过动态请求来获取。

分离时间因素

服务端输出的时间也通过动态请求获取。

异步化地域因素

详情页面上与地域相关的因素做成异步获取的方式,也可以通过动态请求获取。在这个要素下,异步获取会更加合适的。

去掉Cookie

服务端输出的页面包含的 Cookie 可以通过代码软件来删除,Web 服务器 Varnish可以通过 unset req.http.cookie 命令去掉 Cookie。注意,这里说的去掉 Cookie 并不是用户端收到的页面就不含 Cookie了,而是说,在缓存的静态数据中不含有Cookie。

分离之后

当我们将动态内容分离出来后,组织这些页面会非常重要,如果很多的动态内容会被页面的中的其他模块使用到,例如判断该用户是否已登录、用户 ID 是否匹配等,我们这时候应该将这些信息使用JSON格式进行组织。方便前端进行数据的获取。

动态内容处理方案

我们使用缓存的方式处理静态数据,那么动态内容的处理方式通常有以下两种:

  1. ESI(Edge Side Includes)方案:即在 Web 代理服务器上做动态内容请求,并将请求插入到静态页面中,当用户拿到页面时已经是一个完整的页面了。这种方式对服务端性能有些影响,但是用户体验较好。

  2. CSI(Client Side Include)方案:单独发起一个异步 JavaScript 请求,以向服务端获取动态内容。这种方式服务端性能更佳,但是用户端页面可能会延时,体验稍差。

总结

以上就是我们做动静分离的改造的方式。