首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >混合多租户的模块化单体与微服务

混合多租户的模块化单体与微服务
EN

Software Engineering用户
提问于 2021-09-28 18:01:54
回答 1查看 665关注 0票数 -1

TLDR:我正在设计一个混合的多租户应用程序,需要处理来自客户(租户)的定制请求,我试图在模块化的monolith模式和微服务模式之间做出决定,这是处理定制的最佳方法,降低开发成本?我的意思是,既然模块/微服务的大小是正确的,那么我们应该如何处理自定义呢?

注:

如果问题需要澄清或混淆,请在评论中提出,我将急于澄清任何事情。

如果你需要更多的信息,请让我知道,我愿意提供它,请尽量温柔,这对我来说太混乱了。

对于这么大的帖子,我很抱歉,但我认为这个信息与我强烈建议阅读整个帖子的决定相关,这包含了我对这个主题所做的背景和研究:

上下文

我正在设计一个混合多租户应用程序,它必须处理自定义,例如:我有一个基本(默认)优惠券功能,但是一个客户(租户)需要在优惠券功能中添加一些特定的逻辑。

您可以在这里阅读更多关于多租户的内容:https://docs.microsoft.com/en-us/azure/azure-sql/database/saas-tenancy-app-design-patterns

需要考虑的事情:

  1. 我们将处理客户要求的最低限度的更改,我们计算了~120个自定义请求,我们将在启动后开始工作。
  2. 我们预计在启动后的第一个月内将有1000名租户(他们已经预先注册)。
  3. 启动后,我们不能每次需要实现某些自定义功能时,中断只需要默认应用功能的客户的操作。

研究

我正在做一些关于架构模式的研究,我发现了两个主要有趣的模式,我认为这些模式可以解决我的问题:

微服务模式

来源:https://towardsdatascience.com/looking-beyond-the-hype-is-modular-monolithic-software-architecture-really-dead-e386191610f8

以下是Microservice体系结构的特点:整个应用程序被分割成单独的进程,其中每个进程可以包含多个模块。

  1. 与模块化单体或SOA相反,微服务应用程序是垂直分割的(根据功能或域)
  2. Microservice边界是外部的。因此,微服务通过网络呼叫相互通信。
  3. 每个Microservice都有自己的数据库,而不是单一的数据库。
  4. 由于“每个微服务数据库”,需要额外的数据同步。

模单点模式

来源:https://towardsdatascience.com/looking-beyond-the-hype-is-modular-monolithic-software-architecture-really-dead-e386191610f8

以下是模块化整体架构的特点:

  1. 完整的软件系统是作为一个整体部署的(全部或无)
  2. 模块边界是内部的,可以很容易地交叉,这会导致意大利面代码(如上面的黄色线所示)。
  3. 应用程序作为一个单一进程运行。
  4. 它是一种适用于所有类型的应用程序的解决方案--模块间没有严格的数据所有权

我所理解的

到目前为止,我所了解的是:

  1. 每个微服务都是一个单独托管的应用程序,并且使用网络调用与其他微服务交互,所以我需要管理多个服务器(kubernetes或docker群)和microservices(RabbitMQ)之间的交互。
  2. 模块化monolith是一个包含模块的应用程序,它更容易开发,因为您不需要管理不同的服务器,模块之间的交互也比较简单,但是由于我需要重新编译,所以很难处理定制,可能会给其他租户带来停机时间。
  3. 如果我选择微服务模式,我将需要投资于一个devops团队来管理服务器和微服务交互,但它将更具可伸缩性。
  4. 如果我选择模块化的一元模式,我需要对每个定制进行更多的投资。

问题

  1. 我们应该使用哪种模式来处理定制,降低开发成本?
  2. 我们应该如何处理自定义?我的意思是,既然模块/微服务的大小是正确的,我现在该如何处理?
  3. 对于微服务的开发和交互,您推荐哪一种技术栈?

编辑

定制示例

我们所指的定制的一个真正的例子是:

这个基本的应用程序有一个商店功能,它用单位价格计算总价格,一个拥有杂货店的顾客(租户)不计算单位价格,但他在(x)公斤之后计算每公斤价格,他要求我们改变他的商店的定价制度。

EN

回答 1

Software Engineering用户

回答已采纳

发布于 2021-09-29 08:18:58

对我来说,关于定制的问题与微观服务/模块一元问题是正交的。也就是说,它们并没有真正的联系。

据我所知,微服务的主要好处似乎是减少了团队间的依赖关系。单块开发有一个问题,当软件发布时,所有的团队都必须使用它们的特性。因此,它需要团队之间的同步,而且随着团队数量的增加,这变得更加困难。微服务通过允许每个团队独立发布更新来解决这个问题。更容易的扩展和容错是一个不错的好处。

模块monolith仍然需要一个单独的版本,因此仍然需要至少一些同步。但是,对于较小的团队来说,这可能还是比较合适的,因为这不是什么问题。我个人倾向于一个模块化的monolith,因为我认为微服务有点夸张,但它将完全取决于您的应用程序。

定制可以通过使用特性标志、配置简单的逻辑表达式、使用某种简单的运行时脚本进行配置、一个完整的插件系统或用自定义版本替换整个软件组件来完成。但是,我不知道微服务如何在不重新启动的情况下解决加载/卸载定制代码等问题。除非您每个客户有一个微服务,否则您只需将问题转移到微服务。

如果您使用某种用于自定义的插件系统,通常有一些方法可以在运行时管理代码的加载/卸载,但它可能取决于语言,最好是单独问一个问题。

票数 4
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/432316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档