微服务架构中多级缓存设计

news2024/9/17 1:10:16

一.Nginx 缓存管理

在 Nginx 中自带将后端应用中图片、CSS、JS 等静态资源缓存功能,
我们只需在 Nginx 的核心配置 nginx.conf 中增加下面的片段,
便可对后端的静态资源进行缓存,关键配置我已做好注释,
可以直接使用;

# 设置缓存目录
# levels代表采用1:2也就是两级目录的形式保存缓存文件(静态资源css、js)
# keys_zone定义缓存的名称及内存的使用,名称为babytun-cache ,在内存中开始100m交换空间
# inactive=7d 如果某个缓存文件超过7天没有被访问,则删除
# max_size=20g;代表设置文件夹最大不能超过20g,超过后会自动将访问频度(命中率)最低的缓存文件删除
proxy_cache_path d:/nginx-cache levels=1:2 keys_zone=babytun-cache:100m inactive=7d max_size=20g;

#配置xmall后端服务器的权重负载均衡策略
upstream xmall {
    server 192.168.31.181 weight=5 max_fails=1 fail_timeout=3s;
    server 192.168.31.182 weight=2;
    server 192.168.31.183 weight=1;
    server 192.168.31.184 weight=2;
}

server {
  #nginx通过80端口提供Web服务
  listen 80;
  # 开启静态资源缓存
  # 利用正则表达式匹配URL,匹配成功的则执行内部逻辑
  # ~* 代表URL匹配不区分大小写
  location ~* \.(gif|jpg|css|png|js|woff|html)(.*){
    # 配置代理转发规则
    proxy_pass http://xmall;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_cache xmall-cache;
    #如果静态资源响应状态码为200(成功)  302(暂时性重定向)时 缓存文件有效期1天
    proxy_cache_valid 200 302 24h;
    #301(永久性重定向)缓存保存5天
    proxy_cache_valid 301 5d;
    #其他情况
    proxy_cache_valid any 5m;
    #设置浏览器端缓存过期时间90天
    expires 90d;
  }

  #使用xmall服务器池进行后端处理

  location /{
    proxy_pass http://xmall; 
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}

增加上面配置后,每一次通过 Nginx 访问应用中新的静态文件时,
在 Nginx 服务的缓存目录便会生成缓存文件,在缓存有效期内该静态资源的请求便不再送到后端服务器,而直接由 Nginx 读取本地缓存并返回。

二.分布式缓存服务

在架构设计时,很多新架构师一听到缓存,
下意识认为增加 Redis 分布式缓存服务器就够了,其实这是片面的做法。在缓存架构设计时,
一定要按照由近到远、由快到慢的顺序进行逐级访问。假设在电商进行商品秒杀活动时,
如果没有本地缓存,所有商品、订单、物流的热点数据都保存在 Redis 服务器中,
每完成一笔订单,都要额外增加若干次网络通信,
网络通信本身就可能由于各种原因存在通信失败的问题。
即便是你能保证网络 100% 可用,
但 Redis 集群承担了来自所有外部应用的访问压力,
一旦突发流量超过 Redis 的负载上限,整体架构便面临崩溃的风险。
因此在 Java 的应用端也要设计多级缓存,我们将进程内缓存与分布式缓存服务结合,
有效分摊应用压力。在 Java 应用层面,
只有 EhCache 的缓存不存在时,再去 Redis 分布式缓存获取,
如果 Redis 也没有此数据再去数据库查询,
数据查询成功后对 Redis 与 EhCahce 同时进行双写更新。
这样 Java 应用下一次再查询相同数据时便直接从本地 EhCache 缓存提取,
不再产生新的网络通信,应用查询性能得到显著提高。

在这里插入图片描述

保障缓存一致性

但事无完美,当引入多级缓存后,我们又会遇到缓存数据一致性的挑战,以下图为例:
在这里插入图片描述

我们都知道作为数据库写操作,是不通过缓存的。
假设商品服务实例1将1号商品价格调整为80元,
这会衍生一个新问题:如何主动向应用程序推送数据变更的消息来保证它们也能同步更新缓存呢?
相信此时你已经有了答案。
没错,我们需要在当前架构中引入 MQ 消息队列,
利用 RocketMQ 的主动推送功能来向其他服务实例以及 Redis 缓存服务发起变更通知。
在这里插入图片描述

如上图所示,在商品服务实例 1 对商品调价后,
主动向 RocketMQ Broker 发送变更消息,Broker 将变更信息推送至其他实例与 Redis 集群,
这些服务实例在收到变更消息后,在缓存中先删除过期缓存,再创建新的数据,以此保证各实例数据一致。

在我看来,有三种情况特别适合引入多级缓存。

第一种情况

缓存的数据是稳定的。例如邮政编码、地域区块、
归档的历史数据这些信息适合通过多级缓存减小 Redis 与数据库的压力。

第二种情况

瞬时可能会产生极高并发的场景。例如春运购票、双 11 零点秒杀、股市开盘交易等,
瞬间的流量洪峰可能击穿 Redis 缓存,产生流量雪崩。这时利用预热的进程内缓存分摊流量,减少后端压力是非常有必要的。

第三种情况

一定程度上允许数据不一致。例如某博客平台中你修改了自我介绍这样的非关键信息,
此时在应用集群中其他节点缓存不一致也并不会带来严重影响,
对于这种情况我们采用 T+1 的方式在日终处理时保证缓存最终一致就可以了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/417424.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

同源策略与跨域

同源:协议、域名、端口号 必须完全相同。 违背同源策略就是跨域。 例如: 协议:http或者是https 域名:www.xxx.com 端口号:80,8000等。 同源:同一个来源。 同源:可以直接简写服务器页面的地址。…

激活数字营销新引擎,亚马逊云科技为企业带来数字化营销新体验

随着流量红利逐渐消失,营销触点呈现多元化,消费者决策变得复杂,利用数字化激活新的营销引擎成为破局关键。亚马逊云科技联合合作伙伴,基于智能湖仓打造了4个解决方案领域:一方数据平台、客户数字体验、广告智能分析、隐…

工具-win11系统,微软自带输入法输入“sj” 显示时间 【2022年01月11日 10:16:49】格式

文章目录1、前提2、操作3、碎碎念4、更新 2023年04月13日1、前提 下载某某输入法,输入“sj” 会自动显示【2023-04-11 09:57:01 】这样的格式,微软自带的输入法是显示【09点57分】的格式,但是由于个人工作学习需要,所以前者的键入…

FreeRTOS 任务调度及相关函数详解(二)

文章目录一、任务创建函数 xTaskCreate()二、任务初始化函数 prvInitialiseNewTask()三、任务堆栈初始化函数 pxPortInitialiseStack()四、添加任务到就绪列表 prvAddNewTaskToReadyList()五、任务删除 vTaskDelete()六、任务挂起 vTaskSuspend()七、任务恢复 vTaskResume()一、…

shadow机械手臂系统

机械手臂系统 Shadow机械手臂系统是由美国Shadow Robot Company开发的一款高精度机械手臂系统,主要用于工业自动化、医疗器械、科学研究等领域。Shadow机械手臂系统采用了多自由度的设计,可以实现高精度的三维运动和灵活的操作,其控制系统还支…

ds18b20-温度传感器-linux驱动-混杂设备

文章目录ds18b20读取温度数据步骤ds18b20时序图:初始化时序DS18B20初始化时序的步骤:读/写时序DS18B20写步骤:DS18B20读步骤:DS18B20驱动实现结果如下:参考:ds18b20读取温度数据步骤 初始化:将…

对话ChatGPT:Prompt是普通人“魔法”吗?

在ChatGPT、Midjourney、Stable Diffusion等新事物的作用下,不少人或多或少听说过Prompt的概念。 虽然OpenAI掀起的大模型浪潮再度刷新了人们对AI的认知,但现阶段的AI终归还不是强人工智能,大模型里的“知识”存储在一个隐性空间里&#xff0…

工地高空作业安全带穿戴识别 python

工地高空作业安全带穿戴识别系统通过pythonopencv网络模型分析技术,工地高空作业安全带穿戴识别算法模型对现场监控画面中人员安全绳安全带穿戴进行检测,不需人为干预立即触发告警存档。OpenCV的全称是Open Source Computer Vision Library,是…

【Ruby 2D】【unity learn】抬头显示血条

说起游戏开发,大家一般会觉得控制角色移动和制作血条哪个难呢? 或许都会觉得血条比较难吧。 是的,正是如此。 那么我们让我们来看看血条该怎么做吧 这是效果图 受伤后是这样的 首先是创建一张Canvas画布 这个画布会很大 相比之下我们的小…

【redis】BigKey

【redis】BigKey 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章…

ChatGPT云桌面:无需科技挂载,即点即用

ChatGPT是一个由OpenAI开发的人工智能对话语言模型。它被设计为对话式人工智能代理,用于客户服务、个人助理和文娱等任务。它可以理解并生成多种语言的文本,包括中文、英语、西班牙语、德语等。但从某些地方访问ChatGPT可能很困难,特别是在注…

实验4 Matplotlib数据可视化

1. 实验目的 ①掌握Matplotlib绘图基础; ②运用Matplotlib,实现数据集的可视化; ③运用Pandas访问csv数据集。 2. 实验内容 ①绘制散点图、直方图和折线图,对数据进行可视化; ②下载波士顿数房价据集,并…

机器学习 -- 过拟合与欠拟合以及应对过拟合的方法 神经网络中的超参数如何选择

前言 在学习机器学习的过程中,训练模型时常遇到的问题就是模型的过拟合和欠拟合,下文我将解释过拟合和欠拟合的概念,并且学习应对过拟合以及神经网络中的超参数如何选择的方法。 过拟合和与欠拟合 过拟合:是指学习时选择的模型…

基于 Git 的开发工作流——主干开发特性总结

在参与开发的过程,得益与平台提供便捷的开发流程,简化很多开发过程操作分支的步骤;也就很好奇,为什么研发平台怎么设计,考虑的点是为什么,便有了这次对主干研发的学习与记录。当我们是构建软件项目的唯一开…

【计算机网络-传输层】TCP 协议

文章目录1 传输层概述1.1 传输层的功能1.2 端口号2 TCP 报文段2.1 TCP 报文段首部格式2.2 TCP 数据传送的过程3 TCP 连接管理3.1 TCP 连接的建立——三次握手3.1.1 客户机向服务器发送 TCP 连接请求报文段3.1.2 服务器向客户机发送 TCP 连接请求确认报文段3.1.3 客户机向服务器…

python数据可视化玩转Matplotlib subplot子图操作,四个子图(一包四),三个子图,子图拉伸

目录 一、创建子图 1.1 下图是绘制的子图: 1.2 代码释义: 二、绘制子图 2.1 代码引入 2.2 图形绘制 三、子图布局 3.1 子图布局说明 四、子图大小 4.1 子图大小调整 五、子图间距 5.1 子图代码调整 六、子图位置 6.1 代码引入 6.2 完整代码…

如何在 Windows10 下运行 Tensorflow 的目标检测?

前言 看过很多博主通过 Object Detection 实现了一些皮卡丘捕捉,二维码检测等诸多特定项的目标检测。而我跟着他们的案例来运行的时候,不是 Tensorflow 版本冲突,就是缺少什么包,还有是运行官方 object_detection_tutorial 不展示…

算法记录 | Day30 回溯算法

332.重新安排行程 思路: 1.确定回溯函数参数:定义全局遍历存放path, 2.终止条件:遍历完所有路径,机场个数,如果达到了(航班数量1),即path的长度应当为字符串二维数组长…

教程 | 多通道fNIRS数据的预处理和平均(下)

前言 前文近红外数据的预处理和平均(上)提到fNIRS是一种评估氧和脱氧血红蛋白浓度变化的方法,可与fMRI相媲美。fNIRS的不足是它的空间分辨率比fMRI差,但其优点是有更高的时间分辨率,并允许测量无法通过fMRI扫描仪测试…

GPT-4 API 接口调用及价格分析

GPT-4 API 接口调用及价格分析 15日凌晨,OpenAI发布了万众期待的GPT-4!新模型支持多模态,具备强大的识图能力,并且推理能力和回答准确性显著提高。在各种专业和学术基准测试上的表现都媲美甚至超过人类。难怪OpenAI CEO Sam Altm…