这篇文章详细介绍了作者如何使用一系列技术和工具来构建和维护一个单人SaaS(软件即服务)公司的架构。以下是文章的核心方法、步骤和策略的概述:
- 基础设施概览:作者使用AWS上的Kubernetes集群来处理多个项目,使用Django作为应用框架,Postgres作为应用数据库,ClickHouse处理分析数据,Redis用于缓存,Celery处理定时任务。
- 自动DNS、SSL和负载均衡:使用Cloudflare进行流量代理和SSL加密,AWS NLB(网络负载均衡器)作为公网和私有网络之间的桥梁,ingress-nginx作为集群内流量的入口点。
- 自动化部署和回滚:通过GitHub Actions触发CI流水线,构建Docker镜像并推送至ECR。Flux组件自动同步Kubernetes集群中的应用程序与基础设施代码仓库中的最新镜像。
- 容错策略:借鉴Erlang的“让系统崩溃”的理念,使用Kubernetes的活跃性探针和自动重启来提高应用的可用性。
- 水平自动扩展:基于CPU/内存使用情况自动扩展应用容器实例。
- CDN缓存静态资源:使用Cloudflare的CDN和DDoS保护功能,结合应用设置的HTTP缓存头部来控制边缘服务器的缓存行为。
- 应用数据缓存:使用内存LRU缓存和集群内Redis共享缓存来存储频繁访问的对象和重计算结果。
- 端点级别的速率限制:使用Django Ratelimit库对特定端点进行速率限制。
- 应用管理:利用Django内置的admin面板进行数据管理和客户支持。
- 定时任务的执行:使用Celery workers和Celery beat调度器运行定时任务,并使用Cronitor.io监控定时任务。
- 应用配置:通过环境变量进行应用配置,并在Kubernetes的ConfigMap中覆盖默认值。
- 保密信息管理:使用kubeseal加密保密信息,并在Kubernetes集群中自动解密。
- 关系型数据和列式数据存储:使用Postgres处理关系型数据,ClickHouse处理列式数据。
- 基于DNS的服务发现:使用Kubernetes内置的服务发现功能,通过服务名称和命名空间进行服务间的通信。
- 基础设施的版本控制:使用Docker、Terraform和Kubernetes清单在代码仓库中描述基础设施。
- Terraform管理云资源:使用Terraform管理云资源,简化资源的创建和回滚。
- Kubernetes清单用于应用部署:使用YAML文件描述Kubernetes应用部署所需的所有资源。
- 订阅和支付:使用Stripe处理支付和计费,简化支付流程。
- 日志记录:使用Kubernetes自动收集和轮转stdout日志。
- 监控和警报:使用New Relic作为监控和警报服务,确保监控系统本身的可用性。
- 错误跟踪:使用Sentry聚合和通知应用错误。
- 性能分析:使用cProfile和snakeviz进行代码性能分析。
- 其他工具:使用Django Debug Toolbar进行本地开发时的查询分析和邮件预览。
文章最后,作者提到他计划写更多的后续文章来分享特定的技巧和经验教训,并建议读者根据项目需求选择使用合适的工具和平台。