首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

消息推送原理深度解析:Polling、Long-Polling、SSE、WebSocket、移動端長連接與 MQTT

     編輯:Java 綜合教學

前言:從「拉」到「推」的演進史

客戶端如何及時收到服務端消息?本文系統梳理五大技術路線:輪詢 → 長輪詢 → SSE → WebSocket → 移動端專用長連接 (MQTT/APNs/FCM),對比原理、優缺點、適用場景,並深入剖析 Android/iOS 系統級長連接架構差異。

五大推送技術對比

技術原理連接模式服務端推送客戶端複雜度適用場景
短輪詢定時發請求詢問短連接響應中返回低低實時、簡單業務
長輪詢請求掛起直到有數據長連接響應中返回中中實時、兼容性好
SSE單向流式響應長連接流式寫入低 (原生 API)服務端→客戶端推送
WebSocket全雙工協議長連接 (ws://)雙向幀中雙向交互、IM、遊戲
移動端長連接系統級 TCP 保活持久 TCP推送通道低 (SDK)移動端離線推送

Web 端長連接本質:HTTP Long Connection + 異步非阻塞

客戶端發起 HTTP 長連接請求
        ↓
服務端接收請求,不立即響應,hold 住連接(非阻塞,不佔用線程)
        ↓
服務端有新數據 → 寫入響應流 → 客戶端收到
        ↓
客戶端處理數據 → 發起新長連接(或 SSE 自動復用)

同步/異步、阻塞/非阻塞在推送中的角色

維度客戶端服務端
同步/異步異步發起請求,不阻塞主線程異步處理業務,不阻塞 I/O 線程
阻塞/非阻塞非阻塞等待響應非阻塞 hold 連接,可同時處理其他請求
組合異步非阻塞異步非阻塞 (NIO/Netty/servlet async)

Android 端長連接架構

挑戰:電量、進程存活、網絡切換

  • 普通 Socket 長連接佔用文件描述符、需心跳保活、易被系統殺死
  • 每個 App 獨立維護長連接 → 24h 在線 = N 個連接 = 嚴重耗電

方案:MQTT (Message Queuing Telemetry Transport)

特性說明
協議層級基於 TCP/IP,極輕量(固定頭 2 字節)
模式發布/訂閱,解耦發送方與接收方
QoS0/1/2 三級質量保證
心跳Keep Alive 機制,客戶端發 PINGREQ,服務端回 PINGRESP
遺囑Last Will Testament,異常斷線自動發布離線消息
適用性低帶寬、不穩定網絡、嵌入式設備、移動端

Facebook Messenger、微信早期均採用 MQTT 或類似私有協議。

Android 心跳機制

// 客戶端邏輯
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(() -> {
    if (socket.isConnected()) {
        sendHeartbeat(); // 發送 PING
        startHeartbeatTimeoutTimer(); // 啟動超時定時器
    }
}, 0, HEARTBEAT_INTERVAL, TimeUnit.SECONDS);

// 收到 PONG 取消超時定時器
// 超時未收到 → 判定斷開 → 重連邏輯(指數退避)

iOS 端長連接架構:APNs (Apple Push Notification service)

系統級統一長連接

  • iOS 系統進程維護 唯一 與 Apple 服務器的持久 TCP 連接
  • 所有 App 的推送消息 → 先到 Apple 服務器 → 經系統連接下發設備
  • App 進程可被殺死,推送仍能送達(系統級守護)

三大優勢

  1. 省電:全設備僅一條長連接,無 App 級心跳開銷
  2. 可靠:系統進程不被殺死,推送必達
  3. 安全:需 Apple 開發者證書簽名,私鑰加密,防濫用

APNs 流程

App Server → (HTTPS/HTTP/2 + JWT Token) → APNs Server
                                    ↓
                            系統級長連接 (device token 路由)
                                    ↓
                            iOS 設備 → 系統處理 → 展示通知 / 唤醒 App

Android 統一推送聯盟:統一推送服務

為解決「N 個 App = N 條長連接」耗電痛點,華為/小米/OPPO/vivo/魅族/華碩等廠商聯合推出 統一推送聯盟:

  • 系統級統一長連接通道(類似 APNs)
  • App 集成廠商 SDK,通過系統通道下發
  • Google FCM (Firebase Cloud Messaging) 在海外提供同類服務

總結:選型決策樹

需要雙向實時交互? → WebSocket
只需服務端→客戶端推送? → SSE (Web) / APNs/FCM/統一推送 (移動端)
移動端 App 必須離線收推送? → 集成廠商推送 SDK + 兜底自建長連接 (MQTT)
物聯網/嵌入式/弱網環境? → MQTT
簡單低實時/兼容舊瀏覽器? → 長輪詢
極簡輪詢/無長連接權限? → 短輪詢

理解底層協議差異、系統級長連接架構、心跳保活機制,能讓你在架構選型、性能調優、故障排查中游刃有餘。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved