NetMQ(ZeroMQ)Client => Server => Client 模式的實現


ØMQ (也拼寫作ZeroMQ0MQZMQ)是一個為可伸縮的分布式或並發應用程序設計的高性能異步消息庫。它提供一個消息隊列, 但是與面向消息的中間件不同,ZeroMQ的運行不需要專門的消息代理(message broker)。該庫設計成常見的套接字風格的API。

      ZeroMQ是由iMatix公司和大量貢獻者組成的社群共同開發的。ZeroQ通過許多第三方軟件支持大部分流行的編程語言 。類庫提供一些套接字(對傳統Berkeley套接字和Unix domain socket的泛化),每一個套接字可以代表一個端口之間的多對多連接。以消息的粒度進行操作,套接字需要使用一種消息模式(message pattern),然后專門為那種模式進行了優化。

如果說ZeroMQ最突出的三個特點是什么? 答案是 快,很快,非常快。相信如果您的單線程隊列能夠在幾秒內完成千萬級別的數據入列和出列您一定會有同樣的感覺。

NetMQ 是使用c# 對ZeroMQ的實現。

閑話不說了,對於這個消息隊列的介紹網上一搜一堆,我這邊就講一下具體的實現吧。

網上大部分的例子都是點對點的 發布=>訂閱,通常消息隊列的應用是 客戶端發布,服務端中轉,客戶端接收,多對多的形式。發布端和接收端是一體的,打個簡單的比喻,QQ群聊天,QQ群號碼就是你訂閱的主題。同時你自己也是發布端,同理其他成員也訂閱了QQ群號碼為主題,流程就成了 你發送消息到騰訊服務器,騰訊服務器轉發消息到所有的群成員QQ,此時他們是訂閱方,你是發布方,反過來群成員發布消息,你也能接收,這時群成員為發布方,你為訂閱方,(打個比方,借用一下騰訊的的場景而已,QQ消息的收發不是這樣的。)

 

現在我們來看一下 Client => Server => Client 模式的實現代碼

服務端:

      static void Main(string[] args)
        {
            using (var xpubSocket = new XPublisherSocket("@tcp://127.0.0.1:1234"))
            using (var xsubSocket = new XSubscriberSocket("@tcp://127.0.0.1:5678"))
            {
                var proxy = new Proxy(xsubSocket, xpubSocket);
                Task.Factory.StartNew(proxy.Start);
                Console.WriteLine("服務端啟動完成。");
                Console.ReadKey();
            }
        }

 

客戶端:

        static void Main(string[] args)
        {
            //發布服務
            PublisherSocket pubSocket = new PublisherSocket();
            pubSocket.Connect("tcp://127.0.0.1:5678");
            Console.WriteLine("連接消息發布代理服務器...\r\n");

            //訂閱服務
            SubscriberSocket subSocket = new SubscriberSocket();
            subSocket.Subscribe("Topic");//訂閱主題
            subSocket.Connect("tcp://127.0.0.1:1234");
            Console.WriteLine("連接消息訂閱代理服務器...\r\n");        

            //發布消息
            pubSocket.SendMoreFrame("Topic").SendFrame("Hello World");
            Console.WriteLine("主題:Topic,發布消息:Hello World\r\n");

            //接收消息
            string topic = subSocket.ReceiveFrameString();
            string message = subSocket.ReceiveFrameString();
            Console.WriteLine(string.Format("主題:{0},訂閱消息:{1}\r\n",topic,message));
            Console.ReadKey();
        }
    }

 

效果演示:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM