使用 FastAPI 和 TimescaleDB 构建 Amazon 数据仓库
为什么选择 TimescaleDB
Amazon 数据本质上是时间序列数据:每天的销售数量、每次库存检查的数量水平、每次广告展示的点击成本。TimescaleDB 是建立在 PostgreSQL 之上的,为时间序列数据添加了超表和连续聚合。
选择 TimescaleDB 而非纯 PostgreSQL 的原因是其原生时间序列压缩:180 天的每小时库存快照使用 TimescaleDB 的压缩比原始 PostgreSQL 小约 10 倍。
API 层
FastAPI 处理 SP-API 数据的摄取:为每种数据类型(订单、库存、广告)设置端点,对写入操作进行批处理,以及处理 SP-API 的速率限制和退避逻辑。
数据摄取端点设计为幂等:提交相同的订单两次不会产生重复数据。这使重试逻辑变得简单,无需复杂的去重。
数据模型
核心超表:
CREATE TABLE sales (
time TIMESTAMPTZ NOT NULL,
asin TEXT,
marketplace TEXT,
quantity INTEGER,
revenue NUMERIC(10,2),
currency TEXT
);
SELECT create_hypertable('sales', 'time');连续聚合处理日、周、月的预聚合,避免在每次查询时对原始数据进行全表扫描。
分析查询模式
最常用的查询模式是跨市场的趋势比较:特定 ASIN 在过去 90 天内在所有市场的销售趋势。TimescaleDB 的时间桶函数简化了这些查询:
SELECT time_bucket('1 day', time) as day,
marketplace,
SUM(quantity) as units_sold
FROM sales
WHERE asin = $1 AND time > NOW() - INTERVAL '90 days'
GROUP BY day, marketplace
ORDER BY day