几维之翼

Feb 5, 2024 - 1 minute read - 技术随笔

构建SaaS应用一点心得

前言

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使用的该方案。

技术选型

对于技术选型笔者觉得需要做以下考量

  1. 自己对此技术是否熟悉
  2. 该技术是否主流,语言相关配套是否成熟
  3. 招人难度如何

基于以上考虑,笔者决定使用如下技术栈

后端

  • 语言: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应用的大致经历,小团队做项目经常出现资源不足,一人身兼数职的情况,属实不易。