Derick
2206 words
11 minutes
如何用云原生“积木”搭出99.99%高可用DApp架构(AWS)

引言#

刚加入一个在做DApp的小团队,在Web3的世界里,用户的耐心和信任比金子还贵。如果在一次火爆的Mint活动中,或者在交易的关键时刻,服务挂了,那损失的不仅是钱,更是社区的信心。

小公司里没有24/7轮班的SRE专家,也不可能自己去搭物理机房。所以我的信条很简单:把专业的事交给专业的人,我们专注于业务逻辑。而云厂商就是我们背后最专业的“基建狂魔”

在本篇文章中,我会介绍如何用AWS上那些看似复杂的服务,像搭乐高一样,快速构建一个能承诺SLA达到“4个九”(99.99%可用性)的后端架构。

架构速览#

在深入细节之前,先看下整体的流量走向:

用户 -> Vercel/Cloudflare (前端) -> AWS WAF (防火墙) -> Application Load Balancer (流量分发) -> ECS/EKS (核心服务) -> RDS/Redis (数据存储)

这个流程里的每一个环节,都是为了“高可用”这三个字服务的。没有一个环节是单打独头的,它们都有备份,都有plan B。

第一站:前端 - 全球加速,永不宕机#

DApp前端部署在Vercel或Cloudflare Pages上。为什么?因为它们天生就是全球化的、高可用的。

  • 全球CDN: 你的前端静态资源被缓存到全世界的边缘节点,用户无论在纽约还是东京,访问速度都飞快。
  • 自带冗余: 你不需要关心服务器挂掉的问题,这些平台会帮你搞定。一台服务器挂了?流量会自动切到另一台。
  • DDoS防护: Cloudflare是这方面的专家,能帮你挡掉大部分网络攻击。

最佳实践: 把前端和后端域名分开。前端交给Vercel/Cloudflare,后端API用独立的子域名,这样权责分明,也更安全。

第二站:后端 - 稳定的基石#

后端是整个系统的心脏,这里是重头戏。

1. 流量入口:保安(WAF) + 交通警察(ALB)

  • AWS WAF (Web Application Firewall): 这是你服务的第一道门卫。不要让恶意流量直接打到你的服务器上。WAF能帮你过滤掉常见的SQL注入、跨站脚本(XSS)等攻击。对于DApp来说,防机器人、防刷子尤其重要,WAF可以设置规则,限制来自单一IP的请求频率。简单配置一下,就能获得巨大的安全收益。
  • Application Load Balancer (ALB): 这是保证高可用的核心组件。千万不要把你的服务直接暴露在公网上,也千万不要只起一个服务实例。ALB的作用就像一个极其聪明的交通警察:
    • 流量分发: 它会把进来的请求,平均分配给你后端的多个服务实例(比如3个跑着你Go后端服务的ECS Task)。
    • 健康检查: ALB会像心跳一样,不停地“ping”你的每一个服务实例,问一句“你还活着吗?”。如果某个实例没反应,ALB会立刻把它从服务列表中踢出去,不再给它发流量,保证用户请求不会打到僵死的服务上。
    • 自动扩容的入口: 后面我们会讲到,ALB可以和自动扩容组(Auto Scaling Group)联动,流量大了就自动加机器。

2. 计算核心:ECS还是EKS?小团队的选择题

我们的Go服务、Temporal Worker都需要地方跑。AWS提供了两种主流的容器化方案:ECS和EKS。

  • ECS (Elastic Container Service): AWS的“亲儿子”。如果你对Kubernetes(K8s)不熟悉,或者团队里没有专门的DevOps,强烈推荐从ECS + Fargate开始。它足够简单,你只需要定义你的容器(用什么镜像,需要多少CPU/内存),然后告诉ECS:“给我跑3个实例”,剩下的事情AWS全帮你搞定。你不用管理底层的EC2服务器,省心省力。
  • EKS (Elastic Kubernetes Service): K8s的托管服务。功能强大,是行业标准,生态丰富。但它的学习曲线也更陡峭。如果你有K8s经验,或者预见到未来业务会变得极其复杂,需要精细化的服务治理,那可以选择EKS。

3. 数据存储:把专业的事交给专家

