From 5fa50dc5a63dbad96aee4094c95bfcbf40963f60 Mon Sep 17 00:00:00 2001 From: Guide Date: Mon, 3 Jun 2024 20:49:26 +0800 Subject: [PATCH] =?UTF-8?q?[docs=20fix]=E4=BF=AE=E6=AD=A3=E9=83=A8?= =?UTF-8?q?=E5=88=86=E6=8F=8F=E8=BF=B0=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/database/sql/sql-questions-01.md | 19 +-- docs/high-availability/performance-test.md | 116 +++++++++++------- .../message-queue-pub-sub-model.png | Bin 49655 -> 0 bytes .../message-queue-queue-model.png | Bin 23789 -> 0 bytes .../message-queue/message-queue.md | 30 +++-- docs/open-source-project/system-design.md | 1 + docs/readme.md | 2 +- 7 files changed, 103 insertions(+), 65 deletions(-) delete mode 100644 docs/high-performance/images/message-queue/message-queue-pub-sub-model.png delete mode 100644 docs/high-performance/images/message-queue/message-queue-queue-model.png diff --git a/docs/database/sql/sql-questions-01.md b/docs/database/sql/sql-questions-01.md index c0e3b2f8..4bf08f0f 100644 --- a/docs/database/sql/sql-questions-01.md +++ b/docs/database/sql/sql-questions-01.md @@ -1095,13 +1095,14 @@ WHERE b.prod_id = 'BR01' ```sql # 写法 1:子查询 -SELECT o.cust_id AS cust_id, tb.total_ordered AS total_ordered -FROM (SELECT order_num, Sum(item_price * quantity) AS total_ordered +SELECT o.cust_id, SUM(tb.total_ordered) AS `total_ordered` +FROM (SELECT order_num, SUM(item_price * quantity) AS total_ordered FROM OrderItems GROUP BY order_num) AS tb, Orders o WHERE tb.order_num = o.order_num -ORDER BY total_ordered DESC +GROUP BY o.cust_id +ORDER BY total_ordered DESC; # 写法 2:连接表 SELECT b.cust_id, Sum(a.quantity * a.item_price) AS total_ordered @@ -1111,6 +1112,8 @@ GROUP BY cust_id ORDER BY total_ordered DESC ``` +关于写法一详细介绍可以参考: [issue#2402:写法 1 存在的错误以及修改方法](https://github.com/Snailclimb/JavaGuide/issues/2402)。 + ### 从 Products 表中检索所有的产品名称以及对应的销售总数 `Products` 表中检索所有的产品名称:`prod_name`、产品 id:`prod_id` @@ -1653,12 +1656,12 @@ ORDER BY prod_name 注意:`vend_id` 列会显示在多个表中,因此在每次引用它时都需要完全限定它。 ```sql -SELECT vend_id, COUNT(prod_id) AS prod_id -FROM Vendors -LEFT JOIN Products +SELECT v.vend_id, COUNT(prod_id) AS prod_id +FROM Vendors v +LEFT JOIN Products p USING(vend_id) -GROUP BY vend_id -ORDER BY vend_id +GROUP BY v.vend_id +ORDER BY v.vend_id ``` ## 组合查询 diff --git a/docs/high-availability/performance-test.md b/docs/high-availability/performance-test.md index fe2ce946..47201441 100644 --- a/docs/high-availability/performance-test.md +++ b/docs/high-availability/performance-test.md @@ -8,15 +8,15 @@ icon: et-performance 这篇文章是我会结合自己的实际经历以及在测试这里取的经所得,除此之外,我还借鉴了一些优秀书籍,希望对你有帮助。 -## 一 不同角色看网站性能 +## 不同角色看网站性能 -### 1.1 用户 +### 用户 当用户打开一个网站的时候,最关注的是什么?当然是网站响应速度的快慢。比如我们点击了淘宝的主页,淘宝需要多久将首页的内容呈现在我的面前,我点击了提交订单按钮需要多久返回结果等等。 所以,用户在体验我们系统的时候往往根据你的响应速度的快慢来评判你的网站的性能。 -### 1.2 开发人员 +### 开发人员 用户与开发人员都关注速度,这个速度实际上就是我们的系统**处理用户请求的速度**。 @@ -31,7 +31,7 @@ icon: et-performance 7. 项目使用的 Redis 缓存多大?服务器性能如何?用的是机械硬盘还是固态硬盘? 8. …… -### 1.3 测试人员 +### 测试人员 测试人员一般会根据性能测试工具来测试,然后一般会做出一个表格。这个表格可能会涵盖下面这些重要的内容: @@ -40,63 +40,87 @@ icon: et-performance 3. 吞吐量; 4. …… -### 1.4 运维人员 +### 运维人员 运维人员会倾向于根据基础设施和资源的利用率来判断网站的性能,比如我们的服务器资源使用是否合理、数据库资源是否存在滥用的情况、当然,这是传统的运维人员,现在 Devops 火起来后,单纯干运维的很少了。我们这里暂且还保留有这个角色。 -## 二 性能测试需要注意的点 +## 性能测试需要注意的点 几乎没有文章在讲性能测试的时候提到这个问题,大家都会讲如何去性能测试,有哪些性能测试指标这些东西。 -### 2.1 了解系统的业务场景 +### 了解系统的业务场景 **性能测试之前更需要你了解当前的系统的业务场景。** 对系统业务了解的不够深刻,我们很容易犯测试方向偏执的错误,从而导致我们忽略了对系统某些更需要性能测试的地方进行测试。比如我们的系统可以为用户提供发送邮件的功能,用户配置成功邮箱后只需输入相应的邮箱之后就能发送,系统每天大概能处理上万次发邮件的请求。很多人看到这个可能就直接开始使用相关工具测试邮箱发送接口,但是,发送邮件这个场景可能不是当前系统的性能瓶颈,这么多人用我们的系统发邮件, 还可能有很多人一起发邮件,单单这个场景就这么人用,那用户管理可能才是性能瓶颈吧! -### 2.2 历史数据非常有用 +### 历史数据非常有用 -当前系统所留下的历史数据非常重要,一般情况下,我们可以通过相应的些历史数据初步判定这个系统哪些接口调用的比较多、哪些 service 承受的压力最大,这样的话,我们就可以针对这些地方进行更细致的性能测试与分析。 +当前系统所留下的历史数据非常重要,一般情况下,我们可以通过相应的些历史数据初步判定这个系统哪些接口调用的比较多、哪些服务承受的压力最大,这样的话,我们就可以针对这些地方进行更细致的性能测试与分析。 另外,这些地方也就像这个系统的一个短板一样,优化好了这些地方会为我们的系统带来质的提升。 -### 三 性能测试的指标 +## 常见性能指标 -### 3.1 响应时间 +### 响应时间 -**响应时间就是用户发出请求到用户收到系统处理结果所需要的时间。** 重要吗?实在太重要! +**响应时间 RT(Response-time)就是用户发出请求到用户收到系统处理结果所需要的时间。** -比较出名的 2-5-8 原则是这样描述的:通常来说,2 到 5 秒,页面体验会比较好,5 到 8 秒还可以接受,8 秒以上基本就很难接受了。另外,据统计当网站慢一秒就会流失十分之一的客户。 +RT 是一个非常重要且直观的指标,RT 数值大小直接反应了系统处理用户请求速度的快慢。 -但是,在某些场景下我们也并不需要太看重 2-5-8 原则 ,比如我觉得系统导出导入大数据量这种就不需要,系统生成系统报告这种也不需要。 +### 并发数 -### 3.2 并发数 +**并发数可以简单理解为系统能够同时供多少人访问使用也就是说系统同时能处理的请求数量。** -**并发数是系统能同时处理请求的数目即同时提交请求的用户数目。** +并发数反应了系统的负载能力。 -不得不说,高并发是现在后端架构中非常非常火热的一个词了,这个与当前的互联网环境以及中国整体的互联网用户量都有很大关系。一般情况下,你的系统并发量越大,说明你的产品做的就越大。但是,并不是每个系统都需要达到像淘宝、12306 这种亿级并发量的。 +### QPS 和 TPS -### 3.3 吞吐量 - -吞吐量指的是系统单位时间内系统处理的请求数量。衡量吞吐量有几个重要的参数:QPS(TPS)、并发数、响应时间。 - -1. QPS(Query Per Second):服务器每秒可以执行的查询次数; -2. TPS(Transaction Per Second):服务器每秒处理的事务数(这里的一个事务可以理解为客户发出请求到收到服务器的过程); -3. 并发数;系统能同时处理请求的数目即同时提交请求的用户数目。 -4. 响应时间:一般取多次请求的平均响应时间 - -理清他们的概念,就很容易搞清楚他们之间的关系了。 - -- **QPS(TPS)** = 并发数/平均响应时间 -- **并发数** = QPS\*平均响应时间 +- **QPS(Query Per Second)** :服务器每秒可以执行的查询次数; +- **TPS(Transaction Per Second)** :服务器每秒处理的事务数(这里的一个事务可以理解为客户发出请求到收到服务器的过程); 书中是这样描述 QPS 和 TPS 的区别的。 > QPS vs TPS:QPS 基本类似于 TPS,但是不同的是,对于一个页面的一次访问,形成一个 TPS;但一次页面请求,可能产生多次对服务器的请求,服务器对这些请求,就可计入“QPS”之中。如,访问一个页面会请求服务器 2 次,一次访问,产生一个“T”,产生 2 个“Q”。 -### 3.4 性能计数器 +### 吞吐量 -**性能计数器是描述服务器或者操作系统的一些数据指标如内存使用、CPU 使用、磁盘与网络 I/O 等情况。** +**吞吐量指的是系统单位时间内系统处理的请求数量。** -### 四 几种常见的性能测试 +一个系统的吞吐量与请求对系统的资源消耗等紧密关联。请求对系统资源消耗越多,系统吞吐能力越低,反之则越高。 + +TPS、QPS 都是吞吐量的常用量化指标。 + +- **QPS(TPS)** = 并发数/平均响应时间(RT) +- **并发数** = QPS \* 平均响应时间(RT) + +## 系统活跃度指标 + +### PV(Page View) + +访问量, 即页面浏览量或点击量,衡量网站用户访问的网页数量;在一定统计周期内用户每打开或刷新一个页面就记录 1 次,多次打开或刷新同一页面则浏览量累计。UV 从网页打开的数量/刷新的次数的角度来统计的。 + +### UV(Unique Visitor) + +独立访客,统计 1 天内访问某站点的用户数。1 天内相同访客多次访问网站,只计算为 1 个独立访客。UV 是从用户个体的角度来统计的。 + +### DAU(Daily Active User) + +日活跃用户数量。 + +### MAU(monthly active users) + +月活跃用户人数。 + +举例:某网站 DAU 为 1200w, 用户日均使用时长 1 小时,RT 为 0.5s,求并发量和 QPS。 + +平均并发量 = DAU(1200w)\* 日均使用时长(1 小时,3600 秒) /一天的秒数(86400)=1200w/24 = 50w + +真实并发量(考虑到某些时间段使用人数比较少) = DAU(1200w)\* 日均使用时长(1 小时,3600 秒) /一天的秒数-访问量比较小的时间段假设为 8 小时(57600)=1200w/16 = 75w + +峰值并发量 = 平均并发量 \* 6 = 300w + +QPS = 真实并发量/RT = 75W/0.5=150w/s + +## 性能测试分类 ### 性能测试 @@ -118,25 +142,27 @@ icon: et-performance 模拟真实场景,给系统一定压力,看看业务是否能稳定运行。 -## 五 常用性能测试工具 +## 常用性能测试工具 -这里就不多扩展了,有时间的话会单独拎一个熟悉的说一下。 +### 后端常用 -### 5.1 后端常用 +既然系统设计涉及到系统性能方面的问题,那在面试的时候,面试官就很可能会问:**你是如何进行性能测试的?** -没记错的话,除了 LoadRunner 其他几款性能测试工具都是开源免费的。 +推荐 4 个比较常用的性能测试工具: -1. Jmeter:Apache JMeter 是 JAVA 开发的性能测试工具。 -2. LoadRunner:一款商业的性能测试工具。 -3. Galtling:一款基于 Scala 开发的高性能服务器性能测试工具。 -4. ab:全称为 Apache Bench 。Apache 旗下的一款测试工具,非常实用。 +1. **Jmeter** :Apache JMeter 是 JAVA 开发的性能测试工具。 +2. **LoadRunner**:一款商业的性能测试工具。 +3. **Galtling** :一款基于 Scala 开发的高性能服务器性能测试工具。 +4. **ab** :全称为 Apache Bench 。Apache 旗下的一款测试工具,非常实用。 -### 5.2 前端常用 +没记错的话,除了 **LoadRunner** 其他几款性能测试工具都是开源免费的。 -1. Fiddler:抓包工具,它可以修改请求的数据,甚至可以修改服务器返回的数据,功能非常强大,是 Web 调试的利器。 -2. HttpWatch: 可用于录制 HTTP 请求信息的工具。 +### 前端常用 -## 六 常见的性能优化策略 +1. **Fiddler**:抓包工具,它可以修改请求的数据,甚至可以修改服务器返回的数据,功能非常强大,是 Web 调试的利器。 +2. **HttpWatch**: 可用于录制 HTTP 请求信息的工具。 + +## 常见的性能优化策略 性能优化之前我们需要对请求经历的各个环节进行分析,排查出可能出现性能瓶颈的地方,定位问题。 diff --git a/docs/high-performance/images/message-queue/message-queue-pub-sub-model.png b/docs/high-performance/images/message-queue/message-queue-pub-sub-model.png deleted file mode 100644 index a5a77736493e71ff3ffbeb7a3c064d58ecdf7520..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49655 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

)rU&qVDoi8@RI|n&? zDz&fq+Pyanx1*4_YjzOR*=?YjZ!W-sV>v}C;cBp`;fSH*8u;&m!xc^4NyeZqM&OsB zB{!L9z+*^%MS38Z>TS8vUxPeN5b&ep-Hwv9O^5*pA?#_Ph??hGS+XmQ9T2I zA3M2Dx|_IacchOx*jsjk&CAHY??vIDXY@?mb zta_Sb_ce1Gy7^

Ez-Sl$UCsL|@&F+rf( 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 BaEkx{ diff --git a/docs/high-performance/message-queue/message-queue.md b/docs/high-performance/message-queue/message-queue.md index 672b9dc7..50582cdd 100644 --- a/docs/high-performance/message-queue/message-queue.md +++ b/docs/high-performance/message-queue/message-queue.md @@ -23,9 +23,9 @@ tag: 参与消息传递的双方称为 **生产者** 和 **消费者** ,生产者负责发送消息,消费者负责处理消息。 -![发布/订阅(Pub/Sub)模型](../images/message-queue/message-queue-pub-sub-model.png) +![发布/订阅(Pub/Sub)模型](https://oss.javaguide.cn/github/javaguide/high-performance/message-queue/message-queue-pub-sub-model.png) -我们知道操作系统中的进程通信的一种很重要的方式就是消息队列。我们这里提到的消息队列稍微有点区别,更多指的是各个服务以及系统内部各个组件/模块之前的通信,属于一种 **中间件** 。 +操作系统中的进程通信的一种很重要的方式就是消息队列。我们这里提到的消息队列稍微有点区别,更多指的是各个服务以及系统内部各个组件/模块之前的通信,属于一种 **中间件** 。 维基百科是这样介绍中间件的: @@ -43,7 +43,7 @@ tag: 通常来说,使用消息队列主要能为我们的系统带来下面三点好处: -1. 通过异步处理提高系统性能(减少响应所需时间) +1. 异步处理 2. 削峰/限流 3. 降低系统耦合性 @@ -51,11 +51,11 @@ tag: 如果在面试的时候你被面试官问到这个问题的话,一般情况是你在你的简历上涉及到消息队列这方面的内容,这个时候推荐你结合你自己的项目来回答。 -### 通过异步处理提高系统性能(减少响应时间) +### 异步处理 ![通过异步处理提高系统性能](https://oss.javaguide.cn/github/javaguide/Asynchronous-message-queue.png) -将用户的请求数据存储到消息队列之后就立即返回结果。随后,系统再对消息进行消费。 +将用户请求中包含的耗时操作,通过消息队列实现异步处理,将对应的消息发送到消息队列之后就立即返回结果,减少响应时间,提高用户体验。随后,系统再对消息进行消费。 因为用户请求数据写入消息队列之后就立即返回给用户了,但是请求数据在后续的业务校验、写数据库等操作中可能失败。因此,**使用消息队列进行异步处理之后,需要适当修改业务流程进行配合**,比如用户在提交订单之后,订单数据写入消息队列,不能立即返回用户订单提交成功,需要在消息队列的订单消费者进程真正处理完该订单之后,甚至出库后,再通过电子邮件或短信通知用户订单成功,以免交易纠纷。这就类似我们平时手机订火车票和电影票。 @@ -69,11 +69,11 @@ tag: ### 降低系统耦合性 -使用消息队列还可以降低系统耦合性。我们知道如果模块之间不存在直接调用,那么新增模块或者修改模块就对其他模块影响较小,这样系统的可扩展性无疑更好一些。还是直接上图吧: +使用消息队列还可以降低系统耦合性。如果模块之间不存在直接调用,那么新增模块或者修改模块就对其他模块影响较小,这样系统的可扩展性无疑更好一些。 -![解耦](https://oss.javaguide.cn/github/javaguide/high-performance/message-queue/%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97-%E8%A7%A3%E8%80%A6.png) +生产者(客户端)发送消息到消息队列中去,消费者(服务端)处理消息,需要消费的系统直接去消息队列取消息进行消费即可而不需要和其他系统有耦合,这显然也提高了系统的扩展性。 -生产者(客户端)发送消息到消息队列中去,接受者(服务端)处理消息,需要消费的系统直接去消息队列取消息进行消费即可而不需要和其他系统有耦合,这显然也提高了系统的扩展性。 +![发布/订阅(Pub/Sub)模型](https://oss.javaguide.cn/github/javaguide/high-performance/message-queue/message-queue-pub-sub-model.png) **消息队列使用发布-订阅模式工作,消息发送者(生产者)发布消息,一个或多个消息接受者(消费者)订阅消息。** 从上图可以看到**消息发送者(生产者)和消息接受者(消费者)之间没有直接耦合**,消息发送者将消息发送至分布式消息队列即结束对消息的处理,消息接受者从分布式消息队列获取该消息后进行后续处理,并不需要知道该消息从何而来。**对新增业务,只要对该类消息感兴趣,即可订阅该消息,对原有系统和业务没有任何影响,从而实现网站业务的可扩展性设计**。 @@ -87,7 +87,7 @@ tag: ### 实现分布式事务 -我们知道分布式事务的解决方案之一就是 MQ 事务。 +分布式事务的解决方案之一就是 MQ 事务。 RocketMQ、 Kafka、Pulsar、QMQ 都提供了事务相关的功能。事务允许事件流应用将消费,处理,生产消息整个过程定义为一个原子操作。 @@ -103,6 +103,14 @@ RocketMQ、 Kafka、Pulsar、QMQ 都提供了事务相关的功能。事务允 消息发送后不会立即被消费,而是指定一个时间,到时间后再消费。大部分消息队列,例如 RocketMQ、RabbitMQ、Pulsar、Kafka,都支持定时/延时消息。 +![](https://oss.javaguide.cn/github/javaguide/tools/docker/rocketmq-schedule-message.png) + +### 即时通讯 + +MQTT(消息队列遥测传输协议)是一种轻量级的通讯协议,采用发布/订阅模式,非常适合于物联网(IoT)等需要在低带宽、高延迟或不可靠网络环境下工作的应用。它支持即时消息传递,即使在网络条件较差的情况下也能保持通信的稳定性。 + +RabbitMQ 内置了 MQTT 插件用于实现 MQTT 功能(默认不启用,需要手动开启)。 + ### 数据流处理 针对分布式系统产生的海量数据流,如业务日志、监控数据、用户行为等,消息队列可以实时或批量收集这些数据,并将其导入到大数据处理引擎中,实现高效的数据流管理和处理。 @@ -133,13 +141,13 @@ JMS 定义了五种不同的消息正文格式以及调用的消息类型,允 #### 点到点(P2P)模型 -![队列模型](../images/message-queue/message-queue-queue-model.png) +![队列模型](https://oss.javaguide.cn/github/javaguide/high-performance/message-queue/message-queue-queue-model.png) 使用**队列(Queue)**作为消息通信载体;满足**生产者与消费者模式**,一条消息只能被一个消费者使用,未被消费的消息在队列中保留直到被消费或超时。比如:我们生产者发送 100 条消息的话,两个消费者来消费一般情况下两个消费者会按照消息发送的顺序各自消费一半(也就是你一个我一个的消费。) #### 发布/订阅(Pub/Sub)模型 -![发布/订阅(Pub/Sub)模型](../images/message-queue/message-queue-pub-sub-model.png) +![发布/订阅(Pub/Sub)模型](https://oss.javaguide.cn/github/javaguide/high-performance/message-queue/message-queue-pub-sub-model.png) 发布订阅模型(Pub/Sub) 使用**主题(Topic)**作为消息通信载体,类似于**广播模式**;发布者发布一条消息,该消息通过主题传递给所有的订阅者。 diff --git a/docs/open-source-project/system-design.md b/docs/open-source-project/system-design.md index e4197052..d3a3e92b 100644 --- a/docs/open-source-project/system-design.md +++ b/docs/open-source-project/system-design.md @@ -71,6 +71,7 @@ icon: "xitongsheji" - [MyBatis-Plus](https://github.com/baomidou/mybatis-plus) : [MyBatis](http://www.mybatis.org/mybatis-3/) 增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 - [MyBatis-Flex](https://gitee.com/mybatis-flex/mybatis-flex):一个优雅的 MyBatis 增强框架,无其他任何第三方依赖,支持 CRUD、分页查询、多表查询、批量操作。 +- [jOOQ](https://github.com/jOOQ/jOOQ):用 Java 编写 SQL 的最佳方式。 - [Redisson](https://github.com/redisson/redisson "redisson"):Redis 基础上的一个 Java 驻内存数据网格(In-Memory Data Grid),支持超过 30 个对象和服务:`Set`,`SortedSet`, `Map`, `List`, `Queue`, `Deque` ……,并且提供了多种分布式锁的实现。更多介绍请看:[《Redisson 项目介绍》](https://github.com/redisson/redisson/wiki/Redisson%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D "Redisson项目介绍")。 ### 数据同步 diff --git a/docs/readme.md b/docs/readme.md index 483e0b25..ec8e0b87 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -20,7 +20,7 @@ footer: |- JavaGuide 已经持续维护 5 年多了,累计提交了 **5000+** commit ,共有 **440** 多位朋友参与维护。真心希望能够把这个项目做好,真正能够帮助到有需要的朋友! -如果觉得 JavaGuide 的内容对你有帮助的话,还请点个免费的 Star(绝不强制点 Star,你觉得内容不错再点赞就好),这是对我最大的鼓励,感谢各位一起同行,共勉!传送门:[GitHub](https://github.com/Snailclimb/JavaGuide) | [Gitee](https://gitee.com/SnailClimb/JavaGuide)。 +如果觉得 JavaGuide 的内容对你有帮助的话,还请点个免费的 Star(绝不强制点 Star,觉得内容不错有收货再点赞就好),这是对我最大的鼓励,感谢各位一路同行,共勉!传送门:[GitHub](https://github.com/Snailclimb/JavaGuide) | [Gitee](https://gitee.com/SnailClimb/JavaGuide)。 - [项目介绍](./javaguide/intro.md) - [贡献指南](./javaguide/contribution-guideline.md)