实战-高并发下的读/写

news2024/9/25 1:17:23

文章目录

  • 高并发下的读/写
  • 高并发读业务场景
  • 高并发写业务场景
  • 同时高并发读和高并发写业务场景
  • 高并发读策略
    • 一:加缓存/读副本
      • 方案一:本地缓存/集中式缓存
      • 方案二:数据库层面的改变,Master/Slave,使用主从完成读写分离
      • 方案三:CDN/静态文件加速/动静分离
    • 二:并发读
      • 1.异步 RPC
    • 三:重写轻读
  • 高并发写
    • 一:数据分片
    • 二:异步
  • 三:批量写


高并发下的读/写

在系统中不仅仅只有读,也不会只有写,那我们就需要考虑,当前需求是并发读还是并发写还是既有并发读也有并发写。

高并发读业务场景

  1. 电商平台中的商品搜索,商品详情,商品图片和价格。
    (1)数量级。读的一端,C 端用户,是亿或数十亿数量级;写的一端,商家运营,可能是“百万或千万”数量级。毕竟看商品的人比编辑商品的人要多得多。
    (2)响应时间,C端响应时间通常要在毫秒级
    (3)读写频率,读的频率远大于写的频率

高并发写业务场景

  1. 广告扣费系统。广告通常要么按浏览付费,要么按点击付费(业界叫作 CPC 或 CPM)。具体来说,就是广告主在广告平台开通一个账号,充一笔钱进去,然后投放自己的广告。C 端用户看到了这个广告后,可能点击一次扣一块钱(CPC);或者浏览这个广告,浏览 1000 次扣 10 块钱(CPM)。
    在这里插入图片描述

  2. 数据埋点接口,当浏览量大的时候,就需要我们的接口能抗住高并发写的压力。
    在这里插入图片描述

同时高并发读和高并发写业务场景

  1. 秒杀系统
  2. IM实时系统;微博;微信
    在这里插入图片描述

对于实时系统来说,当用户当用户达到千万级以上的时候,我们势必要考虑的就是同时存在高并发读写的情况。

高并发读策略

一:加缓存/读副本

如果流量扛不住了,相信大家首先想到的策略就是“加缓存”。缓存几乎不
处不在,它的本质是以空间换时间。下面列举几个缓存的典型案例:

方案一:本地缓存/集中式缓存

  1. 本地缓存

本地缓存通常我们想到就是map,但是使用map会有以下的情况需要我们来考虑

  • 并发-使用普通的Map还是线程安全的ConcurrentMap?
  • 容量-Map的容量需要有多大?
  • 过期策略-Map里的数据如果很久不用是不是需要定时清除?
  • 驱逐策略-如果数据还没有过期,但是容量满了该怎么处理?

因此我们可以使用更优秀的框架来完成我们的本地缓存的需要,Caffeine(号称本地缓存之王)
文档如下:
https://github.com/ben-manes/caffeine/wiki/Population-zh-CN


  1. 集中式缓存

是 Memcached/Redis 类的集中式缓存。

对于缓存,需要考虑几个问题:
(1)缓存的高可用问题。如果缓存宕机,是否会导致所有请求全部写入并压
垮数据库呢?
(2)缓存穿透。虽然缓存没有宕机,但是某些 Key 发生了大量查询,并且这些
Key 都不在缓存里,导致短时间内大量请求压垮数据库。
(3)缓存击穿。指一个热点 Key,大并发集中对这一个点进行访问,当这个 Key
在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库。
(4)大量的热 Key 过期。和第二个问题类似,也是因为某些 Key 失效,大量请
求在短时间内写入并压垮数据库,也就是缓存雪崩。其实第一个问题也可以视为
缓存雪崩

这些问题和缓存的回源策略有关:一种是不回源,只查询缓存,缓存没有,
直接返回给客户端为空,这种方式肯定是主动更新缓存,并且不设置缓存的过期
时间,不会有缓存穿透、大量热 Key 过期问题;另一种是回源,缓存没有,要再
查询数据库更新缓存,这种需要考虑应对上面的问题。

