AWS 上 SaaS 应用程序的多租户架构
更新时间: 2023-02-20 16:38:47 作者: 佚名
SaaS 应用程序是当今的新常态,软件提供商正在寻求将其应用程序转换为软件即服务应用程序。为此,唯一的解决方案是构建一个多租户架构的 SaaS 应用程序。您是否想过 Slack、Salesforce、AWS(亚马逊网络服务)和 Zendesk 如何为多个组织提供服务?每个客户是否都有其独特的定制云软件?例如,您是否注意到,在 Slack 上,您有自己的 URL“yourcompanyname.slack.com”?
大多数人认为,在后台,他们为每个组织创建了一个特定的环境——应用程序或代码库——并相信 Slack 客户拥有自己的服务器/应用程序环境。如果是您,您可能会假设他们有一个可重复的流程来为所有客户运行数以千计的应用程序。好吧,不。真正的解决方案是AWS 上用于 SaaS 应用程序的多租户架构。
让我们从这个令人印象深刻的事实开始:根据 IDC 研究,70% 的 Web 应用程序被视为 SaaS 应用程序。因此,如果您了解 SaaS 架构和多租户,那么您可能已经涵盖了 70% 的未来可用的 Web 应用程序架构。
“ 70% 的 Web 应用程序都是 SaaS,但只有少数是多租户的。 ”
本研究旨在概述 DevOps 和软件开发人员在构建 SaaS 多租户应用程序时可能面临的策略、挑战和限制。
在开始之前,有两个概念对我们来说很重要:
接下来的几点是我们将在 SaaS 应用程序的多租户架构中探索的内容,我的贡献将是:
什么是多租户架构?
首先,你需要了解什么是单租户和多租户架构:
- 单租户架构(孤岛模型) :是每个组织的单一架构,其中应用程序拥有自己的基础架构、硬件和软件生态系统。假设您有十个组织;在这种情况下,您需要创建十个独立的环境,并且您的 SaaS 应用程序或公司将作为单个租户架构运行。此外,它意味着更多的成本、维护和跨环境更新的难度。
- 多租户架构:是一种生态系统或模型,其中单个环境可以利用可扩展、可用且有弹性的架构为多个租户提供服务。底层基础设施完全共享,逻辑隔离,服务完全集中。多租户架构根据登录到 SaaS 应用程序的组织或子域 (organization.saas.com) 发展;并且对最终用户是完全透明的。
请记住,在本文中,我们将讨论两种多租户架构模型,一种用于应用程序层,一种用于数据库层。
多租户的好处
采用多租户架构方法将为您的 SaaS 应用程序带来广泛的宝贵好处。
让我们来看看下一个贡献:
- 利用多租户架构策略降低服务器基础设施成本:
- 您不必为每个客户创建一个 SaaS 环境,而是为所有客户包含一个应用程序环境。这使您的 AWS 托管成本可以从数百台服务器显着降低到一台。
- 单一信任来源:
- 让我们再说一遍,您有一个客户在使用您的 SaaS。想象一下每个客户将拥有多少个代码存储库。每个客户至少 3-4 个分支,这会产生大量开销和未对齐的代码发布。更糟糕的是,可视化将代码部署到整个租户农场的过程;它非常复杂。这是不可行且耗时的。使用多租户 SaaS 架构,您可以避免这种类型的冲突,您将拥有一个代码库(信任源)和一个具有几个分支(开发/测试/生产)的代码存储库。通过遵循以下实践 - 使用单个命令(一键部署) - 您将在几秒钟内快速执行部署过程。
- 降低开发成本和上市时间:
- 降低成本考虑一系列决策,例如拥有单一代码库、SaaS 平台环境、多租户数据库架构、集中存储、API 以及遵循十二要素方法论。所有这些都将使您能够减少开发劳动力成本、上市时间和运营效率。
AWS 架构的 SaaS 技术栈
要构建多租户架构,您需要将正确的 AWS Web 堆栈(包括操作系统、语言、库和服务)集成到 AWS 技术中。这只是创建下一代多租户架构的第一步。
尽管我们将介绍一些其他多租户架构最佳实践,但本文将主要针对此 AWS SaaS Web 堆栈。
让我们深入了解 AWS 上的 SaaS 技术栈:
编程语言
选择哪种语言平台并不重要。重要的是您的应用程序可以扩展,利用多租户架构最佳实践、云原生原则和开源社区的知名语言。这 构建 SaaS 应用程序的最新趋势是 Python + React + AWS。另一个“变体”是 Node.js + React + AWS,但最终,共同点始终是 AWS 和 React。如果你是一家金融公司,ML 或 AI,有复杂的算法或后端工作,我会说你应该选择 Python。
另一方面,如果您正在使用实时聊天、迷你提要、流媒体等现代技术,那么请选择 Node.js。银行业有一个利用 Java 的市场,但那是针对成熟企业的。任何新的 SaaS 应用程序都可以更好地与提到的 Web 堆栈一起使用。同样,这正是我所注意到的趋势,也是社区的要求。
注意:此数据来自我们几个月前对金融服务和 SaaS 公司进行的一项调查。
理想的语言
云供应商
作为 DevOps 专家团队,我注意到过去两年中云的变化,这与这些百分比相对应:我们 70% 的 DevOps 实施基于 AWS,25% 使用 Azure,5% 使用 GCP 和数字海洋。每年的趋势都是相似的,除了 Azure 随着时间的推移逐渐增长。这些不仅是我的话,也是多个 DevOps 合作伙伴支持的想法。因此,我强烈建议在 AWS 下部署您的 SaaS 应用程序。它有很多好处;每天都有一项新服务可供您使用,以及一项有助于您开发和部署的新功能。完全推荐在 AWS 上部署您的 SaaS。
微服务
如果您打算利用云,则必须利用云原生原则。这些原则之一是将微服务与 Docker 相结合。确保您的 SaaS 应用程序处于微服务之下,这会带来多种好处,包括灵活性和标准化、更易于故障排除、问题隔离和可移植性。就像云一样,Docker 和微服务已经改变了 IT 生态系统,并将持续很长时间。
容器编排平台
这是一个复杂而抽象的决定; AWS 中提供了三个选项来管理、编排和创建微服务集群环境:
- Amazon ECS :是AWS生态中天然的Amazon容器编排系统。 (强烈推荐给初创公司、小型 SaaS 和中型 SaaS)。
- Amazon Fargate :几乎无服务器,价格和管理按任务计算。与 ECS 相比,操作工作量最少。我们的 DevOps 团队进行了一些研究;在性能方面。 Fargate 可能比 ECS 慢,因此对于这种特殊情况,我建议使用 Amazon ECS,而不是 Fargate。另一个想法是,如果您的团队是纯粹的开发人员并且不打算聘请 DevOps 工程师,那么 Fargate 可能是最佳选择。
- 亚马逊 EKS : 它是一项托管服务,使 AWS 上的 Kubernetes 易于管理。使用 Amazon EKS 而不是在 EC2 实例上部署 Kubernetes 集群,设置 Kubernetes 网络和工作节点。 (推荐用于大型 SaaS 应用程序和成熟的 DevOps 和 Web 开发团队)。
数据库
固有数据库将是带有 Amazon RDS 的 PostgreSQL。但是,我强烈建议,如果您有一个高级开发团队,并且计划为您的 SaaS 应用程序(甚至数百个租户)提供高流量,那么您最好使用 MongoDB 构建您的数据库。除此之外,利用下面将提到的关于多租户数据库的最佳实践。在这种情况下,我会选择带有 PostgreSQL 或 DynamoDB (MongoDB) 的 Amazon RDS。
“如果您计划为您的 SaaS 应用程序提供高流量,您最好使用 MongoDB 构建您的数据库。”
GraphQL 或 Amazon AppSync
GraphQL 是一种查询语言,是数据库服务的 RESTful API 的替代品。这个新的现代生态系统被用作客户端和数据库服务器之间的中间人。它允许您更快地检索数据库数据,减轻数据库中的过度获取,从 GraphQL 模式中检索所需的准确数据,并通过比 RESTful 服务更快的迭代速度来保持开发速度。在多租户微服务架构中采用单体后端应用程序是利用 GraphQL 或 AppSync 的最佳时机。因此,在转换 SaaS 应用程序时,不要忘记包含 GraphQL!
注意:我没有在 AWS SaaS 架构图中包含此服务,因为它以多种方式实现,并且需要对此主题进行深入解释。
自动化
您需要一种机制来触发或启动新的租户/组织并将其附加到您的多租户 SaaS 架构。假设您有一个新客户刚刚订阅了您的 SaaS 应用程序,您如何将这个新组织包含在您的环境、数据库和业务逻辑中?
您需要一个自动化流程来启动新租户;这称为基础架构即代码 (IaC)。这个脚本/过程应该存在于 git/bitbucket 存储库中,这是 DevOps 的基本原则之一。利用自动化和 IaC 的一个有力论据是,您需要一种机制来自动化 SaaS 应用程序以进行代码部署。同样,为您的开发/测试环境自动配置新的基础设施。
基础架构即代码和自动化工具
使用哪种基础设施即代码工具并不重要,它们都很有用(Terraform 和 CloudFormation);他们做同样的工作,并且在 DevOps 社区中广为人知。我没有赢家,他们都很好。
- Terraform(来自 Hashicorp) :一种流行的与云无关的工具。广泛用于所有 DevOps 社区。有了这个技能就更容易找到 DevOps。
- Amazon CloudFormation :更容易与 AWS 内置的自动化工具 Amazon Web Services 集成。每当有新的亚马逊技术发布时,与 AWS 和 CloudFormation 的兼容性比 Terraform 发布得更快。相信 AWS CloudFormation 专家会以安全的方式实现自动化和发布。
消息队列系统 (MQS)
常见的 MQS 是 Amazon SQS、RabbitMQ 或 Celery。我在这里建议的是使用需要您较少操作的服务,在这种情况下,是 Amazon SQS。有很多次你需要异步通信。从延迟或安排任务,到提高关键 Web 事务的可靠性和持久性,解耦您的整体或微服务应用程序,以及最重要的:使用队列系统与事件驱动的无服务器应用程序(Amazon Lambda 函数)进行通信。
缓存系统
AWS ElastiCache 是一个缓存和数据存储系统,可完全扩展、可用和托管。它旨在提高分布式缓存数据和内存数据结构存储的应用性能。它是 Memcached 和 Redis 引擎的内存中键值存储。只需单击几下,您就可以运行这个完全自我管理的 AWS 组件。必须为您的 SaaS 应用程序包含一个缓存系统。
云存储系统
用于静态内容的 Amazon S3 和 Amazon CloudFront CDN。所有静态内容,包括图像、媒体和 HTML,都将托管在 Amazon S3——具有无限存储和弹性的云系统上。在 Amazon S3 之前,我们将包括 AWS CloudFront,集成这对元素至关重要,以便缓存整个静态内容并降低带宽成本。
SaaS Web 堆栈:AWS 上的多租户 SaaS 架构示例