Architecture 微服务:如何在多个微服务之间迁移数据?

Architecture 微服务:如何在多个微服务之间迁移数据?,architecture,migration,microservices,bounded-contexts,Architecture,Migration,Microservices,Bounded Contexts,也许我们有这样一组微服务: 用户服务和产品服务是一些具有自己业务逻辑的服务。模板服务是一种根据复杂逻辑(例如,应发送给用户的电子邮件模板等)响应填充某些模板的服务。因此,它存储模板本身以及用于所有模板(访问、样式等)的常规信息所以它是一个模板引擎,但它不负责它应该填充的模板内容。 例如,我们有下一个模板:HelloWorldTemplate:“你好,世界!我的名字是{UserName}”。 当用户服务需要发送电子邮件时,他要求模板服务通过使用类型(HelloWorldTemplate)和模板特定

也许我们有这样一组微服务: 用户服务和产品服务是一些具有自己业务逻辑的服务。模板服务是一种根据复杂逻辑(例如,应发送给用户的电子邮件模板等)响应填充某些模板的服务。因此,它存储模板本身以及用于所有模板(访问、样式等)的常规信息所以它是一个模板引擎,但它不负责它应该填充的模板内容。 例如,我们有下一个模板:HelloWorldTemplate:“你好,世界!我的名字是{UserName}”。 当用户服务需要发送电子邮件时,他要求模板服务通过使用类型(HelloWorldTemplate)和模板特定参数(用户名)发出请求来填充这些模板。 模板服务负责样式和常规参数。 抱歉,这么长时间的介绍)

我们在用户服务中开发了一些新功能,我们需要模板服务中的一个新模板,生日问候语。 因此,当我们将UserService从v1.1升级到v1.2时,我们需要更改另一个服务模板的内部状态。如何做到这一点——这是我的主要问题

我可以想象有几种方法可以做到这一点,但它们都有许多缺点。(假设所有服务都有SQL数据库,它简化了问题)


1.我们可以在更新用户服务之前更新模板服务,并在此服务中添加SQL迁移,只需在表中插入所需数据即可

专业人士

  • 非常容易实现
  • (有效)
缺点

  • 我们必须让开发用户服务的团队访问模板服务repo(他们还必须知道模板的内部DB结构,这是不好的),或者我们必须为开发模板服务的团队创建一个单独的任务来添加新模板

2.我们可以从其他服务访问模板数据库,并提交 数据库迁移脚本,例如,用户服务repo

优点:

  • 仍然易于实现

  • 我们不必向其他团队授予模板服务回购的访问权

缺点:

  • 我们必须从多个服务连接到模板数据库,这会破坏封装
  • 与第一个选项相同

3.我们可以添加HTTP端点以向模板服务添加新模板,在从v1.1迁移到v1.2的过程中,用户服务应该对该端点执行一个(或多个)请求,同时运行自己的数据库迁移

优点:

  • 我们可以保持数据的一致性(模板可以对这些请求运行一些验证以防止无效数据)
  • 我们不向世界公开模板服务的内部结构(例如,我们可以轻松地从SQL DB切换到另一种类型的DB)
  • 这些迁移将存储在用户服务中,开发此服务的团队将编写和维护这些迁移,因此我们可以减少跨团队的沟通并缩短功能交付时间
缺点:

  • 很难实施
  • 如何存储和写入此请求?我们可以使用现有的请求格式(CURL、Postman请求等,但它可能比简单的sqldml语句更详细)。此外,我们可以使用yaml、json或其他标记语言创建自己的请求定义语言,但它看起来像是创建自己的轮子;) 难以支持事务(例如,如果从v1.1迁移到v1.2失败,则很难回滚更改)


因此,我非常感谢您提供的任何建议、有用的链接、模式和解决此问题的最佳实践。

您的问题与编程无关,因此应该关闭,基本上您在团队之间分配任务方面有问题。就最安全的部署而言,第一种方法是正确的。如果有一个团队负责一项微服务,那么您将给该团队一项任务来改变它,即使是数据库迁移。如果有两个微服务,那么两个团队应该有两个任务。如果您在将任务分配给其他团队时遇到问题,则您的功能未充分分解为任务。它们实际上都有SQL数据库(或关系数据库),还是仅出于说明目的而将数据库用作模板存储?您的问题与编程无关,因此应该关闭,基本上,在团队之间分配任务是有问题的。就最安全的部署而言,第一种方法是正确的。如果有一个团队负责一项微服务,那么您将给该团队一项任务来改变它,即使是数据库迁移。如果有两个微服务,那么两个团队应该有两个任务。如果您在将任务分配给其他团队时遇到问题,则您的功能没有充分分解为任务。它们实际上都有SQL数据库(或关系数据库),还是仅出于说明目的而使用数据库作为模板存储?