多租户SaaS架构在广告管理系统中的设计实践
2023-12
SaaS多租户架构是投户外系统的核心技术基石。作为服务于数百家媒体运营商的企业级平台,如何在保障数据安全隔离的同时实现高效资源共享,是系统架构设计的核心挑战。本文将分享投户外在多租户SaaS架构设计上的关键决策和实践经验。
在租户隔离方案的选择上,投户外采用了"Database-per-Tenant"(每个租户独立数据库)的物理隔离模式,而非业界常用的"Schema-per-Tenant"或共享表方案。这一决策基于以下考量:首先,户外广告行业的客户对数据安全性要求极高,租户间不能存在任何数据泄露的风险,物理隔离是最彻底的保护方式;其次,不同规模的媒体运营商数据量和访问模式差异巨大——小型客户可能只有几千个点位,而大型地铁公司拥有数万个点位和日均数千次的操作请求,独立数据库可以在资源分配和性能调优上做到"一客一策";最后,独立数据库在数据备份、恢复和迁移方面具有天然优势,满足不同客户的个性化运维要求。
在技术选型上,投户外后端采用Java Spring Boot + MyBatis Plus作为核心框架,前端使用Vue 3 + TypeScript构建管理后台。租户数据路由通过动态数据源切换实现:用户在登录时,系统根据其所属租户自动切换到对应的数据库连接池,后续所有数据操作均在独立的数据上下文中完成。为管理数百个数据库实例,系统构建了租户数据库自动化管理模块,支持新租户数据库的自动创建、表结构同步、种子数据初始化和版本升级脚本执行。
权限管理是SaaS系统的另一个重要设计维度。投户外实现了"租户级RBAC"权限模型——每个租户可以独立定义角色和权限,而不会影响其他租户。系统支持菜单权限、按钮权限和数据权限三个粒度级别的控制。数据权限采用注解驱动的拦截器方案,通过@DataScope注解标记需要数据过滤的接口,拦截器根据当前用户的组织归属和权限配置自动拼接SQL过滤条件。值得一提的是,系统还支持租户自定义审批流——每个客户可以根据自身组织结构配置合同审批、回款审批等流程的节点和审批人。
性能优化是多租户架构持续运维的核心课题。投户外的优化策略包括:Redis多租户缓存——为每个租户分配独立的缓存命名空间(Key前缀),避免缓存key冲突,并支持租户级别的缓存清理;异步任务处理——上刊报告生成、数据导出等耗时操作通过消息队列异步执行,避免阻塞用户操作;文件存储隔离——在RustFS对象存储中为每个租户创建独立的Bucket,实现附件和图片的物理隔离。这些设计确保了即使在大规模并发使用场景下,每个租户都能获得稳定良好的使用体验。
