消息推送实现技术研究

2024-12-20 00:00:00蒋凌燕
电脑知识与技术 2024年30期

关键词:消息推送;实时消息传递;通信协议;推送系统架构;技术方案

0 引言

随着移动互联网和物联网的快速发展,消息推送技术作为实现大量信息实时传递的关键技术之一,在各种应用场景中发挥着重要的作用。从移动应用的消息通知,到电商平台的促销信息推送,再到工业物联网设备的实时状态监控,消息推送技术为社会和人民的生活提供了方便快捷的信息传输。

然而,随着应用场景的不断扩展和用户需求的不断提高,消息推送技术也面临着新的挑战。例如,如何确保在海量用户并发访问的情况下,消息推送依然能够保持高并发、低延迟和高可靠性,如何保障消息传输过程中的安全性和用户隐私等。

本文旨在对消息推送实现技术进行深入研究,分析不同技术方案的优缺点,并探讨其适用场景。文章首先介绍消息推送的基本概念和典型应用场景,然后分别从基本通信技术、实现方式、协议和实现技术等方面进行详细分析,最后总结全文并展望未来发展趋势。

1 消息推送概述

消息推送是软件系统中重要功能,由服务器主动且高效发送大量消息到用户[1],在具体实现时对所使用的技术有较高的要求。推送功能有多种实现方式,作为软件中的一个模块、作为中间件或者独立的跨平台推送系统,常见的推送有Web推送和手机App推送等。Web推送是网站后台对用户需求和行为偏好进行分析,生成推送内容推送到浏览器,手机App推送是把信息推送到App内或者手机通知栏。

推送的形式多样化、内容精准化和智能化是现在的主要趋势[2-4],如何使消息推送简便易行且高效,更好的被用户的关注,和系统所采用的推送方式以及推送内容有关,设计方案着重提高推送精准性、运行效率和响应速率[5]。

2 基本通信技术

消息推送将消息主动推送到客户端,由于推送频率差别较大,采用不同的基本通信技术,常用的有基于TCP的轮询、长连接和SMS短消息等。轮询是由客户端定时发起请求,服务器接受请求后返回消息,或者根据需求由服务器推送,网络占用较少。长连接在客户端和服务器之间保持连接来发送消息,提供消息发送的高可靠性。长连接经TCP三次握手建立,过程如图1所示,客户端首先发送请求SYN到服务器;服务器回复响应SYN和ACK到客户端,表示接受请求建立连接;客户端再发送ACK到服务器,表示确认连接的建立。SMS短消息是基于短信的推送方式,内容主要是文本,用户访问率高但成本高。

3 实现方式

常见的消息推送实现方式有:基于AJAX的短轮询和长轮询、SSE(Server-Sent Events) 、WebSocket 和FCM(Firebase Cloud Messaging) 。短轮询和长轮询是基于HTTP通过轮询建立连接,长轮询保持连接,而短轮询不保持连接。SSE(Server-Sent Events) 建立从服务器到客户端的流,通过事件驱动完成推送的过程。WebSocket在服务器和客户端之间建立长期的连接,可以进行复杂的数据交互。FCM(Firebase Cloud Mes⁃saging) 是谷歌提供的消息发送服务,服务器通过FCM 的API发送消息到客户端。

3.1 基于AJAX 的短轮询和长轮询

短轮询是一种简单的消息推送方式,客户端定时向服务器发送请求,服务器接收到请求后立即返回响应信息。短轮询的结构简单,易于实现,但实时性较差,且服务器负载较大,适用于客户端数量少、消息频率低的场景。

长轮询在服务器端保持连接并挂起,直到有数据需要发送时才返回响应,客户端接收到响应后立即再次发起请求,从而实现消息的准实时推送。相较于短轮询,长轮询能够有效降低服务器负载,提高消息推送的实时性,但实现较为复杂。

3.2 SSE(Server-Sent Events)

