【发布时间】:2015-04-30 07:41:54
【问题描述】:
在我们公司,我们正在从庞大的单体应用程序过渡到微服务架构。这一决定的主要技术驱动因素是需要能够独立扩展服务和开发的可扩展性 - 我们有 10 个 Scrum 团队在不同的项目(或“微服务”)中工作。
过渡过程很顺利,我们已经开始受益于这种新技术和组织结构的优势。现在,另一方面,我们正在努力解决一个主要的痛点:如何管理这些微服务之间的依赖关系的“状态”。
让我们举个例子:其中一个微服务处理用户和注册。该服务(我们称之为 X)负责维护身份信息,因此是用户“id”的主要提供者。其余的微服务对这个有很强的依赖。例如,有一些服务负责用户配置文件信息 (A)、用户权限 (B)、用户组 (C) 等,它们依赖于这些用户 ID,因此需要在这些服务之间维护一些数据同步(即服务 A 不应该有未在服务 X 中注册的用户 ID 的信息)。我们目前通过使用 RabbitMQ 通知状态更改(例如新注册)来保持这种同步。
您可以想象,有许多 X:许多“主要”服务以及它们之间的许多更复杂的依赖关系。
主要问题出现在管理不同的开发/测试环境时。每个团队(因此,每个服务)都需要经过几个环境才能使一些代码生效:持续集成、团队集成、验收测试和实时环境。
显然,我们需要在所有这些环境中运行的所有服务来检查系统是否作为一个整体运行。现在,这意味着为了测试依赖服务(A,B,C,...),我们不仅要依赖服务 X,还要依赖它的状态。 因此,我们需要以某种方式维护系统完整性并存储全局一致的状态。
我们目前的方法是从实时环境中获取所有数据库的快照,进行一些转换以缩小和保护数据隐私,并在特定环境中进行测试之前将其传播到所有环境。这显然是组织和计算资源方面的巨大开销:我们有十个持续集成环境、十个集成环境和一个验收测试环境,所有这些环境都需要使用来自实时和最新版本代码的共享数据“刷新”频繁地。
我们正在努力寻找一种更好的方法来缓解这种痛苦。目前我们正在评估两个选项:
- 为所有这些服务使用类似 docker 的容器
- 每个服务有两个版本(一个用于开发该服务,另一个用作沙盒,供其他团队在开发和集成测试中使用)
这些解决方案都不能减轻服务之间共享数据的痛苦。我们想知道其他一些公司/开发人员是如何解决这个问题的,因为我们认为这在微服务架构中一定很常见。
你们做得怎么样?你也有这个问题吗?有什么推荐吗?
抱歉解释太长,非常感谢!
【问题讨论】:
-
当您说存储一个全局和连贯状态时,您是指与实时系统相同的状态还是某个合成状态?正如我所见,您有多个级别的集成环境,每个级别都专注于特定的微服务。
-
理想情况下,微服务不应依赖于其他服务(以及其状态,与@Eugene 所述相同),而应仅依赖于定义明确的通信合同。这种分解的主要好处是独立交付。每个服务都可以独立部署,这适用于任何环境级别(每个团队、分段或实时)。从这个角度来看,每个环境都可以维护自己的合同实施。对于开发和团队环境,这可能是服务模拟器(在您的示例中为 X 模拟器)。它可能类似于您的 sandbox,我不确定。
-
总结一下。这个想法是您不必维护所有环境的实时状态,因为它们中的大多数都不需要它。唯一的例外是登台。
-
感谢您的 cmets,neleus。请阅读我对尤金回答的说明。
-
所有团队就整个系统的“主”测试数据集达成一致 那么您是否考虑过仅将这些数据/状态交付给 staging 而不是所有团队?对于每个团队,设置覆盖定义明确的测试用例集的 X 部分模拟器将花费更少的精力。
标签: deployment architecture integration-testing microservices test-environments