高可用架构设计(3) -电商商品详情页缓存背景及框架说明

Github

0 导读

我们这个教程,基于hystrix,如何来构建高可用的分布式系统的架构,项目实战

模拟真实业务的这么一个小型的项目,来全程贯穿,用这个项目中的业务场景去一个一个的讲解hystrix高可用的每个技术

纯讲hystrix,脱离实际的业务背景,听起来有点枯燥,大家学完了hystrix以后,可能没法完全感受到技术是如何融入我们的项目中的

大背景:电商网站,首页,商品详情页,搜索结果页,广告页,促销活动,购物车,订单系统,库存系统,物流系统

小背景:商品详情页,如何用最快的结果将商品数据填充到一个页面中,然后将页面显示出来

分布式系统:商品详情页,缓存服务,+底层源数据服务,商品信息服务,店铺信息服务,广告信息服务,推荐信息服务,综合起来组成一个分布式的系统

1 电商网站的商品详情页系统架构

1.1 小型电商网站的商品详情页系统架构(非重点)

1.2 大型电商网站的商品详情页系统架构

大型电商网站商品详情页的系统设计中,当商品数据发生变更时,会将变更消息压入消息队列中。

缓存服务从消息队列中消费这条消息时,感知到有数据发生变更,便通过调用数据服务接口,获取变更后的数据,然后将整合好的数据推送至 redis 中。

Nginx 本地缓存的数据是有一定的时间期限的,比如说 10 分钟,当数据过期之后,它就会从 redis 获取到最新的缓存数据,并且缓存到自己本地。

用户浏览网页时,动态将 Nginx 本地数据渲染到本地 html 模板并返回给用户。

虽然没有直接返回 html 页面那么快,但是因为数据在本地缓存,所以也很快,其实耗费的也就是动态渲染一个 html 页面的性能。如果 html 模板发生了变更,不需要将所有的页面重新静态化,也不需要发送请求,没有网络请求的开销,直接将数据渲染进最新的 html 页面模板后响应即可。

在这种架构下,我们需要保证系统的高可用性。

如果系统访问量很高,Nginx 本地缓存过期失效了,redis 中的缓存也被 LRU 算法给清理掉了,那么会有较高的访问量,从缓存服务调用商品服务。但如果此时商品服务的接口发生故障,调用出现了延时,缓存服务全部的线程都被这个调用商品服务接口给耗尽了,每个线程去调用商品服务接口的时候,都会卡住很长时间,后面大量的请求过来都会卡在那儿,此时缓存服务没有足够的线程去调用其它一些服务的接口,从而导致整个大量的商品详情页无法正常显示。

这其实就是一个商品接口服务故障导致缓存服务资源耗尽的现象。

1.3 页面模板

举个例子

将数据动态填充/渲染到一个html模板中,是什么意思呢?

<html>
	<title>#{name}的页面</title>
	<body>
		商品的价格是:#{price}
		商品的介绍:#{description}
	</body>
</html>

上面这个就可以认为是一个页面模板,里面的很多内容是不确定的,#{name},#{price},#{description},这都是一些模板脚本,不确定里面的值是什么?

将数据填充/渲染到html模板中,是什么意思呢?

{
	"name": "iphone7 plus(玫瑰金+32G)",
	"price": 5599.50
	"description": "这个手机特别好用。。。。。。"
}

<html>
	<title>iphone7 plus(玫瑰金+32G)的页面</title>
	<body>
		商品的价格是:5599.50
		商品的介绍:这个手机特别好用。。。。。。
	</body>
</html>

上面这个就是一份填充好数据的一个html页面

2 缓存服务

缓存服务,订阅一个MQ的消息变更,如果有消息变更的话,那么就会发送一个网络请求,调用一个底层的对应的源数据服务的接口,去获取变更后的数据

将获取到的变更后的数据填充到分布式的redis缓存中去

高可用这一块儿,最可能出现说可用性不高的情况,是什么呢?