SSE是服务器推送技术,通过长连接在客户端和服务器之间建立stream流,多次发送数据。服务器使用事件流发送数据到客户端,客户端通过HTTP连接监听事件流,接收服务器所推送的数据。SSE采用单向数据流,从服务器发送到客户端,可以传输文本和二进制数据;数据传输过程如图2所示。客户端设定请求的事件流类型,向服务器发送请求,服务器接收请求,返回的响应中设置事件的媒体类型、编码和分块传输等,服务器更新数据时将多个事件发送到客户端;客户端创建EventSource 对象,打开连接并通过onopen事件等完成消息接收。SSE实现更简单,兼容性更好,适用于从服务器向客户端推送数据。

3.3 WebSocket

WebSocket是建立在TCP连接上的全双工通信,使用长连接发送数据,实时性较好,常用于聊天软件、协作型软件、实时推送系统以及在线游戏等。在Web 网站上使用时,浏览器设置协议为WebSocket,向服务器发送HTTP请求,服务器解析请求生成数据返回到浏览器,并在服务器和浏览器之间建立WebSocket连接。WebSocket提供事件、方法、状态码等用于消息传递;采用心跳包检查连接状态;连接断开时自动重连;支持海量并发和大负载;能高效使用带宽;性能较好,实时性方面具有优势。

3.4 FCM(Google Cloud Messaging)

Google的FCM(Google Cloud Messaging) 是谷歌云消息,可以在APPLE、Android 和Web 网站上发送消息,提供客户端和服务器端的组件。消息经服务器传输至FCM后端,打包成为元数据,再经传输层传送到客户端。FCM提供单终端、成组终端或者订阅模式三种方式传送消息,具备跨平台性和可靠性。

4 推送协议

消息推送常用的IM(即时消息)协议有XMPP(可扩展消息与存在协议)、MQTT(消息队列遥测传输协议)和SIP(会话初始协议)。

4.1 XMPP(可扩展消息与存在协议)

XMPP协议是一种流协议,使用TCP分片段传送XML,包含三种基本组成:客户端、服务器和网关,采用C/S架构进行异构的实时通信。服务器提供数据存储、连接的管理和信息路由功能,监听处理与客户端的连接,还可以与其他XMPP服务器通信。网关负责异构系统之间的互联,其中包含了多种协议转换,可以和其他各种类型的IM(即时消息)系统互联互通。客户端采用简单模式连接服务器,交换XML信息并进行解析,复杂处理由服务器进行。

4.2 SIP(会话初始协议)

SIP属于多媒体通信协议,运行在网络应用层上,使用范围广泛,在IP网络中支持语音和视频通话,也用于IM(即时消息系统)的消息推送。SIP协议采用C/S模式,基本功能有用户定位与判定、会话建立和管理等。SIP协议包含请求和响应的相关内容,提供了多种请求的消息,包括INVITE、ACK、BYE等,通过一组状态码定义会话过程中的不同状态。SIP协议作为文本协议,使用UDP或者TCP传输,对会话过程的步骤进行了明确的规定,使会话的建立、修改和终止在不同的终端之间方便进行。

4.3 MQTT(消息队列遥测传输协议)

MQTT 是基于发布/订阅模式的物联网协议,在TCP/IP协议上实现远程实时消息服务,用于物联网、移动应用等,能降低通信时使用的网络带宽并减少占用的设备资源。MQTT 协议提供三种身份:发布者(Publish)、代理(Broker)和订阅者(Subscribe),发布者和订阅者都是客户端,代理是服务器。MQTT协议传输的消息有主题(Topic)和负载(payload)两种,主题供订阅者订阅,负载是订阅主题后收到的内容。MQTT协议传输的数据包有固定头(Fixed header)、可变头(Vari⁃able header)和消息体(payload)三部分,固定头中有数据包类型和数据包标识,可变头在固定头和消息体之间,内容和报文类型有关,消息体中有消息的内容和客户相关信息。MQTT构建底层网络传输,建立客户端到服务器的连接,是基于字节流的双向传输。

4.4 推送协议的适用范围和特点

XMPP在即时通信系统中应用广泛,基于XML进行消息传送,提供点对点和多点通信,采用单向连接方式,由客户端向服务器发起连接,消息在客户端之间传输时采用转发方式。XMPP在推送方面支持较成熟,有开源的服务器和开发框架可用,在Java平台实现良好,开发简便,跨平台方面一般。XMPP所传输的消息内容丰富,消息解析便利,有利于复杂交互,提供各种各样的消息业务模式,如留言、群发、群聊、状态更新等,使用时服务器负荷较重。

