
高并发系统设计
文章平均质量分 91
高并发系统设计
_Rye_
左手代码右手诗
一行代码一行诗
展开
-
40 | 信息流设计(二):通用信息流系统的拉模式要如何做?
在前一节课中,我带你了解了如何用推模式来实现信息流系统,从中你应该了解到了推模式存在的问题,比如它在面对需要支撑很大粉丝数量的场景时,会出现消息推送延迟、存储成本高、方案可扩展性差等问题。虽然我们也会有一些应对的措施,比如说选择插入性能更高的数据库存储引擎来提升数据写入速度,降低数据推送延迟;定期删除冷数据以减小存储成本等等,但是由于微博大 V 用户粉丝量巨大,如果我们使用推模式实现信息流系统,那么只能缓解这些用户的微博推送延迟问题,没有办法彻底解决。原创 2023-10-08 11:53:38 · 223 阅读 · 0 评论 -
39 | 信息流设计(一):通用信息流系统的推模式要如何做?
前两节课中,我带你探究了如何设计和实现互联网系统中一个常见模块——计数系统。它的业务逻辑其实非常简单,基本上最多只有三个接口,获取计数、增加计数和重置计数。所以我们在考虑方案的时候考察点也相对较少,基本上使用缓存就可以实现一个兼顾性能、可用性和鲁棒性的方案了。然而大型业务系统的逻辑会非常复杂,在方案设计时通常需要灵活运用多种技术,才能共同承担高并发大流量的冲击。那么接下来,我将带你了解如何设计社区系统中最为复杂、并发量也最高的信息流系统。这样,你可以从中体会怎么应用之前学习的组件了。原创 2023-10-08 10:26:35 · 342 阅读 · 0 评论 -
38 | 计数系统设计(二):50万QPS下如何设计未读数系统?
在上一节课中我带你了解了如何设计一套支撑高并发访问和存储大数据量的通用计数系统,我们通过缓存技术、消息队列技术以及对于 Redis 的深度改造,就能够支撑万亿级计数数据存储以及每秒百万级别读取请求了。然而有一类特殊的计数并不能完全使用我们提到的方案,那就是未读数。原创 2023-10-08 09:58:02 · 288 阅读 · 0 评论 -
37 | 计数系统设计(一):面对海量数据的计数器要如何做?
从今天开始,我们正式进入最后的实战篇。在之前的课程中,我分别从数据库、缓存、消息队列和分布式服务化的角度,带你了解了面对高并发的时候要如何保证系统的高性能、高可用和高可扩展。课程中虽然有大量的例子辅助你理解理论知识,但是没有一个完整的实例帮你把知识串起来。所以,为了将我们提及的知识落地,在实战篇中,我会以微博为背景,用两个完整的案例带你从实践的角度应对高并发大流量的冲击,期望给你一个更加具体的感性认识,为你在实现类似系统的时候提供一些思路。今天我要讲的第一个案例是如何设计一个支持高并发大存储量的计数系统。原创 2023-10-08 09:27:43 · 455 阅读 · 0 评论 -
35 | 流量控制:高并发系统中我们如何操纵流量?
限流指的是通过限制到达系统的并发请求数量,保证系统能够正常响应部分用户请求,而对于超过限制的流量,则只能通过拒绝服务的方式保证整体系统的可用性。限流策略一般部署在服务的入口层,比如 API 网关中,这样可以对系统整体流量做塑形。而在微服务架构中,你也可以在 RPC 客户端中引入限流的策略,来保证单个服务不会被过大的流量压垮。其实,无论在实际工作生活中还是在之前学习过的知识中,你都可能对限流策略有过应用,我给你举几个例子。原创 2023-10-08 08:51:31 · 123 阅读 · 0 评论 -
33 | 配置管理:成千上万的配置项要如何管理?
相信在实际工作中,提及性能优化你会想到代码优化,但是实际上有些性能优化可能只需要调整一些配置参数就可以搞定了。为什么这么说呢?我给你举几个例子:你可以调整配置的超时时间让请求快速失败,防止系统的雪崩,提升系统的可用性;你还可以调整 HTTP 客户端连接池的大小,来提升调用第三方 HTTP 服务的并行处理能力,从而提升系统的性能。你可以认为配置是管理你系统的工具,在你的垂直电商系统中,一定会有非常多的配置项,比如数据库的地址、请求 HTTP 服务的域名、本地内存最大缓存数量等等。原创 2023-10-08 00:50:18 · 532 阅读 · 0 评论 -
34 | 降级熔断:如何屏蔽非核心系统故障的影响?
到目前为止,你的电商系统已经搭建了完善的服务端和客户端监控系统,并且完成了全链路压测。现在呢,你们已经发现和解决了垂直电商系统中很多的性能问题和隐患。但是千算万算,还是出现了纰漏。本来,你们对于应对“双十一”的考验信心满满,但因为欠缺了一些面对巨大流量的经验,在促销过程中出现了几次短暂的服务不可用,这给部分用户造成了不好的使用体验。事后,你们进行了细致的复盘,追查出现故障的根本原因,你发现,原因主要可以归结为两大类。第一类原因是由于依赖的资源或者服务不可用,最终导致整体服务宕机。原创 2023-10-08 01:21:13 · 92 阅读 · 0 评论 -
32 | 压力测试:怎样设计全链路压力测试平台?
压力测试(简称为压测)这个名词儿,你在业界的分享中一定听过很多次,当然了,你也可能在项目的研发过程中做过压力测试,所以,对于你来说,压力测试并不陌生。不过我想让你回想一下,自己是怎么做压力测试的?是不是像很多同学一样:先搭建一套与正式环境功能相同的测试环境,并且导入或者生成一批测试数据,然后在另一台服务器,启动多个线程并发地调用需要压测的接口(接口的参数一般也会设置成相同的,比如,想要压测获取商品信息的接口,那么压测时会使用同一个商品 ID)。原创 2023-10-08 00:41:21 · 292 阅读 · 0 评论 -
30 | 给系统加上眼睛:服务端监控要怎么做?
在一个项目的生命周期里,运行维护占据着很大的比重,在重要性上,它几乎与项目研发并驾齐驱。而在系统运维过程中,能够及时地发现问题并解决问题,是每一个团队的本职工作。所以,你的垂直电商系统在搭建之初,运维团队肯定完成了对于机器 CPU、内存、磁盘、网络等基础监控,期望能在出现问题时,及时地发现并且处理。你本以为万事大吉,却没想到系统在运行过程中,频频得到用户的投诉,原因是:使用的数据库主从延迟变长,导致业务功能上出现了问题;接口的响应时间变长,用户反馈商品页面出现空白页;原创 2023-10-07 23:33:50 · 70 阅读 · 0 评论 -
29 | Service Mesh:如何屏蔽服务化系统的服务治理细节?
在分布式服务篇的前几节课程中,了解了在微服务化过程中,要使用哪些中间件解决服务之间通信和服务治理的问题,其中就包括:用 RPC 框架解决服务通信的问题;用注册中心解决服务注册和发现的问题;使用分布式 Trace 中间件,排查跨服务调用慢请求;使用负载均衡服务器,解决服务扩展性的问题;在 API 网关中植入服务熔断、降级和流控等服务治理的策略。经历了这几环之后,你的垂直电商系统基本上已经完成了微服务化拆分的改造。原创 2023-10-07 22:53:11 · 97 阅读 · 0 评论 -
31 | 应用性能管理:用户的使用体验应该如何监控?
上一节课中,了解了服务端监控搭建的过程。有了监控报表之后,你的团队在维护垂直电商系统时,就可以更早地发现问题,也有直观的工具辅助你们分析排查问题了。不过你很快发现,有一些问题,服务端的监控报表无法排查,甚至无法感知。比如,有用户反馈创建订单失败,但是从服务端的报表来看,并没有什么明显的性能波动,从存储在 Elasticsearch 里的原始日志中,甚至没有找到这次创建订单的请求。这有可能是客户端有 Bug,或者网络抖动导致创建订单的请求并没有发送到服务端。原创 2023-10-07 23:50:34 · 136 阅读 · 0 评论 -
27 | API网关:系统的门面要如何做呢?
到目前为止,你的垂直电商系统在经过微服务化拆分之后已经运行了一段时间了,系统的扩展性得到了很大的提升,也能够比较平稳地度过高峰期的流量了。不过最近你发现,随着自己的电商网站知名度越来越高,系统迎来了一些“不速之客”,在凌晨的时候,系统中的搜索商品和用户接口的调用量会急剧上升,持续一段时间之后又回归正常。。当你在搜索服务上加一个针对设备 ID 的限流功能之后,凌晨的高峰搜索请求不见了。但是不久之后,用户服务也出现了大量爬取用户信息的请求,商品接口出现了大量爬取商品信息的请求。原创 2023-10-07 20:47:36 · 123 阅读 · 0 评论 -
28 | 多机房部署:跨地域的分布式系统如何做?
来想象这样一个场景:你的垂直电商系统部署的 IDC 机房,在某一天发布了公告说,机房会在第二天凌晨做一次网络设备的割接,在割接过程中会不定时出现瞬间或短时间网络中断。机房网络的中断肯定会对业务造成不利的影响,即使割接的时间在凌晨(业务的低峰期),作为技术负责人的你,也要尽量思考方案来规避隔离的影响。然而不幸的是,在现有的技术架构下,电商业务全都部署在一个 IDC 机房中,你并没有好的解决办法。原创 2023-10-07 21:10:52 · 591 阅读 · 0 评论 -
26 | 负载均衡:怎样提升系统的横向扩展能力?
在基础篇中,我提到了高并发系统设计的三个通用方法:缓存、异步和横向扩展。到目前为止,你接触到了缓存的使用姿势,也了解了如何使用消息队列异步处理业务逻辑。那么本节课,我将带你了解一下如何提升系统的横向扩展能力。在之前的课程中,我也提到过提升系统横向扩展能力的一些案例。原创 2023-10-07 20:12:29 · 290 阅读 · 0 评论 -
25 | 分布式Trace:横跨几十个分布式组件的慢请求要如何排查?
经过前面几节课的学习,你的垂直电商系统在引入 RPC 框架和注册中心之后已经完成基本的服务化拆分了,系统架构也有了改变:现在,你的系统运行平稳,老板很高兴,你也安心了很多。而且你认为,在经过了服务化拆分之后,服务的可扩展性增强了很多,可以通过横向扩展服务节点的方式平滑地扩容了,对于应对峰值流量也更有信心了。:你通过监控发现,系统的核心下单接口在晚高峰的时候,会有少量的慢请求,用户也投诉在 APP 上下单时,等待的时间比较长。原创 2023-10-07 18:03:09 · 129 阅读 · 0 评论 -
22 | 微服务架构:微服务化后系统架构要如何改造?
服务拆分之后,由于服务是以独立进程的方式部署,所以服务之间通信就不再是进程内部的方法调用而是跨进程的网络通信了。在这种通信模型下服务接口的定义要具备可扩展性,否则在服务变更时会造成意想不到的错误。在之前的项目中,某一个微服务的接口有三个参数,在一次业务需求开发中,组内的一个同学将这个接口的参数调整为了四个,接口被调用的地方也做了修改,结果上线这个服务后却不断报错,无奈只能回滚。这是因为这个接口先上线后参数变更成了四个,但是调用方还未变更还是在调用三个参数的接口,那就肯定会报错了。原创 2023-10-07 10:28:05 · 345 阅读 · 0 评论 -
23 | RPC框架:10万QPS下如何实现毫秒级的服务调用?
在21 讲和22 讲中,你的团队已经决定对垂直电商系统做服务化拆分,以便解决扩展性和研发成本高的问题。与此同时,你们在不断学习的过程中还发现系统做了服务化拆分之后会引入一些新的问题,这些问题我在上节课提到过,归纳起来主要是两点:服务拆分单独部署后,引入的服务跨网络通信的问题;在拆分成多个小服务之后,服务如何治理的问题。。原创 2023-10-07 15:34:28 · 370 阅读 · 0 评论 -
24 | 注册中心:分布式系统如何寻址?
上一节课,我带你了解了 RPC 框架实现中的一些关键的点,你通过 RPC 框架,能够解决服务之间跨网络通信的问题,这就完成了微服务化改造的基础。但是在服务拆分之后,你需要维护更多的细粒度的服务,而你需要面对的第一个问题就是如何让 RPC 客户端知道服务端部署的地址。这就是今天要讲到的服务注册与发现的问题。原创 2023-10-07 17:13:45 · 139 阅读 · 0 评论 -
21 | 系统架构:每秒1万次请求的系统要做服务化拆分吗?
通过前面几个篇章的内容,你已经从数据库、缓存和消息队列的角度对自己的垂直电商系统在性能、可用性和扩展性上做了优化。现在你的系统运行稳定好评不断,每天高峰期的流量已经达到了 10000/s 请求,DAU 也涨到了几十万。CEO 非常高兴,打算继续完善产品功能进行新一轮的运营推广,争取在下个双十一可以将 DAU 冲击过百万。这时你开始考虑怎么通过技术上的优化改造支撑更高的并发流量,比如支撑过百万的 DAU。于是你重新审视了自己的系统架构,分析系统中有哪些可以优化的点。原创 2023-10-07 09:17:14 · 192 阅读 · 0 评论 -
19 | 消息队列:如何降低消息队列系统中消息的延迟?
学完前面两节课之后,相信你对在垂直电商项目中如何使用消息队列应对秒杀时的峰值流量已经有所了解。当然了,你也应该知道要如何做才能保证消息不会丢失,尽量避免消息重复带来的影响。那么思考一下:除了这些内容,你在使用消息队列时还需要关注哪些点呢?先来看一个场景:在你的垂直电商项目中,你会在用户下单支付之后向消息队列里面发送一条消息,队列处理程序消费了消息后会增加用户的积分或者给用户发送优惠券。原创 2023-10-06 23:27:45 · 239 阅读 · 0 评论 -
17 | 消息队列:秒杀时如何处理每秒上万次的下单请求?
在课程一开始,我就带你了解了高并发系统设计的三个目标:性能、可用性和可扩展性,而在提升系统性能方面我们一直关注的是系统的查询性能,也用了很多的篇幅去讲解数据库的分布式改造,各类缓存的原理和使用技巧。比如一个社区的系统初期一定是只有少量的种子用户在生产内容,而大部分的用户都在“围观”别人在说什么。此时,整体的流量比较小,而写流量可能只占整体流量的百分之一,那么即使整体的 QPS 到了 10000 次 / 秒,写请求也只是到了每秒 100 次,如果要对写请求做性能优化,它的性价比确实不太高。但随着业务发展,原创 2023-10-06 14:36:14 · 272 阅读 · 0 评论 -
数据的迁移应该如何做?
我曾经提到,由于 MySQL 不像 MongoDB 那样支持数据的 Auto Sharding(自动分片),所以无论是将 MySQL 单库拆分成多个数据库,还是由于数据存储的瓶颈,不得不将多个数据库拆分成更多的数据库时你都要考虑如何做数据的迁移。其实在实际工作中,不只是对数据库拆分时会做数据迁移,原创 2023-10-06 01:24:36 · 545 阅读 · 0 评论 -
18 | 消息投递:如何保证消息仅仅被消费一次?
幂等是一个数学上的概念,它的含义是多次执行同一个操作和执行一次操作,最终得到的结果是相同的,说起来可能有些抽象,举个例子:比如,男生和女生吵架,女生抓住一个点不放,传递“你不在乎我了吗?”(生产消息)的信息。那么当多次抱怨“你不在乎我了吗?”的时候(多次生产相同消息),她不知道的是,男生的耳朵(消息处理)会自动把 N 多次的信息屏蔽,就像只听到一次一样,这就是幂等性。如果我们消费一条消息的时候,要给现有的库存数量减 1,那么如果消费两条相同的消息就会给库存数量减 2,这就不是幂等的。原创 2023-10-06 22:57:26 · 375 阅读 · 0 评论 -
16 | CDN:静态资源如何加速?
将用户的请求映射到 CDN 服务器上是使用 CDN 时需要解决的一个核心的问题,而 CNAME 记录在 DNS 解析过程中可以充当一个中间代理层的角色,可以把用户最初使用的域名代理到正确的 IP 地址上。现在,剩下的一个问题就是如何找到更近的 CDN 节点了,而 GSLB 承担了这个职责。原创 2023-10-05 18:22:13 · 433 阅读 · 0 评论 -
15 | 缓存的使用姿势(三):缓存穿透了怎么办?
缓存穿透其实是指从缓存中没有查到数据,而不得不从后端系统(比如数据库)中查询的情况。你可以把数据库比喻为手机,它是经受不了太多的划痕和磕碰的,所以你需要贴个膜再套个保护壳,就能对手机起到一定的保护作用了。不过少量的缓存穿透不可避免,对系统也是没有损害的,主要有几点原因:一方面,互联网系统通常会面临极大数据量的考验,而缓存系统在容量上是有限的,不可能存储系统所有的数据,那么在查询未缓存数据的时候就会发生缓存穿透。另一方面,互联网系统的数据访问模型一般会遵从“80/20 原则”。原创 2023-10-05 17:45:01 · 82 阅读 · 0 评论 -
14 | 缓存的使用姿势(二):缓存如何做到高可用?
前面几节课,我带你了解了缓存的原理、分类以及常用缓存的使用技巧。我们开始用缓存承担大部分的读压力,从而缓解数据库的查询压力,在提升性能的同时保证系统的稳定性。这时,你的电商系统整体的架构演变成下图的样子:我们在 Web 层和数据库层之间增加了缓存层,请求会首先查询缓存,只有当缓存中没有需要的数据时才会查询数据库。在这里,需要关注缓存命中率这个指标(缓存命中率 = 命中缓存的请求数 / 总请求数)。原创 2023-10-05 17:20:01 · 135 阅读 · 0 评论 -
13 | 缓存的使用姿势(一):如何选择缓存的读写策略?
上节课,我带你了解了缓存的定义、分类以及不足,你现在应该对缓存有了初步的认知。从今天开始,我将带你了解一下使用缓存的正确姿势,比如缓存的读写策略是什么样的,如何做到缓存的高可用以及如何应对缓存穿透。通过了解这些内容,你会对缓存的使用有深刻的认识,这样在实际工作中就可以在缓存使用上游刃有余了。今天,我们先讲讲缓存的读写策略。你可能觉得缓存的读写很简单,只需要优先读缓存,缓存不命中就从数据库查询,查询到了就回种缓存。实际上,针对不同的业务场景,缓存的读写策略也是不同的。原创 2023-10-05 16:37:33 · 200 阅读 · 0 评论 -
12 | 缓存:数据库成为瓶颈后,动态数据的查询要如何加速?
缓存,是一种存储数据的组件,它的作用是让对数据的请求更快地返回。我们经常会把缓存放在内存中来存储, 所以有人就把内存和缓存画上了等号,这完全是外行人的见解。作为业内人士,你要知道在某些场景下我们可能还会使用 SSD 作为冷数据的缓存。比如说 360 开源的 Pika 就是使用 SSD 存储数据解决 Redis 的容量瓶颈的。实际上,凡是位于速度相差较大的两种硬件之间,用于协调两者数据传输速度差异的结构,均可称之为缓存。原创 2023-10-05 15:56:02 · 174 阅读 · 0 评论 -
10 | 发号器:如何保证分库分表后ID的全局唯一性?
在前面两节课程中,了解了分布式存储两个核心问题:数据冗余和数据分片,以及在传统关系型数据库中是如何解决的。当我们面临高并发的查询数据请求时,可以使用主从读写分离的方式,部署多个从库分摊读压力;当存储的数据量达到瓶颈时,我们可以将数据分片存储在多个节点上,降低单个存储节点的存储压力,此时我们的架构变成了下面这个样子:你可以看到,我们通过分库分表和主从读写分离的方式解决了数据库的扩展性问题,但是在 09 讲我也提到过,数据库在分库分表之后,我们在使用数据库时存在的许多限制,比方说查询的时候必须带着分区键;原创 2023-10-05 01:21:13 · 694 阅读 · 0 评论 -
11 | NoSQL:在高并发场景下,数据库和NoSQL如何做到互补?
倒排索引是指将记录中的某些列做分词,然后形成的分词与记录 ID 之间的映射关系。比如说,你的垂直电商项目里面有以下记录:那么,我们将商品名称做简单的分词,然后建立起分词和商品 ID 的对应关系,就像下面展示的这样:这样,如果用户搜索电冰箱,就可以给他展示商品 ID 为 1 和 3 的两件商品了。而 Elasticsearch 作为一种常见的 NoSQL 数据库,就。原创 2023-10-05 01:38:38 · 327 阅读 · 0 评论 -
09 | 数据库优化方案(二):写入数据量增加时,如何实现分库分表?
前一节课,我们学习了在高并发下数据库的一种优化方案:读写分离,它就是依靠主从复制的技术使得数据库实现了数据复制为多份,增强了抵抗大量并发读请求的能力,提升了数据库的查询性能的同时,也提升了数据的安全性。当某一个数据库节点,无论是主库还是从库发生故障时,我们还有其他的节点中存储着全量的数据,保证数据不会丢失。此时,你的电商系统的架构图变成了下面这样:这时,公司 CEO 突然传来一个好消息,运营推广持续带来了流量,你所设计的电商系统的订单量突破了五千万。原创 2023-10-05 00:57:08 · 151 阅读 · 0 评论 -
08 | 数据库优化方案(一):查询请求增加时,如何做主从分离?
我可以在队列处理机中不查询从库而改为查询主库。不过,这种方式使用起来要慎重,要明确查询的量级不会很大,是在主库的可承受范围之内,否则会对主库造成比较大的压力。我会优先考虑第一种方案,因为这种方式足够简单,不过可能造成单条消息比较大,从而增加了消息发送的带宽和时间。原创 2023-10-05 00:17:13 · 106 阅读 · 0 评论 -
07 | 池化技术:如何减少频繁创建数据库连接的性能损耗?
如果你使用线程池请一定记住不要使用无界队列(即没有设置固定大小的队列)。也许你会觉得使用了无界队列后,任务就永远不会被丢弃,只要任务对实时性要求不高,反正早晚有消费完的一天。但是,大量的任务堆积会占用大量的内存空间,一旦内存空间被占满就会频繁地触发 Full GC,造成服务不可用,我之前排查过的一次 GC 引起的宕机,起因就是系统中的一个线程池使用了无界队列。理解了线程池的关键要点,你在系统里加上了这个特性,至此,系统稳定,你圆满完成了公司给你的研发任务。原创 2023-10-04 15:49:14 · 211 阅读 · 0 评论 -
04 | 系统设计目标(二):系统怎样做到高可用?
在课程设计时,主要想用基础篇中的前五讲内容了解一些关于高并发系统设计的基本概念,期望能帮你建立一个整体的框架,这样方便在后面的演进篇和实战篇中对涉及的知识点做逐一的展开和延伸。比方说,本节课提到了降级,那会在运维篇中以案例的方式详细介绍降级方案的种类以及适用的场景,之所以这么设计是期望通过前面少量的篇幅把课程先串起来,以点带面,逐步展开。接下来,让我们正式进入课程。本节课,我会继续带你了解高并发系统设计的第二个目标——高可用性。原创 2023-10-04 15:15:19 · 128 阅读 · 0 评论 -
05 | 系统设计目标(三):如何让系统易于扩展?
从架构设计上来说,高可扩展性是一个设计的指标,它表示可以通过增加机器的方式来线性提高系统的处理能力,从而承担更高的流量和并发。你可能会问:“在架构设计之初,为什么不预先考虑好使用多少台机器,支持现有的并发呢?”这个问题我在03小节 中提到过,答案是峰值的流量不可控。一般来说,基于成本考虑,在业务平稳期,我们会预留 30%~50% 的冗余以应对运营活动或者推广可能带来的峰值流量,但是当有一个突发事件发生时,流量可能瞬间提升到 2~3 倍甚至更高,我们还是以微博为例。原创 2023-10-04 15:30:00 · 157 阅读 · 0 评论 -
01 | 高并发系统:它的通用设计方法是什么?
以方法调用为例,同步调用代表调用方要阻塞等待被调用方法中的逻辑执行完成。这种方式下,当被调用方法响应时间较长时,会造成调用方长久的阻塞,在高并发下会造成整体系统性能下降甚至发生雪崩。异步调用恰恰相反,调用方不需要等待方法逻辑执行完成就可以返回执行其他的逻辑,在被调用方法执行完毕后再通过回调、事件通知等方式将结果反馈给调用方。异步调用在大规模高并发系统中被大量使用,比如我们熟知的。原创 2023-10-04 14:36:37 · 96 阅读 · 0 评论 -
03 | 系统设计目标(一):如何提升系统性能?
高并发的系统通常是业务逻辑相对复杂的系统,那么在这类系统中出现的性能问题通常也会有多方面的原因。因此,我们在做性能优化的时候要明确目标,比方说,支撑每秒 1 万次请求的吞吐量下响应时间在 10ms,那么我们就需要持续不断地寻找性能瓶颈,制定优化方案,直到达到目标为止。在以上四个原则的指引下,掌握常见性能问题的排查方式和优化手段,就一定能让你在设计高并发系统时更加游刃有余。原创 2023-10-04 15:01:36 · 213 阅读 · 0 评论 -
02 | 架构分层:我们为什么一定要这么做?
软件架构分层在软件工程中是一种常见的设计方式,它是将整体系统拆分成 N 个层次,每个层次有独立的职责,多个层次协同提供完整的功能。我们在刚刚成为程序员的时候,会被“教育”说系统的设计要是“MVC”(Model-View-Controller)架构。它将整体的系统分成了 Model(模型),View(视图)和 Controller(控制器)三个层次,也就是将用户视图和业务处理隔离开,并且通过控制器连接起来,很好地实现了表现和逻辑的解耦,是一种标准的软件分层架构。原创 2023-10-04 14:47:29 · 209 阅读 · 0 评论