架构思维:构建高并发读服务_使用懒加载架构实现高性能读服务

文章目录

  • 一、引言
  • 二、读服务的功能性需求
  • 三、两大基本设计原则
    • 1. 架构尽量不要分层
    • 2. 代码尽可能简单
  • 四、实战方案:懒加载架构及其四大挑战
  • 五、改进思路
  • 六、总结与思考题

在这里插入图片描述


一、引言

在任何后台系统设计中,「读多写少」的业务场景占据主流:浏览商品、刷资讯、访问用户画像……相比写操作,读操作的并发压力更大、对性能的要求也更苛刻。为此,我们需要从 读服务(或称读接口/读业务)的角度,系统地探讨如何在高可用、高性能和超高 QPS(上万~百万峰值)的场景下构建稳健的架构。

接下来我们将围绕读服务的功能特点、两大基本设计原则,以及行业中常见的懒加载架构及其四大挑战,快速掌握实战思路。


二、读服务的功能性需求

读服务在执行流程上,基本是 无状态无副作用 的:

  1. 从持久层(数据库、Redis、Elasticsearch 等)获取原始数据;
  2. 简单加工或直接返回给前端。

因此,读服务必须满足三大指标:

  • 高可用:任何业务都需保证持续在线;
  • 高性能:TP999 必须控制在 100ms 以内;
  • 超高 QPS 支撑:满足上万至百万级峰值请求。

只有确保这三点,才能给用户带来流畅的体验,避免卡顿或秒级延迟。


三、两大基本设计原则

1. 架构尽量不要分层

传统分层(服务层→数据访问层→存储)虽然能降低代码耦合,但网络调用(RPC/HTTP)往返会成倍消耗延迟。监控数据显示,分层架构下读请求的 TP99、TP999 指标往往翻倍,且毛刺明显增多。

优化思路:将数据访问层编译进同一进程,去除网络传输环节。

内嵌后,TP999 可下降近 50%,平均延迟降低 20%~30%,部署成本也大幅下降。

在这里插入图片描述


2. 代码尽可能简单

读服务链路虽然清晰,但模型层次多、映射开销大。引入过多框架、全量日志打印、全量字段查询都会拖慢性能。

  • 慎用反射/Codegen 框架:如 Spring Bean.copyProperties,反射性能开销高。
  • 精细化日志:只打印关键信息,避免 JSON 序列化全量对象。
  • 按需字段查询:MySQL 避免 SELECT *,Redis 使用 Hash 并定位字段。

简化至:参数校验 → 查询构建 → 存储反序列化 → 业务加工 → 返回,把每一步都做到最轻量。
在这里插入图片描述


四、实战方案:懒加载架构及其四大挑战

最常见的读服务方案:缓存(Redis)+ 数据库(MySQL) 的懒加载模式:

  1. 服务先查 Redis;
  2. 未命中则读数据库并写回缓存(带过期时间);
    在这里插入图片描述

该方案实现成本低、思路清晰,但在高并发下会暴露以下问题:

  1. 缓存穿透

    • 恶意请求不存在的 key → 每次都落到数据库,易打挂。 符 + 参数前置校验(如 IP、MAC、KOAP token),拦截非法请求。
  2. 缓存雪崩

    • 同期过期后大量请求打到数据库。
    • 解决:过期时间加盐,避免同一时刻热点 key 大规模失效。
  3. 实时性不足

    • 依赖过期失效机制,更新延迟。
    • 改进可在写操作后主动推送变更,但需处理数据库与缓存更新顺序及分布式事务漏失。
      在这里插入图片描述
  4. 性能毛刺

    • 缓存过期瞬间穿透到数据库,延迟从毫秒级飙升至秒级。
    • 可以借助全量缓存和预热机制以平滑毛刺。

五、改进思路

利用 全量缓存消息队列同步预热与降级 等技术,打造真正的毫秒级读服务。请参考下篇博客 。


六、总结与思考题

  • 两大原则:架构不分层、代码简单。
  • 懒加载四大问题:穿透、雪崩、实时性、毛刺。

在这里插入图片描述

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

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

相关文章

在运行 Hadoop 作业时,遇到“No such file or directory”,如何在windows里打包在虚拟机里运行

最近在学习Hadoop集群map reduce分布运算过程中,经多方面排查可能是电脑本身配置的原因导致每次运行都会报“No such file or directory”的错误,最后我是通过打包文件到虚拟机里运行得到结果,具体步骤如下: 前提是要保证maven已经…

软考-软件设计师中级备考 11、计算机网络

1、计算机网络的分类 按分布范围分类 局域网(LAN):覆盖范围通常在几百米到几千米以内,一般用于连接一个建筑物内或一个园区内的计算机设备,如学校的校园网、企业的办公楼网络等。其特点是传输速率高、延迟低、误码率低…

【C#】.net core6.0无法访问到控制器方法,直接404。由于自己的不仔细,出现个低级错误,这让DeepSeek看出来了,是什么错误呢,来瞧瞧

🌹欢迎来到《小5讲堂》🌹 🌹这是《C#》系列文章,每篇文章将以博主理解的角度展开讲解。🌹 🌹温馨提示:博主能力有限,理解水平有限,若有不对之处望指正!&#…

当LLM遇上Agent:AI三大流派的“复仇者联盟”