MQTT采用发布订阅模式,使用代理转发消息,所传输的消息较轻,可靠性较强,物联网中使用较多,消息分发高效。MQTT在网络较差时也能有效传输,具有低延时且低消耗的特点;在即时通信中用于消息推送,但推送系统使用MQTT实现较复杂。

SIP在VoIP(语音通话技术)中的进行会话管理,用于即时通信时使用其扩展协议SIMPLE,提供连接的建立与维护,对于消息内容本身关注较少。传输的消息主要是基于文本的,消息体处理方面较弱,须编写专门的代码,对大数据量的语音、视频和文件的传输较便捷。

5 消息推送的实现技术

根据所使用的平台,消息类型和发送频率以及设备数量,选择消息推送的实现技术,跨平台的使用整合推送方案。除了各平台提供的适合消息推送的开发技术,手机厂家有自己的推送软件,IT行业厂商提供专业推送系统,物联网也有多种实现技术,以下是常用的几种。

5.1 AndroidPN

Android平台上的开源AndroidPN,为App提供推送各种类型消息的功能,它是基于XMPP协议,采用服务器和客户端模式实现。AndroidPN的主要组成部分是Asmack库和Mina库,Asmack库提供服务器通信功能,Mina库是使用NIO开发的网络通信框架。

AndroidPN的消息推送模式如图3所示,客户端使用Asmack库,发起连接后发送数据到服务器;服务器使用Mina库接收连接,然后发送返回的数据;连接建立后通过IOsession进行管理会话,业务逻辑处理由IOHandler实现。AndroidPN在客户端提供4个主要功能:身份验证、监听网络变化、监听手机网络状态和监听推送消息。客户端使用Socket连接服务器,生成用户id、账号和密码等信息,建立消息监听,接收到消息过滤后调用回调。客户端把要发送的消息封装成Packet数据包放到队列中,队列中的Packet数据包被读取后转成XML格式,通过PacketWriter发送。服务器端可以用openfire实现,包含两个部分,一部分是响应用户请求的Web服务器,还有一部分是服务器端的XMPP消息服务,在经过身份验证后和客户端建立长连接收发消息。服务器端的核心功能有会话管理、用户认证、用户登录状态维护和消息推送等。An⁃droidPN实现了事件驱动的异步网络API,注重消息发送的性能和功能扩展。

5.2 IBM WebSphere MQ Telemetry

IBM WebSphere MQ Telemetry 常用于物联网,提供基于WebSocket和MQTT协议的跨平台推送服务,在低带宽的环境中以低功耗完成消息传递,同时加强数据安全与数据监测。WebSphere MQ Telemetry提供WebSphere MQ作为服务器,客户端采用JavaScript编写的API,在任何设备上均可使用。连接由MQTT客户端向服务器发起;建立后发送心跳包维持连接;接着发送订阅消息来订阅某一主题;订阅确认后接收该主题的系列消息。消息推送由消息发布者客户端将业务数据封装到消息体中,以主题方式发布消息,再传送到订阅者客户端中。

5.3 EMQX(Erlang/Enterprise/Elastic MQTT Bro⁃ker)

EMQX(Erlang/Enterprise/Elastic MQTT Broker) 是物联网消息推送平台,内置规则引擎和数据集成模块,可对大量实时数据进行处理、转换和路由,也可以和其他系统集成。EMQX能接入大量采用QUIC协议的设备,对于采用非MQTT协议的设备使用多协议网关监听请求并进行消息的协议转换。EMQX在发布/ 订阅模式下建立可靠的消息传输机制,提供规则引擎对传入的消息数据进行处理和路由,然后再存储并分析,也可以通过MQTT消息、REST API以及Kafka进行消息推送或者发送控制指令。

5.4 Python 平台的Paho-MQTT 模块和Eclipse-Mosquitto 模块

