一人工程 · solus opus

← 全部作品

solo-engineerinfrastructureload-balancerserverhn-show

Load balancer 不必要:一个 server 就够了

solo engineer 没有 load balancer。simedw 一个人 iPhone app——每个用户的 iPhone = 一个 server,没有 HAProxy 没有 ALB。load balancer 是大公司水平扩展工具,一人工程的 iPhone app = distributed load balancer。

solo engineer 没有 load balancer。

大公司做 load balancer:

  • HAProxy / NGINX:开源软件 load balancer
  • AWS ALB / GCP LB:云 load balancer
  • Envoy:服务网格 data plane
  • L4 / L7 load balancing:TCP / HTTP 负载均衡
  • health check:检测 server 健康,不健康 → 切流量
  • sticky session:同一用户路由到同一 server
  • SSL termination:load balancer 终止 SSL
  • 10 台 server:1 个 load balancer + 10 个 app server

一人工程做 load balancer:

  • 没有 HAProxy
  • 没有 ALB
  • 没有 health check
  • 没有 sticky session
  • 没有 SSL termination

simedw 的 load balancer 哲学

simedw 是 iPhone piano app。他没有 load balancer:

  • 每个用户的 iPhone = 一个 server:iPhone app 本地运行,100 个用户 = 100 个 server
  • simedw 没有 load balancer:iPhone app 没有 server 流量,没有水平扩展
  • simedw 的 app 自己 load balance:每个 iPhone 独立处理自己的请求
  • simedw 没有 health check:iPhone app 没有 server 健康检查
  • simedw 没有 sticky session:iPhone app 没有 session

simedw 的"load balancer"在 App Store + iPhone OS:

  • App Store 下载:用户下载 app = "load balancer" 路由到 iPhone
  • iPhone OS 处理:每个 iPhone 独立运行 app = "server"
  • Core ML INT8 量化:每个 iPhone 独立跑模型 = "水平扩展"
  • App Store 自动更新:苹果自动推送更新 = "rolling deploy"

不需要 HAProxy,因为:

  • 100 个用户 × 100 个 iPhone = 100 个 server(天然 distributed)
  • iPhone OS 处理 app lifecycle = "load balancer"
  • 苹果 App Store = "CDN + load balancer"

一人工程的 load balancer 工具

  • iPhone OS:每个 iPhone 独立运行 app = server
  • App Store:分发 app = load balancer + CDN
  • Core ML INT8:iPhone 跑模型 = 水平扩展
  • TestFlight:beta 用户 = canary load balancer

不需要 HAProxy / NGINX / ALB,因为 iPhone app 没有 server。

HAProxy 在大公司的细节

大公司 HAProxy:

  • L4 load balancing:TCP 流量(port 80 / 443)
  • L7 load balancing:HTTP 流量(path / header 路由)
  • health check:每 1 秒检查 server 健康
  • 不健康切流量:server 不健康 → 切到健康 server
  • sticky session:基于 cookie 路由到同一 server
  • SSL termination:HAProxy 终止 SSL,server 用 plain HTTP

每个 HAProxy:

  • 1 台 server 跑 HAProxy
  • 10 台 app server
  • 1 个 SRE 维护

一人工程没有 HAProxy。一人工程有:

  • simedw iPhone OS = HAProxy:每个 iPhone 独立处理请求
  • simedw 0 台 app server:iPhone app 没有 server
  • simedw 自己 = SRE:simedw 维护 iPhone app

NGINX 在大公司的细节

大公司 NGINX:

  • reverse proxy:NGINX 在前,app server 在后
  • load balancing:round-robin / least-connections / IP hash
  • caching:NGINX 缓存静态资源
  • rate limiting:限制每 IP 请求数
  • WAF:Web Application Firewall

每个 NGINX:

  • 1 台 server 跑 NGINX
  • 10 台 app server
  • 配置 1000 行

