<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Carlos258 (chc258)</title>
    <link>https://www.w2solo.com/Carlos258</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>PanSou 盘搜得 - 从 Next.js 到 Go 的架构重构实践</title>
      <description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://pansou.de" rel="nofollow" target="_blank" title=""&gt;PanSou 盘搜得&lt;/a&gt; 是一个夸克网盘资源聚合搜索平台，上线以来月活用户超过 200 万，索引资源量达 800 万 + 条。随着用户规模增长，原有的 Next.js 架构逐渐暴露出一些问题，最终决定进行一次彻底的架构重构。&lt;/p&gt;
&lt;h2 id="旧架构的痛点"&gt;旧架构的痛点&lt;/h2&gt;
&lt;p&gt;初版架构采用 &lt;strong&gt;Next.js + BullMQ + PostgreSQL + Redis&lt;/strong&gt; 的组合：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Next.js 负责前端渲染和 API Routes&lt;/li&gt;
&lt;li&gt;BullMQ 处理异步任务（资源转存、定时清理）&lt;/li&gt;
&lt;li&gt;PostgreSQL 存储资源索引和转存记录&lt;/li&gt;
&lt;li&gt;Redis 做查询缓存和任务队列&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这套架构在早期运行良好，但随着流量增长，问题逐渐显现：&lt;/p&gt;
&lt;h3 id="1. 并发处理能力受限"&gt;1. &lt;strong&gt;并发处理能力受限&lt;/strong&gt;
&lt;/h3&gt;
&lt;p&gt;Next.js 底层基于 Node.js 单线程模型，在高并发场景下压力明显。搜索请求需要调用上游 API、数据库查询、Redis 缓存，在流量高峰期 P99 响应时间经常突破 2 秒。&lt;/p&gt;
&lt;h3 id="2. 资源占用偏高"&gt;2. &lt;strong&gt;资源占用偏高&lt;/strong&gt;
&lt;/h3&gt;
&lt;p&gt;Next.js 进程内存占用大，加上 BullMQ Worker 进程，整体资源消耗不低。在用户量翻倍后，服务器成本压力开始显现。&lt;/p&gt;
&lt;h3 id="3. 维护复杂度上升"&gt;3. &lt;strong&gt;维护复杂度上升&lt;/strong&gt;
&lt;/h3&gt;
&lt;p&gt;API Routes、Service 层、Worker 任务散落在不同模块，依赖链路长，排查问题需要跨多个层级。&lt;/p&gt;
&lt;h3 id="4. 定时任务可靠性不足"&gt;4. &lt;strong&gt;定时任务可靠性不足&lt;/strong&gt;
&lt;/h3&gt;
&lt;p&gt;BullMQ 虽然成熟，但在资源清理这种长周期任务上偶尔会出现任务堆积，需要人工介入重启。&lt;/p&gt;
&lt;h2 id="重构方案"&gt;重构方案&lt;/h2&gt;
&lt;p&gt;核心思路是&lt;strong&gt;前后端彻底分离，业务逻辑下沉到性能更强的 Go 服务&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="新架构设计"&gt;新架构设计&lt;/h3&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;用户请求
    ↓
宝塔 Nginx（反代）
    ↓
