- 大部分流量来自欧盟,特别是德国和英国,这里是最近 30 天内的 API 调用(不包括下载请求和 CDN 流量)。

- 他们尝试下载安装文件数百万次(过去 5 天内 800,126 次,最近 30 天内总计约 600 万次)。
- 在我们撰写这篇博文时,攻击仍在继续。
在这种炎热的情况下我们做什么
我们什么都不做,除了看着他们 DDoS
- 我们尚未阻止任何攻击者 IP 地址。
- 虽然我们使用 Cloudflare,但我们尚未激活“受到攻击”模式。
- 我们的服务器 CPU 几乎处于闲置状态,在攻击期间大部分时间的使用率通常为 0-1%。
- 一般来说,我们几乎什么也不做。
为什么?
- 因为我们的服务每月能够毫无问题地处理数十亿个请求,而且成本并不高。
- 我们拥有大约 8 个 API 服务及其数据库,每月都能处理数十亿个请求,无需缓存。
- 我们通过 Cloudflare 获得无限带宽。
如何?
- 我们的 TablePlus 应用程序设计很简单,这一理念延伸到我们的后端服务,我们将事情尽可能简化。
- 我们避免使用 Vercel 或 Netlify 等第三方服务进行渲染,因为它们可能会成为瓶颈,并在攻击期间产生让您大吃一惊的账单。 相反,我们使用我们的网络服务器,它没有任何限制。
- 过去,由于 VPS/处理器较弱,单体应用成为瓶颈。 然而,凭借当今强大的 VPS:多核处理器、高 RAM 和快速 SSD(快速 SSD/RAM 加速数据库很多),如果实施正确,整体服务可以在单个实例中每月处理数十亿个请求。
=> 因此,我们为每个应用程序构建了一个易于部署和维护的整体服务。 没有 Docker、没有 Kubernetes、没有依赖项、没有运行时环境 - 只是一个可以部署在任何新创建的 VPS 上的二进制文件。
我们来谈谈巨石
- 每个人都倾向于使事情变得过于复杂,除非你面临压力或限制,否则这不是问题。
- 我们“高度”复杂性,所以我们选择单体。 我们将应用程序所需的所有内容整合到一项服务中:API、网站、电子邮件、支付……一切都集中在一项服务中。
- 部署非常简单:只需一个配置文件、构建和部署。 将服务部署或迁移到另一个云供应商时速度快如闪电。
- 较少的依赖项使调试和识别瓶颈变得更加容易。 当出现错误时,您不需要检查太多,因为只有一个服务或其中几个服务。
您可以选择的整体框架包括:
- Golang:Echo、Gin……
- PHP:Laravel...
- 红宝石:轨道...
- Rust:Actix、Rocket、Warp……
如果做得好,Go 或 Rust 的单个 Web 框架每月可以处理数十亿个请求
- 选择高性能框架; 我们更喜欢 Golang 和 Rust。
- 对数据库建立索引以减少获取时间,尤其是随着数据集的增长。
- 将主数据库(保持不变或不会随着时间的推移而增加大小)与日志/使用数据库(随着时间的推移而增长)分开,以确保您的核心业务不会受到性能问题的影响。
- 使用反向代理来处理请求并将请求分发到您的核心 API。 如果您需要多台服务器,它将极大地帮助您。 我们使用 Nginx——它很强大。
- 将所有内容放在 Cloudflare 后面并正确配置(启用缓存、Argo、Cloudfare 和您的服务器之间的完整 SSL...)。
- 使用具有 DDoS 防护的 CDN。 与 Amazon CloudFront + S3 相比,我们更喜欢 Cloudflare R2 及其 CDN,以节省成本并提供保护。
- 不要在没有 CDN 或缓存的 VPS 上放置任何大的可下载文件,因为它会很快消耗您的带宽。 我们使用的是具有无限带宽的 Cloudflare CDN。 (如果您在同一个域上启用 Cloudflare CDN,它将通过 Argo。要小心,因为 Argo 带宽不是免费的,这会花费您很多钱)。
- 通过限制保护您的邮件程序(当用户发送需要从服务器发送电子邮件的请求时,例如忘记密码功能)
我们来谈谈部署
- 在 TablePlus,我们尽可能简化了部署过程。 我们不使用 Docker、Kubernetes 或任何容器,也不需要设置环境。
- 我们使用二进制文件。 二进制文件非常棒; 只需将它们复制到任何 Linux 服务器并将它们作为进程运行,就像在 macOS 上运行 TablePlus 应用程序一样!
- 使用二进制文件时,您可以让 Linux Systemctl 处理进程(通过监视进程并在发生任何致命错误时重新启动它)。 我们原生地使用一切; 这是优化性能的最佳方法。 虚拟机、虚拟化或第三方基础设施管理器等中间层不会浪费 CPU/RAM。
- 我们选择 Go 和 Rust,因为它们是高性能语言,并且可以生成用于部署的二进制文件。
更新
Vercel 联系了我们,他们想澄清这一点
我们现在拥有在这些情况下保护您的网站的功能。 首先是支出管理,它允许您设置软或硬支出上限,然后是攻击挑战模式,类似于 CF 的“受到攻击”模式。
=> 因此,如果您正在使用这些功能,请不要忘记打开它们。