一人工程没有 NGINX。一人工程有:

  • simedw iPhone OS = NGINX:iPhone app 自己处理 reverse proxy
  • simedw 没有 rate limiting:iPhone app 没有 server rate limiting
  • simedw 不需要 WAF:iPhone app 没有 web app

AWS ALB 在大公司的细节

大公司 AWS ALB (Application Load Balancer):

  • 云 load balancer:AWS 托管
  • auto scaling:自动加 server
  • target group:ALB 路由到 target group
  • path-based routing:/api → api server, /static → static server
  • host-based routing:api.example.com → api server
  • WebSocket:支持 WebSocket 连接

每个 AWS ALB:

  • $XX / 月
  • 100 个 target
  • 自动 scale

一人工程没有 AWS ALB。一人工程有:

  • simedw iPhone = AWS ALB target:每个 iPhone 是 target
  • simedw 0 美元 / 月:iPhone app 没有 ALB 成本
  • simedw 不需要 auto scaling:iPhone 用户自己买新手机 = auto scaling

Envoy 在大公司的细节

大公司 Envoy(service mesh data plane):

  • service mesh:每个 app server 跑 Envoy sidecar
  • mTLS:Envoy 之间 mTLS 加密
  • circuit breaker:自动断开不健康 server
  • retry policy:自动重试失败的请求
  • distributed tracing:OpenTelemetry trace

每个 Envoy:

  • 每个 app server 跑 1 个 Envoy
  • 100 台 app server = 100 个 Envoy
  • 5 个 SRE 维护 service mesh

一人工程没有 Envoy。一人工程有:

  • simedw iPhone = Envoy target:每个 iPhone 是 target
  • simedw 不需要 mTLS:iPhone app 本地运行,没有网络 mTLS
  • simedw 不需要 circuit breaker:iPhone app 没有 server 调用

L4 vs L7 load balancing 在大公司的细节

大公司 L4 vs L7:

  • L4 load balancing:TCP 流量,OSI 第 4 层(传输层)
    • 基于 IP + port 路由
    • 不解析 HTTP header
    • 更快(只看到 IP + port)
  • L7 load balancing:HTTP 流量,OSI 第 7 层(应用层)
    • 基于 path / header / cookie 路由
    • 解析 HTTP header
    • 更灵活(可以基于内容路由)

一人工程没有 L4 vs L7 区别。一人工程有:

  • simedw iPhone app 没有 TCP 流量:iPhone app 本地运行
  • simedw iPhone app 没有 HTTP 路由:iPhone app 没有 web server
  • simedw iPhone app = L0 load balancing:每个 iPhone 独立处理

health check 在大公司的细节

大公司 health check:

  • HTTP /health:app server 暴露 /health 端点
  • 200 OK:server 健康
  • 5xx / timeout:server 不健康
  • 每 1 秒检查:load balancer 每秒检查
  • 不健康切流量:3 次失败 → 切流量

每个 health check:

  • 1 秒间隔
  • 5 个 SRE 维护
  • 1000 个 server 监控

一人工程没有 health check。一人工程有:

  • simedw iPhone OS = health check:iPhone OS 检测 app crash / OOM / battery
  • simedw Crashlytics = 不健康切流量:crash 率上升 = 不健康
  • simedw 0 个 SRE:simedw 自己 = SRE

sticky session 在大公司的细节

大公司 sticky session:

  • 基于 cookie:load balancer 写 cookie,下次路由到同一 server
  • session affinity:用户登录后所有请求路由到同一 server
  • session 数据:server 内存 / Redis 存 session
  • session 失效:cookie 过期 / server 重启

每个 sticky session:

  • cookie 处理
  • session 存储
  • session 失效处理

一人工程没有 sticky session。一人工程有:

  • simedw iPhone app 没有 session:iPhone app 没有 server session
  • simedw iPhone app 没有 cookie:iPhone app 没有 web cookie
  • simedw iPhone app local state:iPhone app 状态在用户 iPhone 本地