Python 平台提供的MQTT 模块有Paho-MQTT 客户端模块和Eclipse-Mosquitto服务器端模块。Paho-MQTT客户端模块支持多种平台和多种语言,根据不同环境选择对应的客户端,提供API 进行服务器连接、消息发布、主题订阅和消息处理等,还可进行消息持久化。Paho-MQTT支持同步方式进行订阅与发布;这种方式下会等待消息的传送,直到传送完才继续,以顺序方式传递,从而不会丢失。Eclipse-Mosquitto 模块用于编写基于MQTT的服务器端程序,采用发布/ 订阅模式,支持各种物联网传感器、手机、计算机等设备,适用于联网设备数量有限的小规模环境,安装部署使用方便,也可以和其他Broker(代理)进行桥接,支持各种操作系统和Docker容器,和Paho-MQTT模块一起使用可以实现消息推送系统。

5.5 Apache ActiveMQ

Apache ActiveMQ 是基于消息的通信中间件,实现了JMS(Java Message Service) ,支持其两种消息模型和多种协议。Apache ActiveMQ支持多种语言,易于和其他系统集成,提供了完善的异步消息接收可靠性保证,支持共享数据的持久化和网络负载分配,也可为高性能集群提供消息服务。ActiveMQ支持的Advi⁃soryMessages可以通过标准的JMS消息监控系统,在具有复杂架构的系统中,为系统组件提供消息互换,并防止消息因各种原因停止传送。Apache ActiveMQ 用于建立推送系统时,根据所接入的设备和环境以及响应、负载等要求,选择协议然后创建客户端和服务器,在不同的软件系统之间推送数据。

5.6 APNs

苹果的APNs提供消息服务器,用户在服务器进行配置并编写功能发送消息,在手机端也进行同样的配置。发送时由服务器向APNs发起请求;APNs向手机端发送消息;手机端接收到后传送到App中,再以通知栏或者透传消息的方式显示,高效且方便。

5.7 信鸽推送

信鸽推送是跨平台的第三方推送,对不同的推送方式进行了整合,支持各种类型消息的传送。信鸽推送提供了方便快捷的SDK,在网页端进行配置管理,也可以自己编写API。信鸽推送支持多种推送通道,采用长连接且具备通用性;提供图形化界面管理台和消息相关的REST API;移动端对业务逻辑也进行了封装。

5.8 极光推送

极光推送支持消息类型和样式多样化,还可以根据标签、地理和用户进行消息个性化推送,通过大数据对用户进行分析,使用AI 来选择时机,所提供的API简便易用,可快速建立推送,在高并发环境下提高了推送效率。

6 消息推送的技术选择

消息推送在实现时,根据消息的类型、大小和频率,收发消息的设备类型、平台以及网络环境等选择具体的实现技术:

1) 首先,选择基本的通信技术,数据量不大采用轮询,数据量较大采用长连接,用户关注性和查看比率要求高的采用SMS短消息。

2) 其次,根据推送系统的大小和实时性要求选择实现方式,实时性要求不高的小型系统选择短轮询,中大型系统选择长轮询;实时性要求高的系统则按接入的设备类型来选择,如果是Web系统或者是浏览器作为客户端之一,可以采用SSE实现推送,接入设备数量很多且对通用性有要求可以采用WebSocket。

3) 再次,根据软件的类型选择协议,即时通信类的软件使用XMPP协议,物联网中使用MQTT协议,语音和视频类可用SIP协议。

4) 最后,根据所使用的平台选择实现的技术,安卓平台上中小规模的消息传送可使用AndroidPN,大规模的消息传送可通过各手机厂家的推送或者专业推送软件来进行,物联网平台可以选择IBM WebSphere MQTelemetry和EMQX等,Python平台提供Paho-MQTT模块和Eclipse-Mosquitto模块,已有多个系统之间的消息传送可以使用Apache ActiveMQ消息中间件。

7 总结

本文对消息推送实现技术进行了较为全面的概述,从基本通信技术、实现方式、协议和实现技术等方面,分析了不同技术方案的优缺点及其适用场景。消息推送采用合适的软件方案可以为用户提供更好的服务,让用户更加经济有效地以便捷的方式接收和浏览信息[6-7]。随着移动互联网和物联网技术的不断发展,消息推送技术将朝着更加高效、安全、智能的方向发展[8]。未来的发展方向包括:在消息推送系统中使用边缘计算来进行负载均衡,通过AI进行个性化推荐,以及采用综合策略进行安全与隐私保护等。