消息推送的实现方式

长轮询(Long Polling)

  • 客户端发送请求到服务器,服务器如果没有准备好的数据,就保持连接开放,直到有数据可以发送。一旦数据被发送,客户端处理数据后再次发送新的请求,如此循环。 - 长轮询通常用于实时或近实时的通知和更新,比如活动通知。

  • 实现简单,相对容易集成到现有的基于HTTP的系统中。

  • 服务器必须维持打开的连接,可能会消耗更多的服务器资源;可能存在一定的延迟。

WebSocket:

  • WebSocket提供了一个全双工通信通道,使得服务器和客户端可以在任何时刻发送数据给对方。这是一个非常实时且高效的解决方案。适合实时聊天

  • 非常适合需要高度实时交互的应用,如实时聊天、在线游戏等。

  • 提供低延迟、高效和实时的双向通信。

  • 实现可能相对复杂,需要特定的服务器和客户端支持。

服务器发送事件(Server-Sent Events, SSE) :

  • 服务器发送事件是一种使服务器能够发送新数据到客户端的简单方法。它比WebSocket简单,但只允许服务器向客户端发送数据。活动通知和提醒

  • 适用于服务器向客户端发送实时更新,如活动通知和提醒。

  • 实现简单,只需基于HTTP即可实现;提供了一种实时或近实时的单向通信机制。

  • 只能实现单向通信,不能满足双向实时交互的需求。

  • SSE 是基于HTTP协议的,它们不需要特殊的协议或服务器实现即可工作;WebSocket需单独服务器来处理协议。

  • SSE 单向通信,只能由服务端向客户端单向通信;webSocket全双工通信,即通信的双方可以同时发送和接受信息。

  • SSE 实现简单开发成本低,无需引入其他组件;WebSocket传输数据需做二次解析,开发门槛高一些。

  • SSE 默认支持断线重连;WebSocket则需要自己实现。

  • SSE 只能传送文本消息,二进制数据需要经过编码后传送;WebSocket默认支持传送二进制数据。

HTTP/2 Server Push:

  • HTTP/2协议支持服务器推送,允许服务器在客户端需要之前预先发送数据。这可以减少延迟,但通常只用于发送关联的资源,如CSS或JavaScript文件,而不是用于通用的消息推送。

  • 主要用于提前发送关联资源如CSS、JavaScript文件,以减少加载时间,提高网页性能。

  • 可以减少网页加载时间,提高用户体验。

  • 不适用于通用的消息推送,且需要HTTP/2协议支持,实现可能需要特定的服务器配置。

MQTT协议

MQTT 全称(Message Queue Telemetry Transport):一种基于发布/订阅(publish/subscribe)模式的轻量级通讯协议,通过订阅相应的主题来获取消息,是物联网(Internet of Thing)中的一个标准传输协议。

该协议将消息的发布者(publisher)与订阅者(subscriber)进行分离,因此可以在不可靠的网络环境中,为远程连接的设备提供可靠的消息服务,使用方式与传统的MQ有点类似。

TCP协议位于传输层,MQTT 协议位于应用层,MQTT 协议构建于TCP/IP协议上,也就是说只要支持TCP/IP协议栈的地方,都可以使用MQTT协议。

为什么要用 MQTT协议?

MQTT协议为什么在物联网(IOT)中如此受偏爱?而不是其它协议,比如我们更为熟悉的 HTTP协议呢?

  • 首先HTTP协议它是一种同步协议,客户端请求后需要等待服务器的响应。而在物联网(IOT)环境中,设备会很受制于环境的影响,比如带宽低、网络延迟高、网络通信不稳定等,显然异步消息协议更为适合IOT应用程序。
  • HTTP是单向的,如果要获取消息客户端必须发起连接,而在物联网(IOT)应用程序中,设备或传感器往往都是客户端,这意味着它们无法被动地接收来自网络的命令。
  • 通常需要将一条命令或者消息,发送到网络上的所有设备上。HTTP要实现这样的功能不但很困难,而且成本极高。

第三方推送服务:

  • 使用如Firebase Cloud Messaging (FCM), Apple Push Notification Service (APNs)等第三方推送服务来处理消息推送。

WebSocket和Server-Sent Events提供了较低的延迟和较高的实时性,但可能需要更多的服务器资源。长轮询可能会有更高的延迟,并且可能不是最高效的解决方案。HTTP/2 Server Push和第三方推送服务可能更适合于不需要高度实时性的应用。消息队列和发布/订阅模型提供了一种解耦服务器和客户端的方式,但可能会增加系统的复杂性。

在选择实现方法时,需要考虑应用的具体需求,例如实时性的要求、服务器资源、网络条件以及开发和维护的复杂性。同时,也可以考虑将几种方法结合使用,以满足不同的需求。

相关推荐
茶杯梦轩1 分钟前
从零起步学习并发编程 || 第二章:多线程与死锁在项目中的应用示例
java·服务器·后端
大尚来也3 分钟前
深入理解 Android 消息机制:Handler、Looper 与 MessageQueue 的协同工作原理
后端
sp426 分钟前
Spring Task 任务调度可视化管理
后端·spring
q***765614 分钟前
工作中常用springboot启动后执行的方法
java·spring boot·后端
黄俊懿1 小时前
【架构师从入门到进阶】第一章:架构设计基础——第二节:架构设计原则
分布式·后端·中间件·架构
代码N年归来仍是新手村成员2 小时前
OpenClaw本地部署 + AWS Bedrock Claude 4.5 模型
后端·云计算·aws
树獭叔叔2 小时前
深度解析 GRPO:DeepSeek R1 背后“悟道”的逻辑引擎
后端·aigc·openai
是店小二呀2 小时前
MySQL 深度实践:表的约束及其在数据完整性中的作用
后端
树獭叔叔2 小时前
Transformer 的稳健基石:残差连接与 Pre-LN 深度解析
后端·aigc·openai