方案二:数据库层面的改变,Master/Slave,使用主从完成读写分离

当我们数据需要强一致性的时候,尽量直接去查询DB,保证数据的强一致性。经典的做法就是读写分离,将部分的请求打到从库中。

方案三:CDN/静态文件加速/动静分离

在网站的展示数据中,并不是所有的内容每次查询都需要重新计算的,可以分为静态内容和动态内容两部分。
(1)静态内容。数据不变,并且对于不同的用户来说,数据基本是一样的,比如图片、HTML、JS、CSS 文件;再比如各种直播系统,内容生成端产生的视频内容,对于消费端来说,看到的都是一样的内容。
(2)动态内容。需要根据用户的信息或其他信息(比如当前时间)实时地生成并返回给用户。对于静态内容,一个最常用的处理策略就是 CDN。一个静态文件缓存到了全网的各个节点,当第一个用户访问的时候,离用户就近的节点还没有缓存数据,CDN 就去源系统抓取文件缓存到该节点;等第二个用户访问的时候,只需要从这个节点访问即可,而不再需要去源系统取。

对于以上的方案,总体来说就是添加缓存,添加的位置不一样而已。前端;服务端内存;数据库主从;链路中每个节点都是可以添加缓存的。

二:并发读

1.异步 RPC

现在的 RPC 框架基本都支持了异步 RPC,对于用户的一个请求,如果需要调用 3 个 RPC 接口,则耗时分别是 T1、T2、T3。
如果是同步调用,则所消耗的总时间 T=T1+T2 +T3;如果是异步调用,则所消耗的总时间 T=Max(T1, T2,T3)。
当然,这有个前提条件:3 个调用之间没有耦合关系,可以并行。如果必须在拿到第 1 个调用的结果之后,根据结果再去调用第 2、第 3 个接口,就不能做异步调用了,而且异步调用后,如何获得异步调用的结果也需要仔细考虑。

三:重写轻读

以微博的feeds流为例
A用户发消息,A自己要看,A的粉丝们也要看。如果A是一个大V那粉丝一起看,直接一个高并发读,裂开。

sql直接一个干死
select msg_id from msg where user_1d= 1 limit offset,count
假设要查询 user_id= 1 用户的 Feeds 流,并且按时间排序、分页显示,需要
两条 SQL 语句:
select followings from Following where user_id = 1 //查询 user_id = 1 的用户的
关注的用户列表
select msg_id from msg where user_id in (followings) limit offset,count //查询
关注的所有用户的微博列表
在这里插入图片描述

我们可以改成重写轻读的方式,
将我们的业务重点放在写上面,读的时候只要去对应的队列中读就好了。
在这里插入图片描述

高并发写

一:数据分片

数据分片也就是对要处理的数据或请求分成多份并行处理。

二:异步

  1. 短信验证码注册或登录

通常在注册或登录 App 或小程序时,采用的方式为短信验证码。短信的发送通常需要依赖第三方的短信发送平台。客户端请求发送验证码,应用服务器收到请求后调用第三方的短信平台。
公网的 HTTP 调用可能需要 1 ~ 2 秒,如果是同步调用,则应用服务器会被阻塞。假设应用服务器是 Tomcat,一台机器最多可以同时处理几百个请求,如果同时来几百个请求,Tomcat 就会被卡死了。
改成异步调用就可以避免这个问题,应用服务器收到客户端的请求后,放入消息队列,立即返回。然后有个后台消费者,从消息队列读取消息,去调用第三方短信平台发送验证码。
应用服务器和消息队列之间是内网通信,不会被阻塞,即使客户端并发量很大,最多是消息堆积在消息队列里面
对用户来说,并不会感知到同步或者异步的差别,反正都是按了“获取验证码”的按钮后等待接收短信。可能过于 60s 之后没有收到短信,用户又会再次按按钮。

