首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何处理微服务架构中的共享状态?

如何处理微服务架构中的共享状态?
EN

Stack Overflow用户
提问于 2015-02-27 22:44:20
回答 3查看 6.9K关注 0票数 19

在我们公司,我们正在从一个巨大的单片应用程序过渡到一个微服务架构。这一决定的主要技术驱动因素是能够独立扩展服务的需求和开发的可扩展性-我们有十个scrum团队在不同的项目(或“微服务”)中工作。

过渡过程正在顺利进行,我们已经开始从这种新的技术和组织结构的优势中受益。现在,另一方面,有一个我们正在努力解决的主要痛点:如何管理这些微服务之间的依赖关系的“状态”。

让我们举个例子:其中一个微服务处理用户和注册。这个服务(让我们称它为X)负责维护身份信息,因此是用户“ids”的主要提供者。其余的微服务对此有很强的依赖性。例如,有一些服务负责依赖于这些用户in的用户简档信息(A)、用户许可(B)、用户组(C)等,因此需要维护这些服务之间的某些数据同步(即,服务A不应具有用于未在服务X中注册的userId的信息)。我们目前通过使用RabbitMQ通知状态更改(例如,新注册)来维护此同步。

正如您可以想象的那样,有许多X:许多“主”服务以及它们之间更复杂的依赖关系。

主要问题出现在管理不同的开发/测试环境时。每个团队(因此,每个服务)都需要经历几个环境,以便将一些代码放在活动的环境中:持续集成、团队集成、验收测试和活动环境。

显然,我们需要在所有这些环境中工作的所有服务,以检查系统是否作为一个整体工作。现在,这意味着为了测试依赖服务(A,B,C,...)我们不仅要依赖服务X,还要依赖它的状态。因此,我们需要以某种方式保持系统的完整性,并存储全局和相干状态的。

我们当前的方法是从实时环境中获取所有数据库的快照,进行一些转换以缩小和保护数据隐私,并在特定环境中进行测试之前将其传播到所有环境。这显然是一个巨大的开销,无论是在组织上还是在计算资源上:我们有十个持续集成环境,十个集成环境和一个验收测试环境,所有这些环境都需要用来自实时的共享数据和最新版本的代码频繁地“刷新”。

我们正在努力寻找一种更好的方法来缓解这种痛苦。目前我们正在评估两个选项:

  1. 对所有这些服务使用类似docker的容器
  2. 具有每个服务的两个版本(一个用于该服务的开发,另一个用作沙箱,供其他团队在其开发和集成测试中使用)

这些解决方案都不能缓解服务之间共享数据的痛苦。我们想知道其他一些公司/开发人员是如何解决这个问题的,因为我们认为这在微服务架构中一定很常见。

你们是怎么做到的?你也有这个问题吗?有什么建议吗?

很抱歉长篇大论的解释,非常感谢!

EN

回答 3

Stack Overflow用户

发布于 2015-07-13 18:14:01

这一次我从不同的角度阅读了你的问题,所以这里有一个“不同的观点”。我知道这可能太晚了,但希望这有助于进一步的发展。

看起来shared state是错误解耦的结果。在“正确的”微服务架构中,所有微服务都必须在功能上而不是逻辑上隔离。我的意思是,这三个user profile information (A), user permissions (B), user groups (C)在功能上看起来是一样的,在功能上或多或少是一致的。它们似乎是具有连贯存储的单个user microservice。我在这里看不到任何将它们解耦的理由(或者至少你还没有告诉过它们)。

因此,真正的问题与微服务隔离有关。理想情况下,每个微服务都可以作为完整的独立产品存在,并交付定义良好的业务价值。在详细阐述系统架构时,我们将其分解为微小的逻辑单元(在您的情况下为A、B、C等,甚至更小),然后定义功能上一致的子组。我不能告诉你如何做到这一点的确切规则,也许是一些例子。单元之间复杂的通信/依赖关系,以及它们无处不在的语言中的许多常见术语,因此看起来这些单元属于相同的功能组,因此属于微服务。

