基於訂閱的服務通訊架構體系

smark發表於2016-01-12

        說到訂閱服務通訊一般都會想到基於佇列的訊息生產和消費模式,這也是在實際應該中比較常用的方式。一般生產者把訊息傳送到佇列服務中心,然後消費者去中心訂閱;然而這種方式需要一個訊息服務中心,而在這裡所說的訂閱服務通訊則有點不一樣,因為需要更靈活的訂閱方式,所以需要去除中心化處理;但去除中心化那則需要考慮的事情想對複雜,最基礎的環節就是如何維護生產者和消費者的關係,接下來講解如何實現這種方式。

中心化通訊方式

        由於在應用中一般會使用佇列服務作為訊息中心,所以生產者和消費並沒有直接的關係,一個把訊息投遞到中心,一個從中心中獲取。

        

去除中心化

        去除中心化其實就是生產和消費並不依賴於中心服務,每個生產和消費自身就是一箇中心服務,簡單地說也不存在生產和消費劃分;每個服務充當生產的同時也是消費者。

            

        去除中心後服務之間都可以構建訂閱體系,即其中一個服務故障也不會影響其他訂閱服務,這樣在可靠性和靈活性上對於中心化服務都有著很大的優勢;但有一個很明顯的問題就是沒有中心服務,服務之間是如何發現對方呢,這的確是一個麻煩的事情。

如何發現服務

        對於不同服務通訊需要做的事情是發現對方,一般的服務程式都有固定的地方(域名)和埠來告訴使用者,你可以通過這個地方connect進來。既然需要去除中心化那自然就不會知道現在有什麼服務,所以需要制定一套服務自我發現機制來確保服務間可以自動發現。

            

        既然我們不知道對方的服務地址和埠,那怎樣發現對方呢?其實每個服務可以把自己的服務資訊通過UDP廣播出去,這樣其他服務就可以接收到相關的廣播,當A接收到其他服務的UDP廣播後就會可以知道網內有什麼服務,這樣就可以向具體的服務發起連線請求,並建立服務與服務之間的通訊。

消費者註冊同步

        服務和服務之間已經握手了,那消費註冊就會變得比較簡單,因為消費者隨便一臺服務上註冊都可以同步到同一叢集中的所有服務上。

            

            如果消費者在多個服務註冊,那整體的通訊結構如下

            

 

程式碼

  • 消費者
                Route.DefaultNode.Open();
                mSwitch = new SubscribeSwitch();
                mSwitch.GetServiceSubscribe("HELLO").RegisterProcess<Hello>((o, e) =>
                {
                    e.Reply(e.Data); 
                });
  • 生產者
                Route.DefaultNode.Open();
                mSwitch = new SubscribeSwitch();
                Hello hello = new Hello { Name = "hello,how are you?"  };
                hello = mSwitch.Send<Hello>("HELLO", hello);
    在應用程式碼中不存所有服務地址的概念,只要節點服務開啟就會自動向網內進行服務資訊廣播,並發現網路的其他服務節點。

存在問題

        由於UDP廣播只能有效於區域網段,不適用於廣域網,所以些通訊架構體系也只適用於應用內部的叢集通訊體系應用,如果需要應用到廣播網,那則需要一個發現中心來確認服務在廣域網下是可發現的。

 

相關文章