MassTransit:合同类的模式和做法

时间:2019-03-13 16:48:46

标签: message-queue masstransit

  1. 微服务体系结构的常见建议是避免在微服务之间共享消息类。 MassTransit在发送/接收消息时严重依赖.NET类型信息,因此,如果您在两个不同的微服务中声明两个相似的类型,它将无法正常工作。

是否可以通过一些其他配置来实现?

  1. MassTransit中的典型模式是声明消息接口而不是POCO,然后将匿名对象传递给Publish / Send方法。在这种情况下,如果我在消息界面中进行了某些更改(例如,重命名属性),则不会收到编译时错误。

为什么推荐这个?如何处理匿名对象的脆弱性?

谢谢!

1 个答案:

答案 0 :(得分:4)

首选消息接口的建议基于“共享模式,而不是类型”原则。接口是合同,可以共享合同。您提到自己“避免共享消息_classes”。这是因为类也具有行为,并且许多项目都受到包含行为的消息类的困扰,这可能会阻止反序列化,并给消息引入特定于域的关注,实际上,这些仅是属性包。

文档明确指出:

  

强烈建议使用接口进行消息合同,   基于几年的经验,不同水平的   开发人员经验。

,尽管这一建议很强烈,但不能视为一项要求。如果组织中的所有开发人员都清楚消息是属性包的概念,并且只包含具有原始类型的属性,并且最多包含具有原始类型的属性类型的复杂类型,则可以选择使用类而不是接口。

没有建议甚至没有建议使用匿名类型。这是可能的,但仅此而已。您可以完美地使用在消息生产者端实现消息接口的类,然后将无法随意分配该接口中不存在的属性。

您只与使用者共享接口,并且由于接口是只读接口,因此您不会遇到反序列化错误的问题,因为某些设置程序具有一些奇怪的代码,一个开发人员认为这些代码对于消息类型很有用。

在我们的实践中,我们使用接口,但从未使用匿名对象。我们还广泛使用POCO作为消息,因为开发人员拥有足够的经验并了解消息传递的工作原理。

关于共享的最后一件事是,我们不再使用nuget包共享消息契约。尽管它看起来很有吸引力且安全,但它在我们的日常工作中还是有一些障碍。我们更喜欢复制消息类(或接口)而不是使用源包。如果团队遵循版本控制和弱模式等良好做法,则不会产生任何问题。您唯一需要注意的就是保持名称空间完整。