写点什么

架构设计:高并发读取,高并发写入,并发设计规划落地方案思考

发布于: 2020 年 11 月 23 日

互联网应用架构:专注编程教学,架构,JAVA,Python,微服务,机器学习等领域,欢迎关注,一起学习。


前言

架构设计在应用中是针对所有重要问题作出的重要决策,最开始的源头就是计算机里面的读和写。在面对大型的网站或者业务系统的时候,一些理所当然的行为或者操作在高并发下就变得脆弱不堪。

并发有几种

  1. 高并发读取

  2. 高并发写入

在很多同学的了解中,高并发更多局限在高并发读取里面,概念中并没有遇到高并发写入的问题,当遇到高并发问题的时候,集群,负载,读写分离,分库分表,但其实不然,面对不同类型的高并发所采用的处理方案并不一致,根据不同的场景在设计不同的架构。

任何一个网站,面对这大量的 C 端用户的时候,不可能是单纯的读取数据或者写入数据,肯定是读写混合着交织在一起,对于 C 端的用户来说,肯定更加侧重读取数据的用户体验,写入毕竟是少量的需求,对于后台处理系统来说,高效写入才是我们重中之重。

分库分表设计理念参考:《微服务手册:分库分表从分析到实践,不再停留只会说分库分表


高并发读取策略

1、“缓存”策略

在面对高并发读取的时候,很多时候想到的第一件事就是加缓存,但是笔者里面的缓存并不是简单加入缓存,而是一种策略。

1.1、加入实体缓存

这个就是我们经常使用的一种方案,采用本地缓存或者缓存中间件来实现《微服务手册:高速查询?除了Redis我们还有另外的选择》,这些是非常成熟的方案,但是对于缓存,我们需要考虑一下几点问题:缓存雪崩,缓存穿透,缓存大量的热点 key 过期。虽然有存在这些问题存在,但是我们在处理这些问题本质上来说都是缓存回源问题,可以采用不回源策略来解决这些问题,只查缓存,但是这些就需要主动更新缓存,如果采用回源呢?量能一起来就很容易遇到上面的问题,这些网上都有比较多的方案可以借鉴参考。


1.2、数据库主从分离

上面的实体缓存虽然可以帮助我们解决很多问题,但是面对一些很复杂的业务场景的时候,单纯的 key,value 并不能满足我们的需求,后台的运营系统需要更加复杂的业务逻辑及业务数据,如果此时我们只有一个数据库,所有的业务查询都是走同一个数据库,会影响 C 端用户的高并发访问,此时我们有一个快捷的解决方案:直接加上一个或者多个 Slave,从而减轻主数据库的压力。


1.3、动静分离

现在基本上都是 BS 的天下,那内容基本上就分为静态内容与动态内容。

静态内容基本上啥都不变,图片、HTML、JS、CSS 文件等,对用户来说几乎不变,此时我们可以把这些内容采用 CDN 策略来实现从而实现高速访问。

动态内容接口方式返回给用户。


2、并发策略

上面的无论怎么做,基本上都是串行操作,现在来说说如何做并行计算。

2.1、异步 PRC 或者 HTTP 请求

现在很多 RPC 框架或者 HTTP 客户端,都支持异步的方式,对于多个请求可以采用异步方式同时请求并进行数据聚合就行。

2.2、冗余服务器

这个有点难以理解并且实际中很难用到,用户发送一个请求,后端有多台服务器等待着,先一台服务器处理如果没有在规定的时间内返回数据则废弃掉,直接请求第二台,以此类推。是不是听起来很像轮训,不过那么多的冗余服务器也是大工程。


3、重写轻读策略

这里是一个非常重要的拓展,按照一定的业务规则把关联数据计算完成,在读取的时候直接去这个地方读取就行,这是聚合存储的概念,可以采用缓存,数据库,ES 等。有兴趣的同学可以了解一下微博的 Feeds 流

4、总结

上面的三种方案,无论怎么做本质上来说都是读写分离的实现。


高并发写入策略

1、数据分片策略

数据分片非常好理解,把要处理的数据分成 N 份并行进行处理,像我们数据库的分库分表,可以充分利用计算机的 CPU 或者内存等资源。JAVA 里面的 ConcurrentHashMap,kafka 的 partition,es 的分布式索引都是此类策略的实现。

2、任务分片策略

相比于数据分片,任务分片更侧重于在程序上进行并行。在程序层面,像 map/reduce 就是典型的

任务分片。

3、异步策略

异步主要从 4 个层面来分析,分别是系统层面,JDK 层面,接口层面,业务层面,针对不同的层面,采用不同的异步方式进行操作,例如接口层面的请求,我们可以采用 okhttp,默认支持异步请求。

4、汇总批量策略

很多同学在进行数据操作的时候都有一个经验,数据库一条一条插入是非常费劲的,每次都要进行一次操作,有 100 份数据的话,就需要进行 100 份的操作,这样子的行为非常浪费时间,那解决方案就是采用数据汇总并进行批量操作。例如我们 mysql 里面,多个小事务合并成一个进行操作。


总结

高并发是一个复杂的问题,本文只是列出个大概,具体每一个小项都是一个值得深入研究的方向。


--END--

作者:@互联网应用架构

原创作品,抄袭必究

如需要源码或请转发,关注后私信我

部分图片或代码来源网络,如侵权请联系删除,谢谢!


发布于: 2020 年 11 月 23 日阅读数: 73
用户头像

喜欢奋战在一线的架构师 2020.09.21 加入

专注架构,微服务,机器学习,JAVA,Python等领域教程,欢迎关注

评论

发布
暂无评论
架构设计:高并发读取,高并发写入,并发设计规划落地方案思考