1. 程式人生 > 其它 >.net 實時通訊_基於 RabbitMQ 的實時訊息推送

.net 實時通訊_基於 RabbitMQ 的實時訊息推送

技術標籤:.net 實時通訊

實現伺服器端推送的幾種方式

Web 應用都是基於 HTTP 協議的請求/響應模式,無法像 TCP 協議那樣保持長連線,因此 Web 應用就很難像手機那樣實現實時的訊息推送。就目前來看,Web 應用的訊息推送方式主要有以下幾種:

1.Ajax 短輪詢

Ajax 輪詢主要通過頁面端的 JS 定時非同步重新整理任務來實現資料的載入,但這種方式實時效果較差,而且對服務端的壓力也較大。

2. 長輪詢

長輪詢主要也是通過 Ajax 機制,但區別於傳統的 Ajax 應用,長輪詢的伺服器端會在沒有資料時阻塞請求直到有新的資料產生或者請求超時才返回,之後客戶端再重新建立連接獲取資料,具體實現方式見圖 1 所示。但長輪詢服務端會長時間地佔用資源,如果訊息頻繁傳送的話會給服務端帶來較大的壓力。

圖 1. 長輪詢實現方式

8debcf37cd7419da8658865013415407.png

3.WebSocket 雙向通訊

WebSocket 是 HTML5 中一種新的通訊協議,能夠實現瀏覽器與伺服器之間全雙工通訊。如果瀏覽器和服務端都支援 WebSocket 協議的話,該方式實現的訊息推送無疑是最高效、簡潔的。並且最新版本的 IE、Firefox、Chrome 等瀏覽器都已經支援 WebSocket 協議,Apache Tomcat 7.0.27 以後的版本也開始支援 WebSocket。

RabbitMQ 簡介

AMQP,即 Advanced Message Queuing Protocol,高階訊息佇列協議是應用層協議的一個開放標準,為面向訊息的中介軟體設計。訊息中介軟體主要用於元件之間的解耦,訊息的傳送者無需知道訊息使用者的存在,反之亦然。AMQP 的主要特徵是面向訊息、佇列和路由,可靠且安全。RabbitMQ 是一個開源的 AMQP 實現,伺服器端用 Erlang 語言編寫,支援多種客戶端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP 等,支援 Ajax。用於在分散式系統中儲存轉發訊息,在易用性、擴充套件性、高可用性等方面表現不俗。RabbitMQ 中有一些概念需要我們在使用前先搞清楚,主要包括以下幾個:Broker、Exchange、Queue、Binding、Routingkey、Producter、Consumer、Channel。

1.Broker

簡單來說就是訊息佇列伺服器的實體。

2.Exchange

接收訊息,轉發訊息到繫結的佇列上,指定訊息按什麼規則,路由到哪個佇列。

3.Queue

訊息佇列載體,用來儲存訊息,相同屬性的 queue 可以重複定義,每個訊息都會被投入到一個或多個佇列。

4.Binding

繫結,它的作用就是把 Exchange 和 Queue 按照路由規則繫結起來。

5.RoutingKey

路由關鍵字,Exchange 根據這個關鍵字進行訊息投遞。

6.Producter

訊息生產者,產生訊息的程式。

7.Consumer

訊息消費者,接收訊息的程式。

8.Channel

訊息通道,在客戶端的每個連線裡可建立多個 Channel,每個 channel 代表一個會話。

安裝 RabbitMQ 服務

本文提出的方案是基於 RabbitMQ 訊息伺服器,因此最開始需要安裝 RabbitMQ 服務及相關外掛。RabbitMQ 是基於 Erlang 語言開發的,所以首先必須安裝 Erlang 執行時環境。下面以 CentOS6.5 64 位伺服器為例,講述整個服務的安裝過程:

1. 下載 erlang-R15B-02.1.el5.x86_64.rpm 並安裝

1

# rpm -ivh erlang-R15B-02.1.el5.x86_64.rpm

2. 下載 rabbitmq-server-3.2.1-1.noarch.rpm 並安裝

1

# rpm -ivh rabbitmq-server-3.2.1-1.noarch.rpm

3. 啟用相關外掛

1

# rabbitmq-plugins enable rabbitmq_management rabbitmq_web_stomp rabbitmq_stomp

4. 重啟 RabbitMQ 服務

1

# service rabbitmq-server restart

5. 驗證是否安裝成功

此時我們可能通過 Web 瀏覽器來檢視 RabbitMQ 的執行狀態,瀏覽器中輸入 http://{server_ip}:15672,用 guest/guest 預設的使用者和密碼登入後即可檢視 RabbitMQ 的執行狀態。

基於 RabbitMQ 的實時訊息推送

RabbitMQ 有很多第三方外掛,可以在 AMQP 協議基礎上做出許多擴充套件的應用。Web STOMP 外掛就是基於 AMQP 之上的 STOMP 文字協議外掛,利用 WebSocket 能夠輕鬆實現瀏覽器和伺服器之間的實時訊息傳遞,具體實現方式如下圖 2 所示:

圖 2. 瀏覽器和伺服器之間的實時訊息傳遞實現

37160dc71abaae743e38c3b982e1c425.png

訊息傳送者

下面舉個例子來說明整個過程,以 Java 作為 RabbitMQ 客戶端訊息傳送者,Web 瀏覽器作為訊息消費者。

清單 1.Java 端程式碼

import java.io.IOException;import java.util.concurrent.TimeoutException;import com.rabbitmq.client.Channel;import com.rabbitmq.client.Connection;import com.rabbitmq.client.ConnectionFactory;public class Program { public static void main(String[] args) throws IOException, TimeoutException { ConnectionFactory factory = new ConnectionFactory(); factory.setHost("192.168.1.101"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); channel.exchangeDeclare("rabbitmq