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消息不該該用於發送/接收,由於這是針對性的發送,所以發送者和接收者之間存在聲明的依賴關係。
相關文章
相關標籤/搜索