基础设施概述

本文全面概述了支撑 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 -->|响应| A

CloudFront - 内容分发网络

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 的组合为我们的电子商务平台提供了稳健、可扩展的基础。

相关文章