三:批量写

  1. 合并写入
    eg-场景,广告系统,并不是没点击一次就去数据库扣一次,而是,集满100次然后批量写一次

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

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

相关文章

MySQL学习笔记:count(1)、count(*)、count(字段)的区别

关于数据库中行数统计,无论是MySQL还是Oracle,都有一个函数可以使用,那就是COUNT()。 但是,就是这个常用的COUNT函数,却暗藏着很多玄机,尤其是在面试的时候,一不小心就会…

JUC多并发编程 CompletableFuture

Future 接口理论 Future 接口(FutureTask 实现类): 定义了操作异步任务执行一些方法,如获取异步任务的执行结果、取消任务的执行、判断任务是否被取消、判断任务执行是否完毕等 方法图: 类图: 代码示例: import ja…

Maven聚合开发【实例详解---5555字】

目录 一、Maven聚合开发_继承关系 二、Maven聚合案例 1. 搭建dao模块 2. 搭建service模块 3. 搭建web模块 4. 运行项目 一、Maven聚合开发_继承关系 Maven中的继承是针对于父工程和子工程。父工程定义的依赖和插件子工程可以直接使用。注意父工程类型一定为POM类型工程…

数字电路学习笔记 门电路概述

1 高低电平的实现 在数字电路中,输入输出都是二值逻辑,其高低电平用“0”和“1”表示其高低电平的获得是通过开关电路来实现,如二极管或三极管电路组成。如图 高低电平实现原理电其原理电路 当开关 S 断开时,输出电压 v。 V。&am…

Alibaba开源的Java诊断工具Arthas-实战

目录参考一、启动二、支持的ognl表达式三、监听参数监听Controller 的参数和返回值监听完整参数和返回值监听kafka消费监听单个参数监听异常按照耗时进行过滤监听参数比较四、变量和方法查询静态成员变量值查询配置类具体属性的值通过类加载器查看Spring容器中对象所有属性执行…

Qt显示数学公式

文章目录一、前言二、效果展示三、库文件四、使用教程五、MathML语法5.1、顶层元素5.2、字符/符号元素5.3、通用布局元素5.4、边标和角标元素5.5、表格教学5.6、数学符号六、转换工具6.1、手写转换公式工具myscript6.2、截图转换公式工具Mathpix一、前言 目前项目中需要显示数…

MySQL数据库学习——约束——概述+演示

我们先创建一个表&#xff1a; create database itheima; use itheima; create table user(id int primary key auto_increment comment 主键, name varchar(10) not null unique comment 姓名,age int check ( age > 0 && age <120 ) comment 年龄,status char…

零代码是什么?零代码平台适合谁用?

随着信息技术的发展&#xff0c;软件开发领域也不断发生变革&#xff0c;零代码&#xff08;No-Code&#xff09;开发模式越来越受到关注。 零代码到底是什么&#xff0c;能不能用通俗的话来说&#xff1f;这就来给大家讲一讲&#xff01; 01 零代码为什么出现&#xff1f; 随…

spring cloud consul服务注册源码分析

我们注册在consul上的服务&#xff0c;都是通过spring cloud consul discorvery来实现的&#xff0c;可以通过maven依赖导入spring-cloud-consul-discovery包。 对于spring项目&#xff0c;首先查看spring.factories文件&#xff1a; 从源码中可以找到服务注册、自动服务注册…

kubespray v2.21.0 部署 kubernetes v1.24.0 集群

文章目录1. 前言2. 创建7台虚拟机3. 部署 git3.1 dnf 安装3.2 tar 安装4. 下载 kubespray 介质5. 配置 zsh 终端6. 配置互信7. 安装 docker-ce8. 安装 ansible9. 安装其他依赖10. 配置内核参数11. 安装 k8s利用官方默认镜像部署 k8s 集群利用自定义构建镜像部署 k8s 集群12. 配…

第二讲 第一个Python程序

