基础设施概述
本文全面概述了支撑 Thinvent 公共网站的基础设施。我们将介绍完整的技术栈,从 Web 服务器到数据库层,并解释所有组件如何协同工作,以提供快速、可靠且可扩展的电子商务体验。
Web 应用程序栈
Flask - 基础框架
我们的网站构建于 Flask 之上,这是一个轻量级且灵活的 Python Web 框架。Flask 提供了核心的路由、请求/响应处理和蓝图系统,将我们的应用程序组织成模块化组件。
我们使用的关键 Flask 特性:
-
蓝图:将应用程序组织成逻辑模块(web、api、cart、product 等)
-
Jinja2 模板:支持模板继承的服务器端 HTML 生成
-
请求上下文:HTTP 请求和会话的自动处理
-
Werkzeug:开发服务器和实用函数
Flask 应用程序在 web 模块中初始化,我们在此:
-
创建 web 蓝图
-
初始化 Babel 以实现国际化
-
配置 Valkey 会话存储
-
为模板变量设置上下文处理器
Gunicorn - 生产服务器
在生产环境中,我们使用 Gunicorn(Green Unicorn),这是一个 Python WSGI HTTP 服务器。Gunicorn 使用多个工作进程来运行我们的 Flask 应用程序。
Gunicorn 由 systemd 管理,确保在崩溃或服务器重启时自动重启。这为我们提供了无需人工干预的高可用性。
Nginx - 反向代理与负载均衡器
Nginx 作为我们的反向代理和负载均衡器。它位于 Gunicorn 之前,负责处理:
-
SSL/TLS 终止:HTTPS 加密/解密
-
静态文件服务:CSS、JavaScript、图片(直接从磁盘提供)
-
反向代理:将动态请求转发给 Gunicorn
-
速率限制:防止滥用
-
请求压缩:Gzip 压缩以加快传输速度
Ubuntu - 操作系统
所有 EC2 实例都运行 Ubuntu,这是我们选择的 Linux 发行版。我们倾向于在可用时使用 Ubuntu 的 Python 包,而不是 pip。
典型的请求流程是:
flowchart LR
A[客户端浏览器] -->|HTTPS 请求| B[Nginx]
B -->|代理到| C[Gunicorn]
C -->|WSGI| D[Flask 应用]
D -->|查询| E[Valkey 缓存]
E -->|未命中| F[DynamoDB]
F -->|响应| E
E -->|命中| G[响应]
G --> B
B -->|响应| ACloudFront - 内容分发网络
CloudFront 是我们的 CDN,提供:
-
DDoS 防护:内置针对分布式攻击的防护
-
源站屏蔽:保护我们的源服务器免受流量峰值影响
我们的 CloudFront 分发有两个源站:
-
后端服务器:后端 Flask 应用
-
S3:用于静态资源的 S3 存储桶
配置的缓存行为:
-
/s/*- 静态资源(CSS、JS、图片),TTL 为 24 小时 -
/ds/*.pdf- 数据手册,TTL 为 24 小时 -
/api/*- API 端点,无缓存 -
/cart- 购物车,TTL 为 24 小时 -
/set-language- 无缓存(动态)
数据层
DynamoDB - 主数据库
我们使用 Amazon DynamoDB 作为我们的主数据库。DynamoDB 是一个 NoSQL 数据库。
我们的 DynamoDB 表包括:
-
Recommendations:AI 生成的产品推荐
-
Product descriptions:多语言产品描述
-
Query pages:为 SEO 解析的查询页面
我们使用 PynamoDB,一个 Python 风格的 DynamoDB ORM,它提供:
- 模型定义:数据库表的 Python 类
Valkey - 内存缓存
Valkey(Redis 的一个分支)是我们的内存缓存层,提供:
-
会话存储:具有 30 天滑动过期时间的用户会话
-
频繁访问的数据:产品数量、热门查询
-
自动完成缓存:搜索建议
-
图片清单:产品图片位置
Valkey 提供了显著的性能优势:
-
读取操作比 DynamoDB 快 100 倍
-
减少数据库负载:缓存命中可避免 DynamoDB 查询
-
会话持久性:跨请求的 Valkey 支持的会话
我们使用 Valkey 用于:
-
会话:用户登录状态、购物车数据
-
缓存:热门查询、自动完成建议
-
计数器:产品库存数量(为性能而缓存)
-
队列:后台作业处理
S3 - 对象存储
Amazon S3 是我们的对象存储服务。
我们使用 S3 来存储:
-
产品图片:高分辨率产品照片
-
数据手册:PDF 产品规格书
-
静态资源:CSS、JS、图片
DNS 与路由
Route53 - 域名管理
Route53 处理我们的 DNS 管理:
- 域名注册:thinvent.in 及相关域名
Nginx 路由
Nginx 根据 URL 模式路由请求:
-
/→ Flask 应用(首页、产品、购物车、结账) -
/q/→ Flask 应用(查询页面、搜索结果) -
/api/→ Flask 应用(API 端点) -
/static/→ CloudFront/S3(静态资源)
搜索与 AI 基础设施
搜索服务
我们运行一个独立的 Flask 应用程序来处理搜索功能。该服务提供:
-
向量搜索:用于相关查询的语义相似性搜索
-
自动完成:基于前缀的搜索建议
-
热门查询:搜索次数最多的词条
-
过滤器提取:解析搜索查询以获取分面信息
搜索服务使用:
-
Valkey RediSearch:向量相似性搜索
-
SentenceTransformer:嵌入生成
-
短语映射:通过子字符串匹配进行过滤器提取
AI 提供商
我们使用多个 AI 提供商来处理不同的任务:
DeepSeek
-
模型:deepseek-chat
-
用例:产品描述、查询页面内容、翻译
-
API:DeepSeek API,带有 Together.ai 作为备用方案
-
缓存:系统提示词以提高提示缓存效率
Gemini
-
模型:Gemini(特定模型)
-
用例:内容生成
-
集成:直接 API 调用
Amazon Bedrock
-
模型:Nova Pro
-
用例:内部聊天
-
集成:boto3 SDK
Amazon Bedrock
-
模型:Nova Lite
-
用例:客户聊天机器人
-
集成:boto3 SDK
完整请求流程
以下是典型请求在我们的基础设施中的流转过程:
flowchart TD
A[客户端浏览器] -->|DNS 查询| B[Route53]
B -->|IP 地址| C[CloudFront]
C -->|缓存检查| D{缓存命中?}
D -->|是| E[返回缓存内容]
D -->|否| F[Nginx]
F -->|代理| G[Gunicorn]
G -->|WSGI| H[Flask 应用]
H -->|缓存检查| I[Valkey]
I -->|命中| J[返回缓存数据]
I -->|未命中| K[DynamoDB]
K -->|查询| L[返回数据]
L --> I
J --> M[构建响应]
E --> M
M --> N[发送给客户端]监控与健康状态
UptimeRobot - 外部监控
我们使用 UptimeRobot 对所有面向公众的端点进行外部监控:
-
Backend server:后端网站
-
www.thinvent.in:公共网站
健康检查
-
Gunicorn:systemd 管理重启
-
Flask:
/health端点返回状态 -
Valkey:监控连接健康状态
-
DynamoDB:监控延迟和吞吐量
日志记录
-
应用程序日志:Gunicorn error.log
-
访问日志:Gunicorn access.log
-
电子邮件:针对关键事件的实时通知,包含 Python 回溯信息
总结
我们的基础设施设计旨在实现:
-
性能:多层缓存、CDN、优化查询
-
可扩展性:自动扩展数据库、负载均衡
-
成本效益:按使用付费、通过缓存减少数据库负载
Flask、Gunicorn、Nginx、Ubuntu、DynamoDB、Valkey、CloudFront 和 UptimeRobot 的组合为我们的电子商务平台提供了稳健、可扩展的基础。