毫无疑问,云计算是未来。目前IaaS(基础设施即服务)与PaaS(平台即服务)的竞争格局似乎已经清晰,新的进入者很难与该领域的巨头AWS、Google、Azure、阿里等竞争。而SaaS(软件即服务)领域依然存在大量的机会,正吸引着开发者和风投进入。上月流传着Google打算花费2500亿美元收购SaaS供应商Salesforce,应该让很多SaaS开发人员感到振奋。
构建一个易扩展、高容错、低成本运营、按使用付费的SaaS应用系统,对于SaaS服务提供商来说至关重要,那么构建一个SaaS应用系统需要考虑哪些因素呢?笔者认为基于SaaS的应用在架构设计时应该考虑以下方面:
1.多租户
如果一套软件系统允许用户在租赁后直接使用软件,而无需在本地安装,那么我们可以认为该软件应用为SaaS服务。但是,这一点不能使它与传统的软件应用相区别。从实现上来看,SaaS应用一般是多租户架构的。
通过多租户架构,SaaS提供商可以基于一套代码和支持代码运行的基础设施为众多租户提供软件服务。理论上,SaaS供应商也可以通过使用传统应用架构,为每个租户创建一个应用实例来提供云服务,但如果租户数量过大,系统的运维工作将成为灾难。而多租户架构可以允许SaaS供应商通过运营与维护一套软件系统为众多租户提供服务,其运维更容易,且成本更低。
另外,多租户架构方式使得在不同租户之间共享代码及基础设施成为可能,从而提高了代码及底层基础设施的效率,而通过这种资源使用的效率提升,降低了SaaS服务的运营成本。事实上,SaaS应用的成功很大程度上依赖于多租户架构。
2.可配置
考虑到一套SaaS应用满足众多客户的需求,而客户的需求及偏好往往各不相同,尤其是面向企业的SaaS系统,其业务流程也不尽相同,需要定制化配置。因此SaaS应用需要允许租户能够进行高度的个性化配置,如元数据、业务流程等,租户下的用户也可以修改或配置应用的UI风格。
3.可扩展性
传统应用通常限制使用应用的用户数量,而SaaS应用通常对此没有限制,因此SaaS应用必须是内生可扩展的,因此需要应用与数据库实现可扩展性。
- 应用扩展性 应用的扩展性可以通过以下两种方式来实现:纵向扩展,即通过升级将应用迁移到性能更强、空间更大的服务器上;横向扩展,即通过增加相同的服务器来处理系统负载。
- 数据库扩展性 数据库的大小应该随着用户及业务处理量的增加而增加。需要注意的是,数据量增加通常会影响数据库的性能,尤其是数据查询及事务处理的速度,而这通常会影响到用户体验。
4.数据隔离性
多租户环境中,SaaS系统必须能够识别每个租户从而实现不同租户之间的隔离。为此,通常需要在应用与数据库层次为每个租户定义一个租户ID. 然后通过租户ID与用户ID来识别用户,从而给用户分配合适的应用权限,并限制用户只能访问他们拥有合法权限的数据。
SaaS应用中,数据库的设计模式一般有三种:每个租户一个数据库实例、每租户一个数据库Schema(但共享数据库实例)、租户共享数据库Schema但数据库表中增加tenant_id字段。具体选择哪种方式,需要结合SaaS应用本身的特点,客户及行业对数据隔离性的要求程度,开发者的技能、SLA、市场需求的紧急程度以及复杂度等综合考虑。
5.集成
SaaS应用必须能够与其他应用进行方便地集成。因此提供一套标准的API将使得与其它SaaS系统或传统应用的集成更容易。
6.运行性能
一个易扩展、高性能的SaaS系统可以服务大量的租户。考虑到用户一般通过互联网访问系统服务,应用必须能够快速地完成页面显示、数据查询以及用户事务。
7.安全与合规
数据安全通常是很多客户关注的首要问题,对数据安全的担心阻止了很多潜在客户将业务迁移到SaaS中。因此,应用以及运行在应用中的数据的安全应该是SaaS开发人员首先要考虑的问题。
我们可以在数据库中使用租户ID来对数据进行逻辑上的隔离,或者选择其它方式都没有问题,但是必须确保运行在同一硬件基础设施上的不同租户之间的数据进行逻辑隔离,只有有正当权限的用户能够访问相应的数据。
8.监控
传统软件应用通常运行在客户企业的数据中心中,因此通常由内部IT团队来监控与运维应用。SaaS应用则完全不同,系统的监控与运维责任完全落在SaaS提供商身上。因此,开发人员通常需要使用甚至自行开发监控工具来监控应用的性能及服务的异常终止等。
小结
一个良好设计、架构优雅的SaaS应用可以给应用提供商和客户带来双赢。通过SaaS应用服务的使用,提供商可以通过综合众多客户的业务流程形成最佳实践固化到应用中,可以吸引到长期客户;客户可以快速获得具备业界最佳实践的应用服务,而无需担心升级、扩展、系统稳定性等。