因此,从您的示例中可以看出,由于只有一个存储,因此您只有一种方法来管理其一致性。

顺便说一句,我想知道你到底是怎么解决你的问题的?另外,如果你喜欢我的想法,你可以随意接受它。

票数 9
EN

Stack Overflow用户

发布于 2015-03-06 18:41:01

让我试着重新表述这个问题:

演员:

  • X: UserIds (帐户状态)
    • 提供服务以获取ID (基于凭据)和account

的状态

  • A: UserProfile
    • 使用X检查用户帐户的状态。存储名称以及指向account
    • provide服务的链接,以基于ID

获取/编辑名称

  • B: UserBlogs
    • 以同样的方式使用X。当用户使用A根据用户名搜索博客文章时,将博客文章与指向帐户的链接一起存储
    • 提供服务获取/编辑基于ID的博客条目列表
    • 提供服务以根据名称搜索博客文章(依赖于A)

  • C: MobileApp
    • 将X、A、B的功能封装到一个移动应用程序中
    • 依赖于与所有其他应用程序之间定义良好的通信契约(遵循@neleus语句)提供上述所有服务

Requirements:

对于X、A、B、C团队的uncoupled

  • Integration环境,需要使用最新的功能进行更新(为了执行集成,针对X、A、B、C的环境需要有“足够”的数据集(以便执行负载测试和发现边缘情况)

遵循@eugene的想法:让每个团队提供的每个服务都有mock将允许1)和2)

  • 成本更多的是来自团队的开发
  • 以及模拟和主要
  • 的维护是这样一个事实,即您拥有一个整体系统(您还没有一组干净的、定义良好的/隔离的服务)

建议的解决方案:

如果有一个共享环境,需要解析一组主数据3)呢?每个“交付的服务”(即在生产中运行)都是可用的。每个团队都可以选择在这里使用哪些服务,以及在自己的环境中使用哪些服务

我能看到的一个直接缺点是数据的共享状态和一致性。

让我们考虑一下针对主数据运行的自动化测试,例如:

  • B为了在其博客服务上工作而更改名称(归A所有),
    • 可能会中断A,也就是C

为了在某些权限方案中工作,

  • A会更改帐户的状态
    • 可能会破坏X,

  • C会在相同的帐户上更改所有内容
    • 会破坏所有帐户

主数据集将很快变得不一致,并失去上面要求3)的价值。

因此,我们可以在共享的主数据上添加一个“常规”层:任何人都可以从全集读取,但只能修改他们创建的对象?

票数 1
EN

Stack Overflow用户

发布于 2015-03-03 17:30:58

从我的角度来看,只有使用服务的对象才应该具有状态。让我们考虑一下您的示例:服务X负责用户Id,服务A负责配置文件信息,等等。让我们假设用户Y在系统中有一些安全令牌(例如,可以使用它的用户名和密码创建,应该是唯一的)条目。然后,包含用户信息的客户端将安全令牌发送到服务X。服务X包含关于链接到该令牌的用户ID的信息。在新用户的情况下,服务X创建新的ID并存储其令牌。然后,服务X将ID返回给用户对象。user对象通过提供用户ID向服务A询问用户配置文件,服务A获取该ID并询问服务X是否存在该ID。服务X发送肯定答案,然后服务A可以通过用户ID搜索配置文件信息,或者要求用户提供此类信息以创建配置文件信息。同样的逻辑也应该适用于B和C服务。它们必须相互交谈,但它们不需要知道用户状态。

关于环境的几句话。我建议使用puppets。这是自动化服务部署过程的方法。我们使用傀儡在不同的环境中部署服务。可以到达傀儡脚本并允许灵活配置。

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

https://stackoverflow.com/questions/28767707

复制
相关文章

相似问题

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