SSL termination 在大公司的细节

大公司 SSL termination:

  • SSL/TLS 加密:用户 → load balancer 加密
  • load balancer 终止 SSL:load balancer 解密
  • plain HTTP:load balancer → app server 明文
  • 节省 CPU:app server 不做 SSL 加密解密
  • cert 续期:load balancer 统一管理 cert

每个 SSL termination:

  • cert 购买 / 续期
  • 加密解密 CPU
  • cert 配置

一人工程没有 SSL termination。一人工程有:

  • simedw iPhone app 没有 SSL:iPhone app 本地运行,不需要网络 SSL
  • simedw iPhone app 没有 cert:iPhone app 没有 domain
  • simedw iPhone app sandbox:iOS sandbox = 安全

10 台 server 在大公司的成本

大公司 10 台 server:

  • 10 × app server:每个 $100 / 月 = $1000 / 月
  • 1 × load balancer server:$100 / 月
  • 1 × database server:$500 / 月
  • network / bandwidth:$200 / 月
  • SRE 维护:$10k / 月 × 5 = $50k / 月
  • 总成本:~$52k / 月

每个 cost:

  • 几万美元 / 月
  • 5 个 SRE 维护
  • 100 万用户服务

一人工程没有 10 台 server。一人工程有:

  • simedw 0 台 server:iPhone app 没有 server
  • simedw $0 / 月:iPhone app 部署免费
  • simedw 100 用户:simedw 服务 100 用户,0 cost

iPhone app vs server 的 load balancer 区别

iPhone app 和 server 根本不同:

  • server:100 万用户 → 10 台 server + 1 个 load balancer
  • iPhone app:100 用户 → 100 个 iPhone(每个 iPhone = 一个 server)

simedw 的 iPhone piano app:

  • 100 个用户 = 100 个 iPhone
  • 每个 iPhone 独立运行 app
  • iPhone OS 自动处理 app lifecycle
  • 没有 load balancer(没有 server 流量)
  • 没有 server 成本(用户自己买 iPhone)

不需要 HAProxy,因为:

  • 100 个 iPhone = 100 个 "server"
  • iPhone OS = "load balancer"(自动处理 app lifecycle)
  • 苹果 App Store = "CDN"(分发 app)

一人工程的 load balancer 哲学

大公司 load balancer 是因为他们有:

  • 100 万用户(需要 10 台 server + 1 个 load balancer)
  • 1000 个 RPS(需要负载均衡)
  • $XX,XXX / 月 server 成本
  • 5 个 SRE 维护 load balancer

一人工程没有这些。一人工程有:

  • 100 用户(每个用户 1 个 iPhone = 1 个 server)
  • 10 个 RPS(iPhone 本地处理,不需要负载均衡)
  • $0 / 月 server 成本(用户自己买 iPhone)
  • 0 个 SRE(simedw 自己 = SRE)

load balancer 在一人工程里 = 每个 iPhone 自己 = 一个 server

我就是 load balancer

大公司 load balancer 是专用硬件 / 软件

  • HAProxy / NGINX / Envoy / ALB
  • 1 个 SRE 维护
  • 100 个 target server

一人工程 load balancer 是每个 iPhone 自己

  • iPhone OS 自动处理 app lifecycle
  • 100 个 iPhone = 100 个 "load balancer target"
  • simedw 自己 = 1 个 SRE

没有 HAProxy,没有 NGINX,没有 Envoy,没有 ALB。

一人工程 + 一个 server 就够了

simedw 不做 HAProxy。 simedw 不做 NGINX。 simedw 不做 ALB。 simedw 不做 Envoy。 simedw 一个 iPhone = 一个 server。

load balancer 在一人工程里不是工具,是每个 iPhone 自己 = 一个 server


solo engineer 没有 load balancer。 solo engineer 的 load balancer = 每个 iPhone 自己 = 一个 server。

solus opus.