你一定听说过ChatGPT和DeepSeek,也知道它们背后的LLM(大语言模型)有多牛——能写诗、写代码、甚至假装人类。但如果你以为这就是AI的极限,那你就too young too simple了! 最近,**Agent(智能体&a…

Spring Boot多模块划分设计

在Spring Boot多模块项目中,模块划分主要有两种思路:​​技术分层划分​​和​​业务功能划分​​。两种方式各有优缺点,需要根据项目规模、团队结构和业务特点来选择。 ​​1. 技术分层划分(横向拆分)​​ 结构示例&…

两次解析格式化字符串 + 使用SQLAlchemy的relationship执行任意命令 -- link-shortener b01lersCTF 2025

题目描述: A fast and reliable link shortener service, with a new feature to add private links! 我们走一遍逻辑 注册 app.route("/register", methods[GET, POST]) def register(): """ 用户注册路由,处理用户注册请求&#xff…

后端id类型为long类型时,返回给前端浏览器四舍五入,导致id精度缺失问题

背景 今天在代码里,掉了别人写的接口,有个id的字段是long类型的,我这边加点参数返回给前端,然后前端根据id修改,结果修改的数据记录有,但是没起作用,后来发现根据他传给我的id在后台数据库查不…

Scartch038(四季变换)

知识回顾 1.了解和简单使用音乐和视频侦测模块 2.使用克隆体做出波纹特效 3.取色器妙用侦测背景颜色 前言 我国幅员辽阔,不同地方的四季会有不同的美丽景色,这节课我带你使用程序做一个体现北方四季变化的程序 之前的程序基本都是好玩的,这节课做一个能够赏心悦目的程序。…

JVM happens-before 原则有哪些?

理解Java Memory Model (JMM) 中的 happens-before 原则对于编写并发程序有很大帮助。 Happens-before 关系是 JMM 用来描述两个操作之间的内存可见性以及执行顺序的抽象概念。如果一个操作 A happens-before 另一个操作 B (记作 A hb B),那么 JMM 向你保证&#x…

从 Eclipse Papyrus / XText 转向.NET —— SCADE MBD技术的演化

从KPN[1]的萌芽开始,到SCADE的推出[2],再到Scade 6的技术更迭[3],SCADE 基于模型的开发技术已经历许多。现在,Scade One 已开启全新的探索 —— 从 Eclipse Papyrus / XText 转向.NET 8跨平台应用。 [1]: KPN, Kahn进程网络 (197…

osquery在网络安全入侵场景中的应用实战(二)

背景 上次写了osquery在网络安全入侵场景中的应用实战(一)结果还不错,这次篇目二再增加一些场景。osquery主要解决的时员工被入侵之后电脑该如何溯源取证的问题。通常EDR会有日志,但是不会上报全量的日志。发现机器有恶意文件需要上级取证的时候,往往是比较麻烦的,会有这…

opencv+opencv_contrib+cuda和VS2022编译

本文介绍使用OpenCV和OpenCV_Contrib源码及Cuda进行编译的过程,编译过程中会用到OpenCV、OpenCV_Contrib、Toolkit、Cmake、VS2022等工具,最终编译OpenCV的Cuda版本。 一、OpenCV下载地址 OpenCV官网下载地址:https://opencv.org/releases/#&#xff0…

spring中的@ConfigurationProperties注解详解

一、核心功能与作用 ConfigurationProperties 是Spring Boot中用于将外部配置(如application.properties或application.yml中的属性)绑定到Java对象的核心注解。其核心功能包括: 配置集中管理:将分散的配置属性按前缀绑定到Java类…

【C/C++】函数模板

🎯 C 学习笔记:函数模板(Function Template) 本文是面向 C 初学者的函数模板学习笔记,内容包括基本概念、定义与使用、实例化过程、注意事项等,附带示例代码,便于理解与复现。 📌 一…

电子病历高质量语料库构建方法与架构项目(智能数据目录篇)

电子病历高质量语料库的构建是医疗人工智能发展的基础性工作,而智能数据目录作为数据治理的核心组件,能够有效管理这些语料资源。本文将系统阐述电子病历高质量语料库的构建方法与架构,特别聚焦于智能数据目录的设计与实现,包括数据目录的功能定位、元数据管理、构建步骤以…

前端懒加载(Lazy Loading)实战指南

🚀 前端懒加载(Lazy Loading)实战指南 懒加载是现代 Web 性能优化的“常规操作”。它的目标简单直接:让用户只加载“当下真正需要的资源”。从静态资源、组件、模块到数据,每一层都可以使用懒加载技术,构建…

在 Ubuntu 系统中,查看已安装程序的方法

在 Ubuntu 系统中,查看已安装程序的方法取决于软件的安装方式(如通过 apt、snap、flatpak 或手动安装)。以下是几种常见方法: 通过 apt 包管理器安装的软件 适用于通过 apt 或 dpkg 安装的 .deb 包。 列出所有已安装的软件包&…

性能优化实践:性能监控体系

性能优化实践:性能监控体系 在Flutter应用开发中,建立一个完善的性能监控体系对于保证应用质量和用户体验至关重要。本文将从实战角度深入讲解如何搭建Flutter应用的性能监控体系,包括监控指标的设计、数据采集实现、分析平台搭建等内容。 …

kotlin 02flow-sharedFlow 完整教程

一 sharedFlow是什么 SharedFlow 是 Kotlin 协程中 Flow 的一种 热流(Hot Flow),用于在多个订阅者之间 共享事件或数据流。它适合处理 一次性事件(如导航、弹窗、Toast、刷新通知等),而不是持续状态。 ✅ …

模拟开发授权平台

这次只是实现应用的curd和公私钥的校验以及第三方的通知dmeo项目,大家可以拓开视野来编写 进入主题 项目链接:桌角的眼镜/develop_auth_platform 直接下拉并运行就行 回调应用代码在test包中 回调应用测试代码 package mainimport ("encoding/…