在Kevin Goldsmith的2015年谈论microservices at Spotify(从15:25 - 17:43),他提到当他们创建一个新版本的API时,他们只是创建一个新的服务器,并保持旧服务器运行旧版本,只要仍然有客户端调用它(在这种情况下,嵌入Spotify的智能灯)。
我很困惑他们如何能够维护和提供可能年份的旧版本,当时在这段时间内肯定会有数据库架构更改?
我可以看到一些可能的解决方案,但它们似乎都不合理:
解决方案1听起来会引起太多的代码味道,遗留代码无处不在(在我看来,凯文似乎暗示他们肯定不会这样做。)
解决方案2听起来像是一个噩梦,可以将数据从其他服务或报告中提取出来。如果您想要的实体信息在您要求的实体的另一个版本的数据库中,该怎么办?
解决方案3听起来更像是一场噩梦,因为您必须编写代码来将您的版本请求迁移到您上面和下面的版本。这意味着您无法在创建新版本时保留现有(当前正在生产的版本)版本,因为您需要添加迁移以向前和向后移动请求以便所有版本收到了请求的正确参数。
希望我在这里错过了一些简单的东西,并且有一个神奇的解决方案可以让这个问题变得更容易,但我真的看不出他们如何能够实现这个目标?
谢谢!
答案 0 :(得分:1)
我不知道Spotify在内部是如何做到的。
虽然从他谈论它的方式来猜测,但我不确定这些微服务是否存储任何数据。我觉得它们本质上是一个表示层而不是其他东西(可能是内部服务层)。
如果微服务可以有多个版本处于活动状态,并且它也是某些数据的所有者,那么可能会发生以下两种情况之一:
我不认为运行架构并且永远不会改变它会真正长期运作。事情发生变化,变化是必然的。微生物/ SOA(IMO)最大的好处之一是变化更容易,因为域很小并且包含在内。当代码量很低时,您可以合理安全地快速完成更改存储机制(甚至可能更新的存储类型)。
在我的文章Microservice versioning; How to make breaking changes without breaking stuff
中有关微服务版本控制的更多想法