← 返回展示台

房屋租赁 SaaS 平台

多租户 SaaS · 百万级房源 · 千万级租客 · 阿里云分布式集群 · 灰度升级 · 上线后不停机维护
技术栈:Java 21 + Spring Boot 3.x + PostgreSQL 17 + 阿里云 | 覆盖:房源(含 AR 看房)· 合同 · 收租 · 物业工单 · 数字家庭 IoT · Agent · 第三方支付/OTA/签章/AR 集成
102
数据表(全部执行通过)
43
PRD 需求条目
97
业务规则
19+13
业务/分布式验证项
1250×
索引优化提速(实测)

一产品需求

二架构设计(v2 重点)

三基础设计(v1,仍然有效)

四核心实测数据 本机 PG 17.11 · 默认配置

场景延迟TPS说明
主键点查0.076 ms211,409最优路径
房源列表页0.078 ms203,941索引优化后
逾期账单统计1.4 ms~16,000需 ANALYZE 及时
混合读写 9:10.667 ms23,882贴近真实负载
出租率聚合看板66 ms ⚠️241唯一必须出 PG 的场景
换算阿里云生产(shared_buffers 128MB → 8GB):预计 2~5 倍提升。 出租率看板建议走 ClickHouse / 物化视图。

五三个最重要的实测教训

教训修复前修复后
① 索引列顺序决定生死 按房号查缺 tenant_id 前导:72.8 ms 0.042 ms(1733×)
房源列表页部分索引用不上:43.7 ms 0.035 ms(1250×)
② 统计信息滞后 同一查询 ANALYZE 前:396 ms 1.4 ms(280×)
③ 大事务拖死数据库 单事务插 500 万行:12 分钟未完成被中断 分批 5000~10000 行/批
硬约束:RLS 架构下,所有高频查询必须有以 tenant_id 打头的索引。
生产要求:必须调优 autovacuum 并监控,CI 中禁止大事务。

六分阶段分库策略(能不能先不分?能)

阶段房源量架构升级触发条件
一期< 30 万单主库 + 只读副本 + 分区上线即用
二期30~100 万1 主 2 从 + 读写分离主库 CPU > 50%
三期> 100 万按 tenant_id 分库单库 > 2TB 或写 TPS > 5 万
一期不分库的理由:分库会失去跨库 JOIN 与事务,账单核销这类强关联业务会直接崩坏。 没到瓶颈就分库是纯负债。

但一期必须做好 5 项准备(否则后期分库要重构):
① 所有表带 tenant_id ✅ 已满足  ② 所有查询带 tenant_id ✅ RLS 强制  ③ 避免跨租户 JOIN ✅ 已满足
④ 分布式 ID(原设计缺失 → 已补号段方案并验证)  ⑤ 无跨库事务方案(建议 Saga / 最终一致)

七千万级租客所需资源(一期规格)

组件规格
RDS PostgreSQL16C64G,ESSD PL1 1TB,多可用区
RDS 只读实例8C32G × 2
Redis 集群版8G × 3 分片,双副本
ACK 节点8C32G × 3,多可用区
RocketMQ专业版 4C8G
资源余量要留在数据库上:数据库升级需要切换,应用扩缩容是滚动无感的。

八v1 → v2 关键修正

v1 结论v2 修正
单机 PostgreSQL 即可阿里云 RDS 多可用区 + 只读副本,分阶段分库
PostGIS「待定」必须装(地图选房是硬需求)
未考虑外部集成新增完整分布式一致性设计(支付/OTA/签章/AR)
未考虑不停机新增 Expanding/Contracting + 灰度 + 回滚方案
主键用 IDENTITY分库会冲突 → 新增号段模式(已验证)
未考虑 C 端新增 C/B 端物理隔离设计

九原始文件(DDL / 压测脚本)