Docker 内部 Nginx
    ├─ /api/v1/*  → Go API (8080)
    └─ /*         → Next.js (3000)
         ↓
    PostgreSQL + Redis
         ↓
    Go Worker (定时清理)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;职责划分&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js&lt;/strong&gt;：纯前端渲染 + SSR SEO 落地页，不再承担任何业务逻辑&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Go API&lt;/strong&gt;：搜索、转存、账号管理、管理后台所有接口&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Go Worker&lt;/strong&gt;：过期资源清理、每日计数重置&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nginx&lt;/strong&gt;：请求路由，未来可扩展灰度发布、限流等能力&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="关键技术点"&gt;关键技术点&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1. 流式搜索优化&lt;/strong&gt;&lt;br&gt;
搜索请求需要调用上游 PanSou API 并实时检测链接有效性。Go 的协程模型天然适合这种场景：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;用 Goroutine 并发调用多个上游接口&lt;/li&gt;
&lt;li&gt;Redis Stream 实现搜索结果的流式推送&lt;/li&gt;
&lt;li&gt;检测到 N 条有效链接后提前终止，避免无效等待&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;实测搜索 P99 响应时间从 2 秒降到&lt;strong&gt;不到 1 秒&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. 请求合并防穿透&lt;/strong&gt;&lt;br&gt;
热门关键词短时间内可能被重复搜索。通过分布式锁实现请求合并：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;相同查询参数的请求只触发一次上游调用&lt;/li&gt;
&lt;li&gt;后续请求直接订阅 Redis Stream 获取结果&lt;/li&gt;
&lt;li&gt;显著降低了上游 API 压力和缓存穿透风险&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. 双写模型解决 SEO 问题&lt;/strong&gt;&lt;br&gt;
资源转存后生成的落地页对 SEO 至关重要，但分享链接 15 分钟后会过期。采用双写策略：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;temporary_shares&lt;/code&gt; 表：存储短期分享数据（15 分钟 TTL）&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;resources&lt;/code&gt; 表：永久保留 SEO 数据（slug/title/description）&lt;/li&gt;
&lt;li&gt;Worker 清理时只删网盘文件和临时表，SEO 落地页始终可访问&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;用户访问过期资源时显示"资源已过期，请重新搜索"，既保留了 SEO 价值，又不影响体验。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. 内部网络优化&lt;/strong&gt;&lt;br&gt;
Next.js SSR 渲染 SEO 落地页时需要调用 Go API 获取数据。通过 Docker 内网直连：&lt;/p&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// SSR 走内网&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;INTERNAL_API_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://go-api:8080&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;省去了公网绕行的延迟，SSR 响应速度提升 50-200ms。&lt;/p&gt;
&lt;h2 id="迁移策略"&gt;迁移策略&lt;/h2&gt;
&lt;p&gt;采用&lt;strong&gt;灰度发布 + 双运行&lt;/strong&gt;的策略，而非一刀切：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;阶段 1&lt;/strong&gt;：Go API 上线，Node.js API 继续服务&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;阶段 2&lt;/strong&gt;：通过 Cookie 或 IP 规则切换 10% 流量到 Go&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;阶段 3&lt;/strong&gt;：观察监控指标（错误率、响应时间、转存成功率）&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;阶段 4&lt;/strong&gt;：逐步扩大到 50% → 100%&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;阶段 5&lt;/strong&gt;：下线 Node.js API，清理废弃代码&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;全程保留回滚能力，任何阶段出现问题都能快速切回。&lt;/p&gt;
&lt;h2 id="效果"&gt;效果&lt;/h2&gt;
&lt;p&gt;重构上线后，核心指标全面改善：&lt;/p&gt;
&lt;table class="table table-bordered table-striped"&gt;
&lt;tr&gt;
&lt;th&gt;指标&lt;/th&gt;
&lt;th&gt;重构前&lt;/th&gt;
&lt;th&gt;重构后&lt;/th&gt;
&lt;th&gt;提升&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;搜索 P99 响应时间&lt;/td&gt;
&lt;td&gt;~2s&lt;/td&gt;
&lt;td&gt;&amp;lt;1s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;50%+&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;服务器内存占用&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;↓30%+&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;显著降低&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;转存成功率&lt;/td&gt;
&lt;td&gt;~90%&lt;/td&gt;
&lt;td&gt;&amp;gt;95%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;更稳定&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;并发处理能力&lt;/td&gt;
&lt;td&gt;受限&lt;/td&gt;
&lt;td&gt;线性扩展&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;质变&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;用户侧感知最明显的是&lt;strong&gt;搜索速度&lt;/strong&gt;和&lt;strong&gt;高峰期稳定性&lt;/strong&gt;。之前晚高峰偶尔会卡顿，现在基本感知不到波动。&lt;/p&gt;
&lt;h2 id="经验总结"&gt;经验总结&lt;/h2&gt;&lt;h3 id="1. 选型要看场景"&gt;1. &lt;strong&gt;选型要看场景&lt;/strong&gt;
&lt;/h3&gt;
&lt;p&gt;Next.js（Node.js）适合快速迭代和 IO 密集型应用，但在高并发、CPU 密集、长连接场景下，Go 的优势是碾压性的。不是说 Next.js 不行，而是工具要用对地方。&lt;/p&gt;
&lt;h3 id="2. 灰度发布是刚需"&gt;2. &lt;strong&gt;灰度发布是刚需&lt;/strong&gt;
&lt;/h3&gt;
&lt;p&gt;再有信心的重构也要保留灰度和回滚能力。我们的灰度周期拉了近两周，虽然前期略保守，但确保了零事故上线。&lt;/p&gt;
&lt;h3 id="3. 监控先行"&gt;3. &lt;strong&gt;监控先行&lt;/strong&gt;
&lt;/h3&gt;
&lt;p&gt;重构前就部署好 Prometheus + Grafana，设置好关键指标告警。有数据支撑才能客观评估效果，也能快速定位问题。&lt;/p&gt;
&lt;h3 id="3. 不要动数据模型"&gt;3. &lt;strong&gt;不要动数据模型&lt;/strong&gt;
&lt;/h3&gt;
&lt;p&gt;数据层是最难迁移的部分。我们保持了 PostgreSQL 和 Redis 的现有结构，只改了访问层（从 Next.js API Routes 切换到 Go API），大大降低了风险。&lt;/p&gt;
&lt;h2 id="写在最后"&gt;写在最后&lt;/h2&gt;
&lt;p&gt;这次重构本质上是一次&lt;strong&gt;技术债务的集中偿还&lt;/strong&gt;。旧架构并非不能用，但随着规模增长，边际成本越来越高。与其小修小补，不如趁还有精力时彻底重构。&lt;/p&gt;

&lt;p&gt;对于类似规模的资源站、聚合搜索类项目，如果你也在纠结要不要换技术栈，可以参考这几个信号：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;P99 响应时间经常超过 2 秒&lt;/li&gt;
&lt;li&gt;服务器成本增速超过用户增速&lt;/li&gt;
&lt;li&gt;高峰期需要频繁扩容才能撑住&lt;/li&gt;
&lt;li&gt;定时任务经常需要人工介入&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;如果中了 3 条以上，是时候考虑架构升级了。&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;&lt;strong&gt;PanSou 盘搜得&lt;/strong&gt;目前已全面切换到新架构，欢迎体验：&lt;br&gt;
👉 &lt;a href="https://pansou.de" rel="nofollow" target="_blank" title=""&gt;pansou.de&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;免费、无广告、速度快，专注夸克网盘资源搜索。&lt;/em&gt;&lt;/p&gt;</description>
      <author>Carlos258</author>
      <pubDate>Sat, 17 Oct 2026 17:24:11 +0800</pubDate>
      <link>https://www.w2solo.com/topics/8608</link>
      <guid>https://www.w2solo.com/topics/8608</guid>
    </item>
    <item>
      <title>【自荐】夸客搜 - 无广告、速度快、资源最新最全的网盘资源搜索网站</title>
      <description>&lt;p&gt;网站名：夸客搜&lt;/p&gt;

&lt;p&gt;网址：&lt;a href="https://www.kuakeso.net/" rel="nofollow" target="_blank"&gt;https://www.kuakeso.net/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;一句话：无广告、速度快、资源最新最全的网盘资源搜索网站&lt;/p&gt;

&lt;p&gt;简介：
KuaKeSo 夸客网盘搜索提供考研考公考级资料/小初高辅导资料/视频教程/设计素材/软件/付费课程/小说书籍/音乐/动画/最新欧美电影美剧日剧韩剧短剧动漫综艺纪录片等网盘资源分享，支持夸克网盘、百度网盘等主流网盘平台，帮您快速找到最新的免费网盘资源
&lt;img src="https://img.way2solo.com/photo/Carlos258/b8db7e63-237e-4883-8bc9-b3fd9535a821.png?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>Carlos258</author>
      <pubDate>Wed, 27 Aug 2025 19:37:54 +0800</pubDate>
      <link>https://www.w2solo.com/topics/6191</link>
      <guid>https://www.w2solo.com/topics/6191</guid>
    </item>
  </channel>
</rss>
