IT|程式設計|Front-End|Redis 及 WebSocket 的一個實時消息推送系統

需求分析 2017-06-12 Mon 後台同時對接了網頁,微信公眾號,iOS 以及 Android客戶端。在某些特定場景下,比如一個用戶接收到其他用戶的提問,我們就需要向這個用戶推送一條消息 (設備狀態)。用戶或者在手機上收到了一條彈窗通知,或者在網頁上看到了消息圖標顯示小紅點 (告警消息)。 公眾號消息推送使用客服接口推送消息。 移動端的消息推送使用國內某些知名的推送平台。在用戶從APP登錄的時候,APP會主動向推送平台設置自己的ID。後台將消息發送到推送平台時指明這個ID即可。 網頁的消息推送一般常見的實現方法有輪詢,長連接,WebSocket等等。在這裡我們使用的是WebSocket 。 消息傳遞的基本流程 後台服務器在某些情況下生成了一條消息, 首先將消息保存到本地數據庫,這樣客戶端可以調用API顯示消息列表。隨後消息被放入任務隊列,任務隊列將消息通過推送平台發送至APP,通過微信公眾號後台發送至用戶微信客戶端。 為了將消息通過WebSocket發送至在線的用戶手中,我們先將消息發佈到 Redis。訂閱了 Redis 的 Node 收到消息,將消息通過 WebSocket 傳遞至與之連接的瀏覽器。 一個大致的消息流如下圖所示: Redis的發佈訂閱機制 所謂的 Publish/Subscribe,可以讓發佈者將消息發佈至某一個 channel,所有訂閱了這個 channel 的訂閱者就可以立即收到這個消息。在 Redis 的發佈訂閱機制裡面,一個消息可以被發佈至多個channel,訂閱者也可以同時訂閱多個channel的消息。 127.0.0.1:6379> subscribe message-channel Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "message-channel" 3) (integer) 1 為了訂閱一個名為 message-channel 的消息,我們可以在 Redis 命令行下執行 127.0.0.1:6379> publish message-channel "Thi...