支撑瞬间百万QPS的热点文章服务的设计

在我们的日常生活中,总是在一个不经意间就会出现一个大新闻,如某某一线明星出轨、某某明星官宣结婚、某某明星偷税漏税等等。这个都是我们粉丝或者吃瓜群众感兴趣的话题,一旦新闻被爆出之后,新闻平台(如微博、头条、腾讯新闻)都会在短时间内出现某个新闻点击量暴增,如果没有做好系统的应对措施就会出现短时间的大流量打垮平台服务器。

针对热点新闻的短时间大流量的请求,我们需要做相应的架构设计来支撑服务。

1、技术点——F re eMarker

FreeMarker 是一款模板引擎,即一种基于模板和要改变的数据, 并用来生成输出文本(如HTML网页)的通用工具。它是一个Java类库,程序员可以嵌入他们所开发产品的组件。

FreeMarker 和SpringBoot整合是很简单,这里就不在详细介绍了。

2、文章服务的设计

下图是我们从网上截取的文章

我们可以发现文章具有如下的特点:

(1)文章一般都是由文字和图片或者视频等组成的,可以理解成有固定的格式。

(2)文章一旦被发布之后,其内容是不可以再被修改的。

针对以上的特点,为了应对突增的流量,我们可以将文章内容使用FreeMarker模版引擎预先生成HTML文件,这样的优势在于客户端直接读取html文件并将文章内容展示出来,此时无需服务端或者客户端做数据查询和组装的工作,大大的提升了系统的性能。如下生成HTML文件的过程:

(1)文章内容预先使用FreeMarker生成HTML文件并上传到云服务器上。

(2)云服务器返回文件的地址给调用方。

(3)调用方接收到云服务器的文件存储地址后保存到文章服务的Mysql、缓存一份文章信息(包括文章的id、文章的文件地址URL)到redis中、发送一个文章数据到MQ中(用户广播数据到本地缓存中)

3、整体服务的设计

(1)运营人员发送热点文章,此时需要将发布好的热点文章制作成HTML并且上传到云服务器上,云服务器将文件的地址返回给服务端。

(2)服务端获取到文件的地址后,将文章的地址写入数据库中,还要做热点文章预热工作:文章的信息缓存到redis、文章的信息发送到MQ中,MQ通过广播的形式将文章数据写入到文章微服务中本地缓存上(主要目的是做多级缓存来保证请求不会直接打到数据库上)。

(3)用户通过客户端搜索或者直接点击热点的新闻,请求先通过 LVS 转发到 N ginx上,随后 N gi nx 转发到内部服务的网关上,网关最后将请求转发到文章微服务的集群的某台服务器上。请求到服务器上后,先使用sentinel来做服务的限流和降级保护,然后查询本地缓存,如果本地缓存无数据再访问redis,最保守的情况下redis无数据将请求数据库。将数据返回给网关、网管将数据返回到上层。

(4)客户端接收到数据后,通过文件的地址直接从云服务器上下载生成好的HTML文件做页面的展示。

总结:

针对热点文章,我们将文章使用模版引擎提前制作成HTML文件后上传到云服务器上,然后缓存热点文章数据到本地缓存和分布式缓存中;客户端请求过来之后直接在缓存中将数据(包括文章的URL地址)给到客户端。

2