9,EasyNetQ-版本化消息

要启用对版本化消息的支持,您须要确保配置所需的组件。 最简单的方法是:spa

var bus = RabbitHutch.CreateBus( "host=localhost", services => services.EnableMessageVersioning() )

一旦启用了对版本化消息的支持,您必须明确选择任何您但愿被视为版本化的消息。版本控制

// 此消息未通过版本控制,在发布时将按照与其余任何方式相同的方式进行处理
public class MyMessage
{
    public string Text { get; set; }
}

// 这条消息是版本化的,而且会发现它是MyMessageV2和MyMessage订阅者的方式
public class MyMessageV2 : MyMessage, ISupersede<MyMessage>
{
    public int Number { get; set; }
}

1,它是如何工做的code

当您发布消息时,EasyNetQ一般会为消息类型建立一个交换并将消息发布到该交换。 订户建立绑定到交易所的队列,所以接收发布给它的任何消息。blog

在启用消息版本控制的状况下,EasyNetQ将为版本层次结构中的每一个消息类型建立一个交换,并将这些交换绑定在一块儿。 当您发布MyMessageV2消息时,它将被发送到MyMessageV2交换机,它将自动将其转发到MyMessage交换机。队列

消息序列化时,EasyNetQ将消息类型名称存储在消息属性的Type属性中。 此元数据与您的消息一块儿发送给任何可使用它反序列化消息的订阅者。get

在启用消息版本控制的状况下,EasyNetQ还会将全部被取代的消息类型存储在消息属性的标题中。 订阅者将使用它来找到消息能够被反序列化的第一种可用类型,意思是即便端点没有最新版本的消息,只要它有一个版本,它也能够被反序列化和处理。string

 

2,消息版本指导it

  1. 若是更改没法经过扩展原始消息类型来实现,那么它不是消息的新版本,而是新的消息类型。
  2. 若是您不肯定,则倾向于建立新的消息类型,而不是现有消息的版本。
  3. Versioned消息不该该与请求/响应一块儿使用,由于消息类型是请求/响应协定的一部分,而且即便V2扩展了V1,Request <V1,Response>与Request <V2,Response>也不相同(即公共类V2 :V1 {})
  4. Versioned消息不该该用于发送/接收,由于这是针对性的发送,所以发送者和接收者之间存在声明的依赖关系。
相关文章
相关标签/搜索