<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>八股总结 on GoClub</title><link>https://go.botsarena.tech/docs/baguwen/</link><description>Recent content in 八股总结 on GoClub</description><generator>Hugo</generator><language>zh-cn</language><atom:link href="https://go.botsarena.tech/docs/baguwen/index.xml" rel="self" type="application/rss+xml"/><item><title>每日一问</title><link>https://go.botsarena.tech/docs/baguwen/daily-question/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://go.botsarena.tech/docs/baguwen/daily-question/</guid><description>&lt;h1 id="每日一问"&gt;
 &lt;a class="page-home-link" href="https://go.botsarena.tech/"&gt;每日一问&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;记录微信交流群中每天的提问。&lt;/p&gt;

&lt;h2 id="20260825"&gt;2026.08.25&lt;a class="anchor" href="#20260825"&gt;#&lt;/a&gt;&lt;/h2&gt;


&lt;h3 id="raft中多数派为什么是n--2--1"&gt;raft中多数派为什么是n / 2 + 1&lt;a class="anchor" href="#raft%e4%b8%ad%e5%a4%9a%e6%95%b0%e6%b4%be%e4%b8%ba%e4%bb%80%e4%b9%88%e6%98%afn--2--1"&gt;#&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;为了保证系统的强一致性，必须确保读操作能读到最新的写操作，这就要求读集合（R）和写集合（W）必须有交集，即满足 |W| + |R| &amp;gt; N（N 为总节点数）。
在满足该公式的前提下，系统的设计需要在可用性和可靠性之间做权衡：
如果要求全部节点写入成功（W=N, R=1），读取极快，但任何一个节点宕机都会导致系统不可写，可用性极差。&lt;/p&gt;
&lt;p&gt;如果只需一个节点写入（W=1, R=N），写入极快，但每次读取必须全量查询所有节点，容错性同样极差。&lt;/p&gt;
&lt;p&gt;为了在这两者之间取一个最佳的“中间值”，Raft 和 Paxos 等算法通常将 N 设为奇数，并要求写入和读取都达到多数派（W = R = N/2 + 1）。这样不仅完美满足了 |W| + |R| &amp;gt; N，保证了读写集合的交集，同时也能容忍少数派（(N-1)/2 个）节点的宕机，实现了可用性和可靠性的最优解。&lt;/p&gt;
&lt;p&gt;额外练习：
以下代码有死锁的风险吗&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;package&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;sync&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Service 抽象的服务，管理共享数据和事件分发&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;type&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Service&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;mu&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sync&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Mutex&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;data&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;eventCh&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;chan&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#75715e"&gt;//带缓冲的channel&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// PublishEvent 模拟服务端内部逻辑：更新数据并广播事件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;s&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;Service&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;PublishEvent&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;s&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;mu&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Lock&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;defer&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;s&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;mu&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Unlock&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;s&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;data&lt;/span&gt;&lt;span style="color:#f92672"&gt;++&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;s&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;eventCh&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;s&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// RPC_UpdateData 模拟暴露给客户端的同步调用接口&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;s&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;Service&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;RPC_UpdateData&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;val&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;s&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;mu&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Lock&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;defer&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;s&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;mu&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Unlock&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;s&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;data&lt;/span&gt; = &lt;span style="color:#a6e22e"&gt;val&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 客户端按照以下方式使用Service
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;for {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; select {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; case val, ok := &amp;lt;-cmdCh:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; if !ok {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; return
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; svc.RPC_UpdateData(val)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; case _, ok := &amp;lt;-svc.eventCh:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; if !ok {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; return
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; // 处理服务端推送的事件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;答案：有，PublishEvent在向channel发送数据时加锁可能会导致死锁&lt;/p&gt;</description></item><item><title>Go</title><link>https://go.botsarena.tech/docs/baguwen/Go/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://go.botsarena.tech/docs/baguwen/Go/</guid><description>&lt;h1 id="go"&gt;
 &lt;a class="page-home-link" href="https://go.botsarena.tech/"&gt;Go&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;这里整理 Go 面试中高频出现的语言、并发、运行时和工程相关问题，适合作为专题复习提纲。&lt;/p&gt;

&lt;h2 id="1-为什么选-go-语言"&gt;1. 为什么选 Go 语言&lt;a class="anchor" href="#1-%e4%b8%ba%e4%bb%80%e4%b9%88%e9%80%89-go-%e8%af%ad%e8%a8%80"&gt;#&lt;/a&gt;&lt;/h2&gt;

&lt;details class="qa-answer"&gt;
&lt;summary class="qa-answer-toggle"&gt;查看答案&lt;/summary&gt;
&lt;div class="qa-answer-body"&gt;
&lt;p&gt;&lt;strong&gt;可直接说：&lt;/strong&gt; 我选择 Go，主要看重它在后端服务里的工程效率、并发能力和部署体验。Go 语法简洁、编译快、标准工具链完善，团队协作时容易形成统一代码风格；goroutine 和 channel 让并发代码更轻量，适合 I/O 密集、高并发服务；编译后的单二进制方便容器化和发布，配合云原生生态做微服务、网关、基础设施工具很顺手。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;要答的点：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;工程效率：语法小、编译快、&lt;code&gt;gofmt&lt;/code&gt;、&lt;code&gt;go test&lt;/code&gt;、&lt;code&gt;go mod&lt;/code&gt; 等工具链统一。&lt;/li&gt;
&lt;li&gt;并发能力：goroutine 初始栈小，由运行时调度，channel 提供类型安全通信。&lt;/li&gt;
&lt;li&gt;服务端适配：标准库覆盖 HTTP、JSON、SQL、加密等常用能力，适合网络服务。&lt;/li&gt;
&lt;li&gt;部署体验：单二进制交付，容器化和跨平台构建成本低。&lt;/li&gt;
&lt;li&gt;取舍意识：Go 适合业务服务、云原生基础设施、CLI 工具和中间件开发。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;重点讲解摘录：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Go 官方文档说 Go 是 “expressive, concise, clean, and efficient”，面试时可以把它落到工程效率上：代码风格统一、样板代码少、构建反馈快。&lt;/li&gt;
&lt;li&gt;Go 云服务专题提到 Go 的 “built-in support for concurrency”，对应后端场景里的高并发连接、异步任务、RPC 服务和网关转发。&lt;/li&gt;
&lt;li&gt;Go FAQ 说 Go 试图 “combine the ease of programming” 与静态编译语言的效率和安全性，这正是 Go 在业务服务里的核心价值。&lt;/li&gt;
&lt;li&gt;Effective Go 说明 goroutine “costing little more than the allocation of stack space”，可以用来解释 goroutine 比直接管理线程更轻量。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;原文链接：&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>MySQL</title><link>https://go.botsarena.tech/docs/baguwen/MySQL/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://go.botsarena.tech/docs/baguwen/MySQL/</guid><description>&lt;h1 id="mysql"&gt;
 &lt;a class="page-home-link" href="https://go.botsarena.tech/"&gt;MySQL&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;这里按基础、索引、事务、锁和日志几个方向整理 MySQL 常见面试题，适合系统梳理数据库知识。&lt;/p&gt;

&lt;h2 id="基础"&gt;基础&lt;a class="anchor" href="#%e5%9f%ba%e7%a1%80"&gt;#&lt;/a&gt;&lt;/h2&gt;


&lt;h3 id="增删改查的语法"&gt;增删改查的语法&lt;a class="anchor" href="#%e5%a2%9e%e5%88%a0%e6%94%b9%e6%9f%a5%e7%9a%84%e8%af%ad%e6%b3%95"&gt;#&lt;/a&gt;&lt;/h3&gt;

&lt;details class="qa-answer"&gt;
&lt;summary class="qa-answer-toggle"&gt;查看答案&lt;/summary&gt;
&lt;div class="qa-answer-body"&gt;
&lt;p&gt;&lt;strong&gt;可直接说：&lt;/strong&gt; 核心是 &lt;code&gt;SELECT/INSERT/UPDATE/DELETE&lt;/code&gt; 四类语句，面试更看你是否会结合条件、排序、分页和事务使用。查询用 &lt;code&gt;SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ... LIMIT&lt;/code&gt;；插入用 &lt;code&gt;INSERT INTO ... VALUES ...&lt;/code&gt; 或 &lt;code&gt;INSERT ... SELECT&lt;/code&gt;；更新用 &lt;code&gt;UPDATE ... SET ... WHERE ...&lt;/code&gt;；删除用 &lt;code&gt;DELETE FROM ... WHERE ...&lt;/code&gt;。修改类语句上线前要确认条件、影响行数和事务边界。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;要答的点：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SELECT&lt;/code&gt;：查询数据，常配合过滤、分组、排序、分页。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;INSERT&lt;/code&gt;：插入单行、多行，或从查询结果写入。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;UPDATE&lt;/code&gt;：按条件定位行，再用 &lt;code&gt;SET&lt;/code&gt; 修改列。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DELETE&lt;/code&gt;：按条件删除行，核心是控制影响范围。&lt;/li&gt;
&lt;li&gt;事务：多个修改语句用事务包起来，失败时回滚。&lt;/li&gt;
&lt;li&gt;安全：线上修改先 &lt;code&gt;SELECT&lt;/code&gt; 验证条件，再执行修改。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;重点讲解摘录：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MySQL 官方把 &lt;code&gt;SELECT&lt;/code&gt;、&lt;code&gt;INSERT&lt;/code&gt;、&lt;code&gt;UPDATE&lt;/code&gt;、&lt;code&gt;DELETE&lt;/code&gt; 放在 DML 章节。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SELECT&lt;/code&gt; 语法覆盖投影、表引用、条件、分组、过滤、排序和分页。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;UPDATE&lt;/code&gt; 和 &lt;code&gt;DELETE&lt;/code&gt; 都强依赖 &lt;code&gt;WHERE&lt;/code&gt; 控制影响行范围。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;COMMIT&lt;/code&gt; 让事务修改永久生效，&lt;code&gt;ROLLBACK&lt;/code&gt; 取消当前事务修改。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;原文链接：&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>RabbitMQ</title><link>https://go.botsarena.tech/docs/baguwen/RabbitMQ/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://go.botsarena.tech/docs/baguwen/RabbitMQ/</guid><description>&lt;h1 id="rabbitmq"&gt;
 &lt;a class="page-home-link" href="https://go.botsarena.tech/"&gt;RabbitMQ&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;这里主要整理消息队列相关的高频面试题，包括 RabbitMQ、自身机制以及和 Kafka、RocketMQ 的对比。&lt;/p&gt;

&lt;h2 id="1-rabbitmqkafkarocketmq-对比"&gt;1. RabbitMQ、Kafka、RocketMQ 对比&lt;a class="anchor" href="#1-rabbitmqkafkarocketmq-%e5%af%b9%e6%af%94"&gt;#&lt;/a&gt;&lt;/h2&gt;

&lt;details class="qa-answer"&gt;
&lt;summary class="qa-answer-toggle"&gt;查看答案&lt;/summary&gt;
&lt;div class="qa-answer-body"&gt;
&lt;p&gt;&lt;strong&gt;可直接说：&lt;/strong&gt; RabbitMQ、Kafka、RocketMQ 都能做异步解耦、削峰填谷和事件传递，侧重点不同。RabbitMQ 基于 AMQP，Exchange 路由模型成熟，Direct、Topic、Fanout 等交换机适合复杂业务路由和任务队列；Kafka 是分布式事件流平台，分区、顺序追加写和消费位点让它适合日志、埋点、实时计算和数据管道；RocketMQ 面向业务消息能力更完整，顺序消息、事务消息、延时消息和消息轨迹适合订单、支付、交易链路。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;消息队列&lt;/th&gt;
 &lt;th&gt;核心优势&lt;/th&gt;
 &lt;th&gt;适合场景&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;RabbitMQ&lt;/td&gt;
 &lt;td&gt;AMQP 成熟，Exchange 路由灵活，确认、死信、延迟等业务能力常用&lt;/td&gt;
 &lt;td&gt;业务系统解耦、任务队列、后台异步、复杂路由、失败重试&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Kafka&lt;/td&gt;
 &lt;td&gt;分区并行、顺序追加、高吞吐、位点管理清晰、生态偏流式处理&lt;/td&gt;
 &lt;td&gt;日志采集、埋点上报、实时计算、数据湖同步、事件流平台&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;RocketMQ&lt;/td&gt;
 &lt;td&gt;事务消息、顺序消息、延时消息、消息轨迹等业务特性集中&lt;/td&gt;
 &lt;td&gt;电商订单、金融支付、交易链路、分布式事务最终一致性&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;要答的点：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RabbitMQ：强调路由灵活、可靠投递和传统业务消息。&lt;/li&gt;
&lt;li&gt;Kafka：强调高吞吐、可回放、分区并行和事件流生态。&lt;/li&gt;
&lt;li&gt;RocketMQ：强调业务消息特性，尤其事务、顺序、延迟。&lt;/li&gt;
&lt;li&gt;顺序性：RabbitMQ 队列内顺序；Kafka 分区内顺序；RocketMQ 可按 MessageQueue 保序。&lt;/li&gt;
&lt;li&gt;可靠性：都需要生产确认、持久化/副本、消费确认或位点提交。&lt;/li&gt;
&lt;li&gt;选型：复杂路由选 RabbitMQ，大规模日志流选 Kafka，交易消息链路选 RocketMQ。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;重点讲解摘录：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RabbitMQ 文档把 Exchange 描述为接收生产者消息并路由到队列的组件。&lt;/li&gt;
&lt;li&gt;Kafka 官方把 Kafka 定位为 “distributed event streaming platform”。&lt;/li&gt;
&lt;li&gt;Kafka 文档说明 Topic 可分为 partitions，并支持消费者通过 offset 控制消费位置。&lt;/li&gt;
&lt;li&gt;RocketMQ 文档把事务消息、顺序消息、延迟消息列为常见消息类型能力。&lt;/li&gt;
&lt;li&gt;面试对比要落到业务场景，避免只背吞吐量和名词。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;原文链接：&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Redis</title><link>https://go.botsarena.tech/docs/baguwen/Redis/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://go.botsarena.tech/docs/baguwen/Redis/</guid><description>&lt;h1 id="redis"&gt;
 &lt;a class="page-home-link" href="https://go.botsarena.tech/"&gt;Redis&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;这里主要覆盖 Redis 的数据结构、持久化、高可用、热点问题和面试中的常见追问。&lt;/p&gt;

&lt;h2 id="基础"&gt;基础&lt;a class="anchor" href="#%e5%9f%ba%e7%a1%80"&gt;#&lt;/a&gt;&lt;/h2&gt;


&lt;h3 id="redis-和-mysql-区别为什么-redis-更快"&gt;Redis 和 MySQL 区别，为什么 Redis 更快&lt;a class="anchor" href="#redis-%e5%92%8c-mysql-%e5%8c%ba%e5%88%ab%e4%b8%ba%e4%bb%80%e4%b9%88-redis-%e6%9b%b4%e5%bf%ab"&gt;#&lt;/a&gt;&lt;/h3&gt;

&lt;details class="qa-answer"&gt;
&lt;summary class="qa-answer-toggle"&gt;查看答案&lt;/summary&gt;
&lt;div class="qa-answer-body"&gt;
&lt;p&gt;&lt;strong&gt;可直接说：&lt;/strong&gt; Redis 是内存数据结构存储，常用于缓存、计数、排行榜、会话、消息流等实时场景；MySQL 是关系型数据库，侧重事务、持久化、一致性、复杂查询和关联分析。Redis 快主要来自数据主要在内存中、命令执行路径短、内置结构高效、单线程事件循环减少锁竞争和线程切换。MySQL 也有 Buffer Pool，但还要维护 SQL 优化、事务隔离、锁、redo/binlog、刷盘和崩溃恢复。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;要答的点：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;定位：Redis 偏缓存和实时数据结构，MySQL 偏关系建模和事务主库。&lt;/li&gt;
&lt;li&gt;存储：Redis 主要内存访问，MySQL 通过 Buffer Pool、索引页和磁盘页访问。&lt;/li&gt;
&lt;li&gt;性能：Redis 命令短路径、事件循环、数据结构针对场景优化。&lt;/li&gt;
&lt;li&gt;MySQL 优势：事务、复杂 SQL、可靠持久化、约束和恢复能力。&lt;/li&gt;
&lt;li&gt;选型：热点数据和短期状态用 Redis，核心事实数据用 MySQL。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;重点讲解摘录：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Redis 官方把 Redis 定义为 “in-memory data structure store”。&lt;/li&gt;
&lt;li&gt;Redis 官方介绍提到亚毫秒级响应和数据结构能力。&lt;/li&gt;
&lt;li&gt;Redis latency 文档说明正常简单命令执行时间很短。&lt;/li&gt;
&lt;li&gt;MySQL InnoDB Buffer Pool 缓存表和索引数据，提高读性能。&lt;/li&gt;
&lt;li&gt;MySQL ACID 文档说明 InnoDB 为可靠业务数据提供事务能力。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;原文链接：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://redis.io/tutorials/what-is-redis/"&gt;Redis: What is Redis?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://redis.io/docs/latest/operate/oss_and_stack/management/optimization/latency/"&gt;Redis Docs: Diagnosing latency issues&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://redis.io/docs/latest/develop/using-commands/pipelining/"&gt;Redis Docs: Redis pipelining&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.mysql.com/doc/refman/8.4/en/innodb-buffer-pool.html"&gt;MySQL 8.4: InnoDB Buffer Pool&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.mysql.com/doc/refman/8.4/en/mysql-acid.html"&gt;MySQL 8.4: InnoDB and ACID&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/details&gt;

&lt;h3 id="redis-的应用场景"&gt;Redis 的应用场景&lt;a class="anchor" href="#redis-%e7%9a%84%e5%ba%94%e7%94%a8%e5%9c%ba%e6%99%af"&gt;#&lt;/a&gt;&lt;/h3&gt;

&lt;details class="qa-answer"&gt;
&lt;summary class="qa-answer-toggle"&gt;查看答案&lt;/summary&gt;
&lt;div class="qa-answer-body"&gt;
&lt;p&gt;&lt;strong&gt;可直接说：&lt;/strong&gt; Redis 适合访问频率高、实时性强、生命周期相对短、结构清晰的数据。常见场景包括缓存、会话存储、计数器、限流、分布式锁、排行榜、热点统计、延迟任务、Pub/Sub 通知、Stream 消息流和地理位置查询。面试里要强调 Redis 通常作为 MySQL 等主存储的加速层和实时状态层，核心业务事实数据仍要落到可靠持久存储。&lt;/p&gt;</description></item><item><title>常用工具</title><link>https://go.botsarena.tech/docs/baguwen/Tools/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://go.botsarena.tech/docs/baguwen/Tools/</guid><description>&lt;h1 id="常用工具"&gt;
 &lt;a class="page-home-link" href="https://go.botsarena.tech/"&gt;常用工具&lt;/a&gt;
&lt;/h1&gt;


&lt;h2 id="git"&gt;Git&lt;a class="anchor" href="#git"&gt;#&lt;/a&gt;&lt;/h2&gt;


&lt;h3 id="git-的工作区暂存区和本地仓库分别是什么"&gt;Git 的工作区、暂存区和本地仓库分别是什么&lt;a class="anchor" href="#git-%e7%9a%84%e5%b7%a5%e4%bd%9c%e5%8c%ba%e6%9a%82%e5%ad%98%e5%8c%ba%e5%92%8c%e6%9c%ac%e5%9c%b0%e4%bb%93%e5%ba%93%e5%88%86%e5%88%ab%e6%98%af%e4%bb%80%e4%b9%88"&gt;#&lt;/a&gt;&lt;/h3&gt;

&lt;details class="qa-answer"&gt;
&lt;summary class="qa-answer-toggle"&gt;查看答案&lt;/summary&gt;
&lt;div class="qa-answer-body"&gt;
&lt;p&gt;&lt;strong&gt;可直接说：&lt;/strong&gt; 工作区是你正在编辑的项目文件；暂存区是下一次提交的候选快照；本地仓库是 &lt;code&gt;.git&lt;/code&gt; 目录里保存提交历史、分支、标签和对象数据库的地方。典型流程是修改工作区文件，用 &lt;code&gt;git add&lt;/code&gt; 把变更放入暂存区，再用 &lt;code&gt;git commit&lt;/code&gt; 把暂存区快照写成本地仓库里的一个提交。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;要答的点：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;工作区：真实文件目录，承载当前编辑内容。&lt;/li&gt;
&lt;li&gt;暂存区：index，保存下一次 commit 的内容。&lt;/li&gt;
&lt;li&gt;本地仓库：&lt;code&gt;.git&lt;/code&gt; 目录，保存对象、引用和历史。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git status&lt;/code&gt;：查看工作区和暂存区状态。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git add&lt;/code&gt;：把工作区变更加入暂存区。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git commit&lt;/code&gt;：把暂存区快照写入本地仓库。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;重点讲解摘录：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pro Git 把 Git 项目分为 working tree、staging area 和 Git directory。&lt;/li&gt;
&lt;li&gt;Git 官方文档把 index 描述为暂存下一次提交内容的区域。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git status&lt;/code&gt; 会同时显示 staged 和 unstaged changes。&lt;/li&gt;
&lt;li&gt;提交对象记录快照、作者、提交者、父提交和提交信息。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;原文链接：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/book/en/v2/Getting-Started-Git-Basics"&gt;Pro Git: Getting Started - Git Basics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/docs/git-add"&gt;Git Documentation: git-add&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/docs/git-status"&gt;Git Documentation: git-status&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/docs/git-commit"&gt;Git Documentation: git-commit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/details&gt;

&lt;h3 id="git-pull-和-git-fetch-的区别"&gt;&lt;code&gt;git pull&lt;/code&gt; 和 &lt;code&gt;git fetch&lt;/code&gt; 的区别&lt;a class="anchor" href="#git-pull-%e5%92%8c-git-fetch-%e7%9a%84%e5%8c%ba%e5%88%ab"&gt;#&lt;/a&gt;&lt;/h3&gt;

&lt;details class="qa-answer"&gt;
&lt;summary class="qa-answer-toggle"&gt;查看答案&lt;/summary&gt;
&lt;div class="qa-answer-body"&gt;
&lt;p&gt;&lt;strong&gt;可直接说：&lt;/strong&gt; &lt;code&gt;git fetch&lt;/code&gt; 只从远程拉取最新对象和远程跟踪分支，不改当前工作分支；&lt;code&gt;git pull&lt;/code&gt; 等于先 fetch，再把远程分支整合到当前分支，默认通常执行 merge，也可以配置或使用参数执行 rebase。日常协作里想先看远程变化就用 fetch，确定要整合再 merge 或 rebase。&lt;/p&gt;</description></item><item><title>操作系统</title><link>https://go.botsarena.tech/docs/baguwen/OS/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://go.botsarena.tech/docs/baguwen/OS/</guid><description>&lt;h1 id="操作系统"&gt;
 &lt;a class="page-home-link" href="https://go.botsarena.tech/"&gt;操作系统&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;这里用于整理操作系统面试中的高频基础问题，重点围绕内存、进程线程、调度与文件系统等主题。&lt;/p&gt;

&lt;h2 id="内存"&gt;内存&lt;a class="anchor" href="#%e5%86%85%e5%ad%98"&gt;#&lt;/a&gt;&lt;/h2&gt;


&lt;h3 id="虚拟内存是什么为什么要有"&gt;虚拟内存是什么？为什么要有？&lt;a class="anchor" href="#%e8%99%9a%e6%8b%9f%e5%86%85%e5%ad%98%e6%98%af%e4%bb%80%e4%b9%88%e4%b8%ba%e4%bb%80%e4%b9%88%e8%a6%81%e6%9c%89"&gt;#&lt;/a&gt;&lt;/h3&gt;

&lt;details class="qa-answer"&gt;
&lt;summary class="qa-answer-toggle"&gt;查看答案&lt;/summary&gt;
&lt;div class="qa-answer-body"&gt;
&lt;p&gt;&lt;strong&gt;可直接说：&lt;/strong&gt; 虚拟内存是操作系统给每个进程提供的独立逻辑地址空间，进程访问的是虚拟地址，CPU 和操作系统通过页表把它映射到物理内存或磁盘中的后备存储。它的价值是进程隔离、按需加载、简化内存管理、支持更大的地址空间。即使物理内存有限，系统也可以把暂时不用的页面换出，把正在使用的页面换入。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;要答的点：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;抽象：每个进程看到连续、独立的虚拟地址空间。&lt;/li&gt;
&lt;li&gt;映射：虚拟地址通过页表映射到物理页框。&lt;/li&gt;
&lt;li&gt;隔离：进程之间默认不能直接访问对方地址空间。&lt;/li&gt;
&lt;li&gt;按需调页：访问到尚未装入内存的页时触发缺页处理。&lt;/li&gt;
&lt;li&gt;内存利用：降低连续物理内存需求，提升多进程并发运行能力。&lt;/li&gt;
&lt;li&gt;成本：页表、TLB miss、缺页换入和换出都会带来额外开销。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;重点讲解摘录：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OSTEP 把虚拟化内存描述为每个进程拥有自己的私有地址空间。&lt;/li&gt;
&lt;li&gt;Linux 内核文档说明虚拟内存系统管理虚拟地址到物理内存的映射。&lt;/li&gt;
&lt;li&gt;Intel 手册把分页描述为线性地址到物理地址的转换机制。&lt;/li&gt;
&lt;li&gt;xv6 book 把页表作为地址转换和进程隔离的核心结构。&lt;/li&gt;
&lt;li&gt;面试回答要同时讲收益和代价，体现工程取舍。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;原文链接：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pages.cs.wisc.edu/~remzi/OSTEP/"&gt;OSTEP: Virtualization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.kernel.org/mm/index.html"&gt;Linux Kernel Documentation: Memory Management&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html"&gt;Intel 64 and IA-32 Architectures SDM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pdos.csail.mit.edu/6.828/2023/xv6/book-riscv-rev3.pdf"&gt;xv6 book: Page tables&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/details&gt;

&lt;h3 id="内存分页的好处和问题"&gt;内存分页的好处和问题&lt;a class="anchor" href="#%e5%86%85%e5%ad%98%e5%88%86%e9%a1%b5%e7%9a%84%e5%a5%bd%e5%a4%84%e5%92%8c%e9%97%ae%e9%a2%98"&gt;#&lt;/a&gt;&lt;/h3&gt;

&lt;details class="qa-answer"&gt;
&lt;summary class="qa-answer-toggle"&gt;查看答案&lt;/summary&gt;
&lt;div class="qa-answer-body"&gt;
&lt;p&gt;&lt;strong&gt;可直接说：&lt;/strong&gt; 分页把虚拟地址空间和物理内存都切成固定大小的页，虚拟页通过页表映射到物理页框。好处是管理简单、减少外部碎片、支持非连续物理内存分配、支持按需加载和换页；问题是会产生页表内存开销、地址转换开销、TLB miss、内部碎片和缺页 I/O 成本。面试里要把“固定大小带来简单”和“页表/缺页带来成本”一起讲。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;要答的点：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;固定粒度：常见页大小是 4KB，也支持大页。&lt;/li&gt;
&lt;li&gt;减少外部碎片：物理页框固定大小，分配更容易。&lt;/li&gt;
&lt;li&gt;支持虚拟内存：虚拟页可以映射到任意物理页框。&lt;/li&gt;
&lt;li&gt;支持换页：冷页可以换出到磁盘，热页按需换入。&lt;/li&gt;
&lt;li&gt;页表成本：页表本身占内存，多级页表用于降低稀疏地址空间成本。&lt;/li&gt;
&lt;li&gt;性能成本：TLB miss 和缺页会显著拉高访问延迟。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;重点讲解摘录：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OSTEP 分页章节强调固定大小页让空间管理更灵活。&lt;/li&gt;
&lt;li&gt;Linux 内核文档把页表描述为虚拟内存管理的核心数据结构。&lt;/li&gt;
&lt;li&gt;Intel 手册说明 TLB 用来缓存线性地址到物理地址转换结果。&lt;/li&gt;
&lt;li&gt;缺页会让 CPU 进入内核，由内核完成页面分配、换入或异常处理。&lt;/li&gt;
&lt;li&gt;内部碎片来自最后一页未完全使用的空间。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;原文链接：&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>计算机网络</title><link>https://go.botsarena.tech/docs/baguwen/CN/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://go.botsarena.tech/docs/baguwen/CN/</guid><description>&lt;h1 id="计算机网络"&gt;
 &lt;a class="page-home-link" href="https://go.botsarena.tech/"&gt;计算机网络&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;这里整理计算机网络面试里的常见问题，覆盖 DNS、TCP、HTTP、HTTPS 和排障思路等主题。&lt;/p&gt;

&lt;h2 id="基础"&gt;基础&lt;a class="anchor" href="#%e5%9f%ba%e7%a1%80"&gt;#&lt;/a&gt;&lt;/h2&gt;


&lt;h3 id="输入一个-url-会发生什么"&gt;输入一个 URL 会发生什么？&lt;a class="anchor" href="#%e8%be%93%e5%85%a5%e4%b8%80%e4%b8%aa-url-%e4%bc%9a%e5%8f%91%e7%94%9f%e4%bb%80%e4%b9%88"&gt;#&lt;/a&gt;&lt;/h3&gt;

&lt;details class="qa-answer"&gt;
&lt;summary class="qa-answer-toggle"&gt;查看答案&lt;/summary&gt;
&lt;div class="qa-answer-body"&gt;
&lt;p&gt;&lt;strong&gt;可直接说：&lt;/strong&gt; 浏览器输入 URL 后，先解析 URL 并确定协议、域名、端口和路径；然后通过缓存和 DNS 系统把域名解析成 IP；再建立传输连接，HTTP/1.1 和 HTTP/2 常走 TCP，HTTPS 还要完成 TLS 握手，HTTP/3 走 QUIC；连接建立后浏览器发送 HTTP 请求，服务端返回响应；浏览器解析 HTML，下载 CSS、JS、图片等资源，构建 DOM/CSSOM，完成布局、绘制和合成。连接后续可能复用，也可能按协议和服务端策略关闭。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;要答的点：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;URL 解析：确定 scheme、host、port、path、query。&lt;/li&gt;
&lt;li&gt;DNS：先查浏览器/系统/本地 DNS 缓存，再走递归解析和权威解析。&lt;/li&gt;
&lt;li&gt;建连：TCP 三次握手；HTTPS 增加 TLS 握手；HTTP/3 基于 QUIC。&lt;/li&gt;
&lt;li&gt;请求响应：发送 HTTP 请求，服务端处理后返回状态码、响应头和响应体。&lt;/li&gt;
&lt;li&gt;渲染：解析 HTML/CSS/JS，构建 DOM、CSSOM、渲染树，布局、绘制、合成。&lt;/li&gt;
&lt;li&gt;连接管理：Keep-Alive、多路复用、缓存、重定向、Cookie 等都会影响真实链路。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;重点讲解摘录：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MDN 的 Web 工作原理文章把过程拆成 DNS 找到服务器地址、浏览器向服务器发送请求、服务器返回页面副本。&lt;/li&gt;
&lt;li&gt;MDN 浏览器渲染文档提到，浏览器得到资源后会解析 HTML、CSS、JavaScript，再进行布局和绘制。&lt;/li&gt;
&lt;li&gt;RFC 9293 把 TCP 建连称为 “three-way handshake”，这是 HTTP over TCP 的基础。&lt;/li&gt;
&lt;li&gt;RFC 8446 说明 TLS 的目标是为通信应用提供安全通道，HTTPS 的安全性来自这一层。&lt;/li&gt;
&lt;li&gt;RFC 9114 说明 HTTP/3 使用 QUIC 传输，适合回答 HTTP/3 和前两代的建连差异。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;原文链接：&lt;/strong&gt;&lt;/p&gt;</description></item></channel></rss>