前言
SaaS(Software as a Service)软件即服务,是前几年比较火的概念。去年笔者有幸参与设计并落地了一套CRM SaaS系统,目前已经上线运行1年,单表也已有千万数据量。现在回头看,总体技术难度不高,主要实现业务需求有些繁杂。下面笔者围绕多租户数据架构、技术选型、团队这三个点讲一讲整个开发过程,有写错的地方还请不吝赐教。
多租户数据架构(Multi-Tenant Data Architecture)
在构思多租户数据架构时,笔者查了一些资料,比较有价值的是微软在2006年的一篇文章 Multi-Tenant Data Architecture。有兴趣建议看下原文,这里笔者粗略总结下文章中提到的三种方法。
方案没有好坏之分,主要看应用场景。
独立数据库
使用独立数据库,租户之间隔离级别最高,数据可以跨地域节点存储,物理隔离。但硬件和维护成本也最高。在搭建SaaS初期,业务预期收益并不明朗,另外业务需求也处在频繁变更中。采用此方案对项目的维护和快速迭代人为增加了困难。
共享数据库,独立模式
数据存一个数据库,采用schema做租户隔离。隔离级别比独立数据库架构弱些,类似多个逻辑数据库,硬件成本比独立小些,维护成本和独立数据库架构相当。
数据库如: PostgreSQL支持此模式,MySQL是不支持的,由于笔者对PostgreSQL不熟悉,加上维护成本较大,没有使用此方案。
共享数据库、共享模式
此模式是纯粹逻辑隔离数据,每张表使用tenantId标识租户。隔离级别最弱,但维护成本较低。尤其是业务初期表字段改动频繁,比较合适。目前CRM SaaS使用的该方案。
技术选型
对于技术选型笔者觉得需要做以下考量
- 自己对此技术是否熟悉
- 该技术是否主流,语言相关配套是否成熟
- 招人难度如何
基于以上考虑,笔者决定使用如下技术栈
后端
- 语言:Java,Spring Boot + MyBatis这一套
- 数据库:MySQL
- 缓存:Redis
- 消息队列:Kafka (和其他系统的数据异步交互)
- 反向代理:Nginx
后续补充了Clickhouse做MySQL从库,用于数据统计,分析。
前端
- Vue.js
构建/部署
使用Gitlab做Git仓库,另外也负责一部分构建部署任务。所有服务器、中间件资源均使用云服务厂商提供服务。
测试,生产环境从服务器到中间件物理隔离。由于团队较小,笔者要负责运维的工作,使用云服务厂商提供的服务相对比较稳定,可以节省很多运维工作。
团队&项目管理
最开始技术团队只有4个人,笔者和1个前端1个后端,再加上1个产品经理。
随着项目发展,开发工作量增加,目前是团队配置为:
- 后端:2个
- 前端:2个
- 测试:1个
- 安卓:1个
- C++:1个
- 产品经理:1个
- BI:1个
加上笔者共10人技术团队,已经具备一定开发能力。
由于没有专业项目经理,笔者要负责一部分项目经理的工作。还好受之前公司项目经理耳濡目染,笔者也有点思路。
一般每月会定下项目计划,当然计划是不断变化的,但还是要有一个基本任务框架。产品出需求,拉开发过需求,开发评估工作量,制定上线计划。每日10分钟站立会,过下每个人进度,根据任务轻重缓急做决定,推进项目进度。
以上为构建SaaS应用的大致经历,小团队做项目经常出现资源不足,一人身兼数职的情况,属实不易。