当前位置: 首页 > 知识库问答 >
问题:

每个租户具有微服务和数据库的SAAS应用程序

麻昌翰
2023-03-14

我正在为多租户SAAS模型设计web应用程序,由于一些规定,我们决定每个租户有一个数据库,我们正在考虑为我们的中间件提供微服务。但我有点困惑,微服务架构谈论的是“每个微服务都有自己的数据库”。下面是我的问题

  1. 如果我将共享数据库用于微服务,这违反了微服务设计的概念/目的,即它们都应该被隔离,任何更改都应该限于该微服务

我可以想到一个层,它模仿我的数据库表作为DTO,每个微服务都通过这个层与数据库通信,如果我错了,请纠正我。

那么,设计每个租户一个数据库的中间件的正确方法应该是什么呢?如果有更好的方法,请随意分享。

下面是我们从这里开始的高级设计

共有2个答案

邰德业
2023-03-14

我们的应用程序是SaaS和具有微服务体系结构的多租户。我们确实为每个服务使用一个数据库,尽管在某些情况下,它实际上只是每个租户的一个单独模式,而不是一个单独的实例。

“每个服务的数据库”中的关键概念都与避免在服务之间共享表/文档有关,而与如何实现这一点关系不大。如果两个服务都是紧密耦合的,那么两个服务之间的紧密耦合就如同两个表之间的紧密耦合一样。

每个服务的数据库意味着不在多个服务之间共享持久性,如何实现这一点取决于您。

多租户是另一个挑战,有多种方法可以应对。在我们的情况下(法规没有规定我们的体系结构),我们设计了租户感知表结构,将TenantId作为主键的一部分。每个租户感知服务都实现了这种分离,我们的授权服务有助于将用户限制在其指定租户的范围内。

如果您需要比键/值分离更多的分离,我希望利用模式作为隔离数据和安全性的一个很好的工具:

  • 比如说,每个实例(每个租户)可以有一个SQL,每个实例(每个租户)可以有一个数据库模式

在任何一种情况下,您都可能希望在您选择的数据库中编写一些工具来帮助管理您不断增长的模式集合,但是除非您最终会有成千上万的租户,否则这应该会让您走得很远。

要说明的最后一点是,您将非常依赖某种集成总线来保持您的多个独立数据存储同步。我强烈建议您在设计上花费尽可能多的时间,就像您在设计剩余的持久性一样,因为这些事件将成为系统的生命线。例如,在我们的多租户设置中,创建一个新租户会触及我们80%的其他服务(通过广播消息),以便这些服务准备好与新租户交互。有些集成事件需要快速发生,有些需要慢慢来,但是管理所有这些移动部分是一个挑战。

钱渊
2023-03-14

你应该在这里区分两件事:

>

每个微服务的数据库每个微服务都有自己的数据库,这是微服务体系结构中的基本规则之一。原因有很多,其中一些是:

  • 缩放
  • 隔离
  • 为不同的微服务使用不同的数据库技术(如果需要)
  • 开发团队分离

你可以在这里读到更多关于它的信息。当然它有一些缺点,但是请记住这是微服务架构中的关键规则之一。

你的问题

如果我将共享数据库用于微服务,这违反了微服务设计的概念/目的,即它们都应该被隔离,任何更改都应该限于该微服务。

如果您可以尝试避免多个微服务共享数据库。如果你最终做到这一点,你应该考虑一下你的建筑设计。有时,强制一个数据库表明,一些微服务应该合并为一个,因为它们之间的耦合非常大,因此使用它们的开销变得非常复杂。

如果我使用每个微服务都有自己的数据库,那么几乎不可能每个租户都有一个数据库,否则每个微服务最终都会有n个数据库。

我并不认为这是不可能的。是的,这很难管理,但如果您决定使用微服务,并且需要数据库切分,那么您需要处理额外的复杂性。当然,每个微服务有一个数据库,然后每个微服务有n个数据库可能非常具有挑战性。作为解决方案,我建议如下:

>

只在需要的微服务中将数据物理地分离到不同的碎片。假设你有两个微服务:产品库存微服务和客户微服务。假设你的产品库存中有3亿个产品,微服务数据库只有50万个客户。在customers micro服务中,您不需要为每个租户建立数据库,但在product inventory micro服务中,您需要拥有3亿条记录,这在性能方面非常有用。正如我上面所说的,从一个或两个物理数据库开始,随着时间的推移,您的数据会增加,并且您需要它。这样,您将在服务器的开发和维护中节省一些开销,至少在您不需要的时候是这样。

 类似资料:
  • 我想知道如何为每个租户提供定制。我想提供在租户想要的每种形式中添加新字段的设施,包括字段名、数据类型等。现在我的问题是如何为这种类型的场景设计数据库表?正如我所想的那样,我们必须给每个表单赋予表单id,每当租户在表单中创建新字段时,应该在数据库表中创建一个新的行,该行应该具有租户id、表单id、字段名称、数据类型等... 现在请给我真正的解决方案的朋友......我需要这个数据库表设计解决方案立即

  • 我们正在开发一个多租户应用程序。在体系结构方面,我们为业务逻辑设计了共享中间层,为数据持久性设计了每个租户一个数据库。也就是说,业务层将与每个租户的数据库服务器建立一组连接(连接池)。这意味着应用程序为每个租户维护单独的连接池。如果我们预计约有5000个租户,那么这个解决方案需要高资源利用率(每个租户的应用服务器和数据库服务器之间的连接),这会导致性能问题。 我们已经通过保持公共连接池解决了这个问

  • 我必须在j2ee中开发一个多租户SaaS应用程序,从Iaas和PaaS开始实现三种云模型,我选择了openstack和openshift origin。SaaS应用程序的第一个标准是多租户,我知道有三种方法来实现它——单独的数据库——共享数据库,单独的模式——共享数据库,共享模式。我在这里迷失了方向,因为许多框架,比如ATHENA,ORM,比如hibernate,还有TOPLINK。我需要帮助了解

  • 我有一个支持多租户的Spring Boot应用程序(请参阅https://medium.com/swlh/multi-tenancy-implementation-using-spring-boot-hibernate-6a8e3ecb251a)每个数据库都有一堆jpa实体。不过,我有一个实体表租户,它应该只存在于默认数据库中,并存储关于各种租户的信息(例如数据库名称)。如何在租户/数据库设置中修

  • 我正在使用Java、Spring、Struts2和Hibernate设计一个多租户SaaS Web应用程序。经过一些研究,我选择在共享数据库、共享模式、共享表的方法中实现多租户。并用tenantid标记每个db行。 我已经重写了我的应用程序,所以管理者和DAO将把tenantId作为一个参数,只为正确的数据库资源服务。 当获取信息时,这对所有视图来说都是完美的。也用于创建新的东西(使用登录的用户t

  • 我们正在为奖励计划运行一个多租户SaaS应用程序。 目前,我们在数据库中分别管理每个租户的队列。 每个承租人可以有一个通知、奖励、bulk_operations队列。 我们知道这不是最好的方法和最好的做法。 我们正在计划扩展应用程序,我们需要以最好的方式设置队列和队列工作者。 任何建议都是很好的。我们对队列使用任何服务都持开放态度,如SQS、Redis等。我们需要为每个租户提供一个单独的队列。 [