技术栈经验:一年内实现20倍扩展

发布: (2026年1月9日 GMT+8 20:13)
9 分钟阅读
原文: Dev.to

Source: Dev.to

Cover image for Tech Stack Lessons from scaling 20x in a year

一年前,我写了关于我们的技术栈的文章,介绍它是如何帮助我们运营一家精简的云计算初创公司的。此后,我们的规模增长了 20 倍以上。这种增长很刺激,但也会打破许多东西和假设,迫使你必须快速做出艰难的选择 :‑D

下面是我们在这过程中发生了哪些变化、哪些保持不变以及我们学到了什么。

技术栈

保持不变的部分

有些东西就是好用。

  • Frontend – 仍然是 Nuxt 搭配 TypeScriptTailwind(RIP @adamwathan)。
  • Backend – 仍然是 Go 搭配 Gin
  • Infrastructure – 仍然使用 Hetzner 裸金属服务器,采用 Firecracker 进行虚拟化。
  • IaC – 仍然是 Terraform
  • Caching – 仍然是 Redis
  • Customer support – 仍然是 Crisp
  • Transactional email – 仍然是 AWS SES

如果它没有坏,就别去修它。

但有很多东西已经坏了——或者继续以同样方式运行成本太高。

可观测性:Axiom → Parseable

这是我们最大的一次运营变更。去年我曾赞扬 Axiom 的日志功能;在免费套餐上它表现很好——直到我们扩容。

Axiom bill exploding

随着流量增长,我们需要更好的追踪和更详细的日志。我们的 Axiom 账单飙升至 €1,000 / 月 以上,并且还在继续上升。此时必须问自己:这可持续吗? 显然不行。

于是我们迁移到了 Parseable,在 Kubernetes 上自托管,并使用 MinIO 作为兼容 S3 的存储,全部运行在裸金属服务器上。产品仍然感觉比较早期,但团队响应迅速,出现问题时能快速修复。特别感谢 AnantDeba

我会推荐它吗? 如果你不能用大量金钱换取时间,答案是肯定的。自托管可观测性需要投入工作,但在我们的“规模”(我们仍然很小)下是值得的。我们仍然使用 Grafana 来做仪表盘和告警;这点没有改变(不过账单已经开始让人感到压力)。

对象存储:Backblaze → IONOS / Hetzner

去年我们使用 Backblaze 进行对象存储。它既便宜又可靠。问题并不在技术层面,而是政治层面。

随着业务的增长,企业客户——尤其是欧洲的客户——开始对将数据存放在美国供应商那里提出异议(GDPR、数据主权、内部政策)。他们的诉求非常明确:**不使用美国供应商!**于是,我们开始了替换所有美国供应商的行动,首当其冲的就是 Backblaze。

我们将对象存储迁移到了 IONOSHetzner。它们能和 Backblaze 相媲美吗?答案是否定的,甚至差距很大。但它们是欧洲的,勉强够用,并且满足了客户的要求。说实话,如果没有强制要求使用它们,我也不会选。感觉我们在这件事上真的没有太多选择。

CDN:Cloudflare → Bunny

与存储的情况相同。Cloudflare 是一款功能强大的产品,拥有我们永远不会使用的特性,但客户要求提供欧洲的替代方案。

Bunny 完全符合需求。它不像 Cloudflare 那样功能齐全,但能够完美满足我们的 CDN 需求。它速度快、价格合理且位于欧洲。对于我们极其简单的部署,迁移耗时不到 2 小时.

CI/CD: GitHub Actions → Namespace

GitHub Actions 为我们服务良好,但已经停滞。我们需要嵌套虚拟化来测试 Firecracker 相关内容并提升性能——GitHub 没有满足需求。

我们将 Namespace 用作我们的 runner。它是一个很棒的产品——同样是欧洲的,这在这里正成为一种趋势。仅仅是性能提升就值得我们切换。

话虽如此,我们可能最终会迁移到完全自托管的 runner。规模越大,我们想要的控制权就越多。

数据持久化:重大变更

这是我们最重要的架构改动。去年,我曾吹嘘我们把所有东西都运行在 PostgreSQLTimescale 上,包括数亿条分析数据。那运行得很好,直到我们的数据库达到 2 TB

当达到 2 TB 时,PostgreSQL 变得难以管理。糟糕的查询会把生产环境拉倒,扩展变得痛苦,数据库专家们也开始笑了。(故事的其余部分将在文章的下一部分继续…

# About Me

2 TB is probably nothing in the grand scheme of things! I am not a Postgres pro, and honestly wasn’t planning on becoming one. Additionally, the cost just started to hurt—especially considering that we want to do another 20× in 2026.

So we built something simpler: hot data lives in **Postgres**, then gets flushed to S3 as **Parquet** files. For queries we use **DuckDB** to read directly from S3. DuckDB is **amazing**.

The results surprised us. P99 latency actually improved. Why? Most queries are “give me the last 5 minutes of metrics” or “show me the last 500 logs.” That’s all hot data sitting in Postgres. Historical queries hit S3, and DuckDB handles Parquet files like a champ. Those are, if not cached, slightly slower.

This architecture saves money, scales better, and plays to our strengths. We understand S3. We don’t understand running a 10 TB Postgres cluster. :D

Source:

模式

回顾所有这些变化,出现了一个明显的模式:

  • 全欧洲化。
    客户的压力让我们转向欧盟供应商。这不是技术决定,而是当你超越初创公司和独立黑客阶段时的商业现实。

  • 大规模自托管。
    SaaS 产品很好用,直到你的账单超过某个阈值。那时你必须算算自己的时间成本是否低于他们的价格。

  • 简单胜过巧妙。
    我们没有构建花哨的分布式数据库。我们把数据写入 S3 并用 DuckDB 查询。它不性感,但能工作!(其实,我觉得这种简洁本身也很性感,只是对简历导向的开发不太友好。)

What’s Next

  • 我们可能很快会自行托管 CI runner。
  • 我们正在评估 AWS SES 的替代方案,因为,你知道的,欧洲合规性。

技术栈会持续演进——这就是大规模构建基础设施的本质。但核心理念保持不变:保持简单,保持可维护,只有在问题迫使时才增加复杂度。

这就是我们在 2026 年的现状:规模扩大了二十倍,吸取了一些惨痛教训,技术栈比以往更具欧洲特色。

Cheers,
Jonas

Back to Blog

相关文章

阅读更多 »

你好,我是新人。

嗨!我又回到 STEM 的领域了。我也喜欢学习能源系统、科学、技术、工程和数学。其中一个项目是…