服务总线的消息合同是如何版本化的?
How are message contracts versioned for service buses?
假设我们使用基于接口的消息契约,例如为 MassTransit 推荐的那样。
首先,这些接口是如何在所有应用程序之间共享的?
假设我们在 nuget 包中提供它们。 (这是要走的路吗?)
其次,我们现在如何确保所有应用程序使用相同的版本?
我们是否应该每次都使用新的接口(例如messageV1、messageV2)来向后兼容?这将要求我们一次发送多条消息而不是 1...
或者我们应该升级 window,所有应用程序都同时更新?
请同时查看答案和评论,如果您正在查看相同内容。
真的在这里得到了一些质量反馈 :D
MassTransit 未明确支持任何类型的版本控制,因此您可以自由选择做您认为最好的事情。您在问题中所做的假设或多或少与我做事的方式完全相同:
- 合同作为 nuget 包在子系统之间共享
- 当需要进行更改时会创建新接口,接口只会扩展具有可空/向后兼容的更改
- 如有必要,多个消息 published/sent 以保持向后兼容性
- 当不再需要时,旧版本可以obsoleted/removed
这看起来工作量很大,但如果您从一开始就按照这种方式设计东西,那就还不错,而且确实有回报。
消息合同与任何其他类型的 API 合同没有区别,您可以相应地对待它们。将任何 public API 视为流向世界的事物,您无法控制使用 API 的每个人。
关于合同版本控制有很多很好的指导方针,但没有什么是专门针对 MassTransit 的。
另一方面,MassTransit 就如何处理 the documentation 中的消息版本提供了一些建议。特别是,如果您遵循弱模式方法并添加可以为空且对消费者不重要的属性,我们建议不要创建新版本。此外,您可以使用界面组合,例如文档中的示例:
class RemoteImageCachedEvent :
RemoteImageCached,
RemoteImageCachedV2
{
Guid EventId { get; set; }
DateTime Timestamp { get; set; }
Guid InitiatingCommandId { get; set; }
Uri ImageSource { get; set; }
string LocalCacheKey { get; set; }
Uri LocalImageAddress { get; set; }
}
因此,当您发布 RemoteImageCachedEvent
的实例时,它将传送到两个接口的消息交换。
如果你完全改变你的 API 表面,这是消息,还是 Grpc,或 REST,你需要考虑向后兼容性,并在一段时间内同时使用新旧消息。给人们一些时间从一个版本更改到另一个版本,并在需要时杀死旧版本。
假设我们使用基于接口的消息契约,例如为 MassTransit 推荐的那样。
首先,这些接口是如何在所有应用程序之间共享的? 假设我们在 nuget 包中提供它们。 (这是要走的路吗?)
其次,我们现在如何确保所有应用程序使用相同的版本?
我们是否应该每次都使用新的接口(例如messageV1、messageV2)来向后兼容?这将要求我们一次发送多条消息而不是 1...
或者我们应该升级 window,所有应用程序都同时更新?
请同时查看答案和评论,如果您正在查看相同内容。
真的在这里得到了一些质量反馈 :D
MassTransit 未明确支持任何类型的版本控制,因此您可以自由选择做您认为最好的事情。您在问题中所做的假设或多或少与我做事的方式完全相同:
- 合同作为 nuget 包在子系统之间共享
- 当需要进行更改时会创建新接口,接口只会扩展具有可空/向后兼容的更改
- 如有必要,多个消息 published/sent 以保持向后兼容性
- 当不再需要时,旧版本可以obsoleted/removed
这看起来工作量很大,但如果您从一开始就按照这种方式设计东西,那就还不错,而且确实有回报。
消息合同与任何其他类型的 API 合同没有区别,您可以相应地对待它们。将任何 public API 视为流向世界的事物,您无法控制使用 API 的每个人。
关于合同版本控制有很多很好的指导方针,但没有什么是专门针对 MassTransit 的。
另一方面,MassTransit 就如何处理 the documentation 中的消息版本提供了一些建议。特别是,如果您遵循弱模式方法并添加可以为空且对消费者不重要的属性,我们建议不要创建新版本。此外,您可以使用界面组合,例如文档中的示例:
class RemoteImageCachedEvent :
RemoteImageCached,
RemoteImageCachedV2
{
Guid EventId { get; set; }
DateTime Timestamp { get; set; }
Guid InitiatingCommandId { get; set; }
Uri ImageSource { get; set; }
string LocalCacheKey { get; set; }
Uri LocalImageAddress { get; set; }
}
因此,当您发布 RemoteImageCachedEvent
的实例时,它将传送到两个接口的消息交换。
如果你完全改变你的 API 表面,这是消息,还是 Grpc,或 REST,你需要考虑向后兼容性,并在一段时间内同时使用新旧消息。给人们一些时间从一个版本更改到另一个版本,并在需要时杀死旧版本。