.net 实时通信_基于 RabbitMQ 的实时消息推送
實現服務器端推送的幾種方式
Web 應用都是基于 HTTP 協議的請求/響應模式,無法像 TCP 協議那樣保持長連接,因此 Web 應用就很難像手機那樣實現實時的消息推送。就目前來看,Web 應用的消息推送方式主要有以下幾種:
1.Ajax 短輪詢
Ajax 輪詢主要通過頁面端的 JS 定時異步刷新任務來實現數據的加載,但這種方式實時效果較差,而且對服務端的壓力也較大。
2. 長輪詢
長輪詢主要也是通過 Ajax 機制,但區別于傳統的 Ajax 應用,長輪詢的服務器端會在沒有數據時阻塞請求直到有新的數據產生或者請求超時才返回,之后客戶端再重新建立連接獲取數據,具體實現方式見圖 1 所示。但長輪詢服務端會長時間地占用資源,如果消息頻繁發送的話會給服務端帶來較大的壓力。
圖 1. 長輪詢實現方式
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. 瀏覽器和服務器之間的實時消息傳遞實現
消息發送者
下面舉個例子來說明整個過程,以 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總結
以上是生活随笔為你收集整理的.net 实时通信_基于 RabbitMQ 的实时消息推送的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中国中车可一生持有吗
- 下一篇: “中国复眼 2.0”开工,将完成千万公里