这是小团队最容易犯错的地方:为了省钱在EC2上自己装MySQL、PostgreSQL或者Redis。这是一个巨大的坑!

  • RDS (Relational Database Service): 你的PGSQL和MySQL应该跑在RDS上。为什么?
    • 一键开启Multi-AZ(多可用区): 这是实现数据库99.99%可用的“银弹”。你勾选这个选项后,AWS会自动在另一个物理隔离的机房里,为你创建一个一模一样、实时同步的备用数据库。当主数据库因为硬件故障、机房断电等问题挂掉时,AWS会在几十秒内自动切换到备用数据库。你的服务可能只会感受到一个短暂的连接中断,然后就自动恢复了。这个过程是全自动的,不需要你半夜三点爬起来手动操作。
    • 自动备份、快照、安全补丁: 这些烦人的运维工作,RDS全包了。
  • ElastiCache for Redis: 同样,不要自己搭Redis集群。用ElastiCache,它帮你处理了主从复制、故障切换等所有复杂问题。

最佳实践: 永远优先选择托管服务(RDS, ElastiCache)。你付的钱,买来的是稳定性和宝贵的睡眠时间。

4. 异步任务:让Temporal稳固运行

Temporal是处理复杂工作流的神器,但它本身也需要稳定运行。我们的做法是:

  • 将Temporal Server也容器化,像其他Go服务一样,部署在ECS或EKS上,同样运行多个实例,并挂在ALB后面。
  • 为Temporal配置一个高可用的RDS (PostgreSQL)作为其持久化层。Temporal的可靠性,很大程度上依赖于其数据库的可靠性。

第三站:监控与告警 - 架构的眼睛和耳朵#

没有监控的系统,就像在闭着眼睛开车。承诺SLA,就必须知道系统在发生什么。

  • OpenTelemetry Collector: 这是一个“数据收集器”。你的Go应用、Temporal服务,都可以通过标准的OpenTelemetry SDK,把日志(Logs)、指标(Metrics)、链路(Traces)数据发射出来。Collector负责接收这些数据,然后统一发送到后端存储,比如CloudWatch。这样做的好处是标准化,以后你想换监控后端(比如换成DataDog),只需要改Collector的配置,业务代码一行都不用动。
  • CloudWatch: AWS自带的监控“全家桶”。
    • Logs: 所有服务的日志都应该集中输出到CloudWatch Logs。出问题了,不用一台台登录服务器去翻日志文件。
    • Metrics: 监控一切!ALB的请求延迟、5xx错误率;ECS服务的CPU、内存使用率;RDS的数据库连接数、CPU使用率。
    • Alarms (告警): 这是最重要的!当问题发生时,它必须第一时间通知你。设置一些关键告警:
      • 如果ALB的5xx错误率在5分钟内高于1%,立即通过短信/Slack通知我。
      • 如果RDS的CPU使用率连续10分钟超过80%,通知我。
      • 如果ECS服务的平均CPU使用率超过70%,自动触发扩容,增加一个新的服务实例。

最佳实践: 告警的原则是“宁滥勿缺”,但要避免“狼来了”。把真正紧急的告警(服务不可用)设置为最高优先级,通过电话或短信通知。次要的(资源紧张)则发到Slack或邮件。

总结:小团队的生存法则#

想用小团队的资源撑起99.99%的SLA,秘诀不是技术有多高深,而是思路要转变:

  1. 拥抱托管服务: RDS、ALB、ECS Fargate、EKS 是你最好的朋友。别在造轮子上浪费时间。
  2. 冗余是一切: 任何一个组件,都必须有备份。服务至少部署2个实例,数据库必须是Multi-AZ。杜绝任何单点故障。
  3. 自动化是关键: 依赖自动健康检查、自动故障切换、自动扩容。让机器帮你做重复且重要的工作。
  4. 监控先行: 在你写下第一行代码时,就该思考如何监控它。没有监控,一切高可用都是空谈。

作为创业团队,我们最宝贵的资源是时间和专注力。把基础设施的重担交给云厂商,让我们能更专注于打磨DApp的核心功能和用户体验,这才是小团队在激烈竞争中活下来并脱颖而出的王道。

如何用云原生“积木”搭出99.99%高可用DApp架构(AWS)
https://blog.ithuo.net/posts/startup-guide-sla-4-nines-aws-dapp-architecture/
Author
Derick
Published at
2025-01-13