在上一课中&#xff0c;我们对 Python 语言的过去现在有了一些了解&#xff0c;我们准备好了运行 Python 程序所需要的解释器环境。相信大家已经迫不及待的想开始自己的 Python 编程之旅了&#xff0c;但是新问题来了&#xff0c;我们应该在什么地方书写 Python 程序&#xff0…

mvn测试执行用例的常用的命令

mvn执行指定的测试用例 mvn常用的命令 mvn mvn test -Dtestxxx&#xff1a;执行指定测试用例的命令&#xff0c;后面的xxx就是指定的所有被标记的用例 mvn test -Denv环境名 -Dtest包的路径.*:指定具体的某个环境的某个包下的所用例 mvn test -Dgroupsxxx -Dtestxxx :指定某…

Python实战案例:采集P站数据内容

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 开发环境&#xff1a; Python 3.8 / 编译器 Pycharm 2021.2版本 / 编辑器 模块使用&#xff1a; requests &#xff1a; 主要用来发 送 HTTP 请求 、 属于第三方模块 parsel &#xff1a; 解析html&#xff0c;xml内…

业务高峰期,人力需求突增,灵活用工成破局关键

在上一篇文章里&#xff0c;讲到了盖雅零工平台如何帮助HR管理复杂、灵活的零工人员。 而零工平台是否好用&#xff0c;不仅要便于HR管理零工&#xff0c;更需要终端的业务管理者觉得方便、实用、操作顺畅。 由于零工主要被用来解决突增的、巅峰期的、季节性的用工需求&#…

nginx实战,nginx高可用, nginx负载配置, nginx正向,反向代理,nginx各种配置, 及其配置问题

nginx配置实战, nginx负载&#xff0c; nginx正向&#xff0c;反向代理&#xff0c;nginx路由配置 nginxnginx基础nginx 配置nginx正向代理nginx 反向代理nginx 负载nginx高可用 nginx 配置常见问题反向代理报426错误post请求变get请求nginx 配置前端代理&#xff0c; 会出现js…

自学Java靠谱吗?自学Java能找到工作吗?建议收藏反复查看!

网上是不是很多人劝你学Java不要报班&#xff0c;浪费金钱&#xff0c;自己在家学习Java就可以了。那小源问你&#xff0c;自学Java它的成功率到底有多少&#xff1f;前两天看到一位老师发的视频&#xff0c;说自学的成功率大概在5%左右&#xff0c;小源觉得这个数据还是比较客…

IO线程模型

文章目录IO线程模型一、BIO1、概念2、Demo2.1、Demo1.02.2、Demo2.02.3、小结二、NIO1、概念2、Demo2.1、Demo1.02.2、Demo2.0IO线程模型 一、BIO 1、概念 BIO 全称 Block-IO 是一种**同步且阻塞**的通信模式。是一个比较传统的通信方式&#xff0c;模式简单&#xff0c;使用…

万字长文的BI百科全解

目前来看&#xff0c;现今世界未来的发展方向基本已经确定&#xff0c;数字化的趋势已经化身为一股不可阻挡的浪潮&#xff0c;各国也都宣布了数字化、数据、数字经济、数字化转型等方面的相关发展政策法规&#xff0c;明确未来的战略方针。同时世界传统经济增长也开始乏力&…

6 计时器(一)

计时器 6.1 TIM TIM简介 TIM&#xff08;Timer&#xff09;定时器 定时器可以对输入的时钟进行计数&#xff0c;并在计数值达到设定值时触发中断 16位计数器、预分频器、自动重装寄存器的时基单元&#xff0c;在72MHz计数时钟下可以实现最大59.65s的定时 不仅具备基本的定时中…

2023 年 3 月 NFT 月度报告

作者&#xff1a;Danielfootprint.network 数据来源&#xff1a;NFT Monthly Report 三月份的 NFT 市场上出现了两个有趣的趋势。一方面&#xff0c;Polygon 链尽管在二月份有所突破&#xff0c;达到了 NFT 总交易量的 4.2%&#xff0c;但于三月再次跌至 1% 以下&#xff0c;…