就是说,在接收到消息之后,可能在调用各种底层依赖服务的接口时,会遇到各种不稳定的情况

比如底层服务的接口调用超时,200ms,2s都没有返回; 底层服务的接口调用失败,比如说卡了500ms之后,返回一个报错

在分布式系统中,对于这种大量的底层依赖服务的调用,就可能会出现各种可用性的问题,一旦没有处理好的话

可能就会导致缓存服务自己本身会挂掉,或者故障掉,就会导致什么呢?

不可以对外提供服务,严重情况下,甚至会导致说整个商品详情页显示不出来

缓存服务接收到变更消息后,去调用各个底层依赖服务时的高可用架构的实现

我们刚才讲解的整套大型电商网站的商品详情页的缓存架构,完整的那个流程,《亿级流量电商详情页系统的大型高并发与高可用缓存架构实战》

3 框架结构

围绕着缓存服务去拉取各种底层的源数据服务的数据,调用其接口时,可能出现的系统不可用的问题

从简

spring boot,微服务的非常快速,非常好用的技术框架,脱胎于spring,具体的东西就不讲解,直接带着大家上手搭建一个spring boot的框架

2个服务,缓存服务,商品服务,缓存服务依赖于商品服务

模拟各种商品服务可能接口调用时出现的各种问题,导致系统不可用的场景,然后用hystrix完整的各种技术点全部贯穿在里面

解决了一大堆设计业务背景下的系统不可用问题,hystrix整个技术体系,知识体系,也就讲解完了

消息队列,redis,咱们都不搞了

spring boot + http client + hystrix

参考

  • 《Java工程师面试突击第1季-中华石杉老师》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏凯哥Java

Maven 的聚合(多模块)和 Parent 继承

即使是长期从事 Maven 工作的开发人员也不能完全掌握聚合(多模块)和 Parent 继承的关系,在使用多模块时,子模块总要指定聚合的 pom 为 <pare...

1.4K30
来自专栏Modeng的专栏

Vue手把手带你撸项目系列之动态面包屑

面包屑应该是我们在项目中经常使用的一个功能,一般情况下它用来表示我们当前所处的站点位置,也可以帮助我们能够更快的回到上个层级。

20020
来自专栏编程微刊

收集了一些免费的api接口

今天收集了一些免费的api接口,你们想要的,基本都可以在这里面找到,之后就不需要在网站上继续找了,这一篇就足够啦,目前还没有一个个的测试,后面有时间会筛选一些比...

3.3K50
来自专栏凯哥Java

SVN+nginx配置(亲试)

在《svn安装(亲试)》和《nginx搭建(亲试)》两篇文章中。已经分别介绍了SVN和nginx搭建。

42160
来自专栏dylanliu

SpringMVC 同一个方法返回Json与HTML数据的小trick

项目改造过程中,发现有一个类,在出错情况下就返回Json数据,在正常情况下就返回HTML页面,在返回Json数据情况是直接往response的writer中写入...

16530
来自专栏dylanliu

Linux shell 多进程和文件队列处理任务

用一个shell脚本遍历需要拉取的机器和需要拉取天数的日志(两者可配置),通过scp命令将应用服务器上的日志拉取到日志服务器上,然后压缩存盘。再将过期的日期删除

17830
来自专栏finleyMa

Angular 实现一个 Dialog 组件

这里有一个细节是base-dialog的z-index一定要大于overlay的,已保证dialog能显示在遮盖层上方。

14620
来自专栏知识分享

16-ESP8266 SDK开发基础入门篇--TCP 服务器 非RTOS运行版,串口透传

https://www.cnblogs.com/yangfengwu/p/11105466.html

22030
来自专栏木二天空

004.MySQL双主+Keepalived高可用

安装参考:http://www.cnblogs.com/007sx/p/7083143.html

11550
来自专栏Android必知必会

基于Bootstrap的Metro风格模板

版权声明:本文为[他叫自己Mr.张]的原创文章,转载请注明出...

14520

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励