聊聊秒杀系统的设计(二)

31 阅读3分钟

前言

上一篇中提到了秒杀系统的几个要素,接下来我们逐个进行说明。这次要解决的是秒杀活动中的动静分离方案。分离后的数据处理就简单了许多。

一、动静分离是什么?

动静分离就是并不是传统意义的静态页面和动态页面,而是指是否需要根据发送请求的用户进行个性化数据的推送。举个例子,在访问一些商城时,会针对不同用户进行商品的推荐,那么这样的数据就是动态数据;商城中有一些热门的活动,会针对所有用户进行推送,那么这样的数据就是静态数据,尽管这里的数据是动态生成的。

二、优化静态数据:

首先,我们要做的就是优化静态数据,那就是通过缓存来提高静态数据的读取可以有效提高数据的访问,除此之外还要考虑将缓存服务根据业务需要放到用户本地或CDN上。如何实现缓存将会在后续提到,我们现在可以认为这里的缓存是一个Redis集群或其他缓存系统。

三、优化动态数据:

动态数据主要包括服务端的时间,用户数据等。我常用的方法是通过发起一个Ajax的异步请求,获取动态数据,这样做的缺点是页面存在延迟的话,体验不好。为了解决这个问题,可以通过提前在页面中的动态数据展示部分做一个插槽,类似vue中的slot,缓解数据加载中的突兀感。

四、选择适合的分离架构:

接下来要介绍两种分离架构,一种是秒杀活动不频繁,秒杀商品数量少的场景,一种是秒杀活动频繁,秒杀商品数量多的场景。这里说的两种架构需要结合自身业务作取舍,不要一味的追求高并发。

1.单机部署

这里提到的单机是将缓存在一台性能较高的实体机中进行分组,采用Hash算法。由于商品数量不多,缓存的命中率会大大提高。这既是有点也是缺点,提高命中的同时可能会存在缓存击穿的风险。在访问量较大时,可以通过修改缓存算法或添加相同的缓存分组来缓解。

单机部署有效的回避了分布式网络传输的问题,提高了缓存的命中率。这样做有效的降低了运维的复杂程度,对于没有分布式缓存系统的业务来说,是一个很好的选择。

2.缓存集群

在一些业务复杂、数据庞大的机构中,可以考虑建立独立的缓存系统,减少运维成本,提高复用。这样做的可以使开发人员将重心放在业务中,不需要考虑缓存数据的处理;同时可以通过zookeeper实现配置自动化;在不同秒杀活动中,共享内存,降低资源浪费。

除此之外,CDN的优化以后也会介绍。

五、缓存中的数据:

数据处理除了以上提到的动静分离,还需要进行隔离。这么做的原因是不能让秒杀活动影响了其他业务,在秒杀期间减少对其他业务资源的占用。要做到这一点,除了要进行系统隔离,还需要进行数据的隔离,就像我们上一篇中提到的,要有独立的数据存储。实现数据隔离的方式有很多种,可以根据区域划分、可以根据URL划分等。

总结

最重要的是设计适合自己的秒杀系统,切勿一味追求高并发。

后续文章中,会对其他技术环节细化,也会对不同技术技术场景对比,帮你设计出适合的秒杀系统。