构建实时web或移动应用程序比构建标准服务更具挑战性。这是因为您选择的将数据从服务器传递到客户端的协议将对总体体验产生重大影响。
当您需要数据从服务器快速地流向客户机时,需要一个持久连接。您可以使用长轮询(long polling)、WebSockets、服务器发送事件(SSE)或HTTP2推送来完成此操作。
今天,我们将具体看看MQTT和SSE,看看它们之间的比较。
MQTT和SSE的简要历史
MQTT,即消息队列遥测传输(Message Queuing Telemetry Transport),是一种发布-订阅(publish-subscribe)消息协议,最早出现于1999年。IBM的andy Stanford-Clark和eurotech的Arlen Nipper在那一年发布了该协议。
最初,它为沙漠管道段之间的连接提供支持,以便进行主动监测。这是通过将管道连接与卫星网络同步来实现的。
这个想法是创建一种轻量级的机器对机器通信协议,该协议甚至可以在带宽低,连接性无法预测的有限网络上以及低功耗设备上运行。它还合并了不同级别的服务质量(QoS)。
从那时起,MQTT已成为类似应用程序的公认协议,在CPU功率有限、电池限制和不可预测的通信实例之间桥接设备之间的连接。最近,MQTT已成为物联网解决方案的首选协议。
另一方面,SSE(Server-Sent Events)出现的时间要晚得多,在2006年。该协议基于服务器发送的DOM事件,它是Opera 9 web浏览器引入的。当时,它还是一项试验技术,仅在发生新事件或更新时才将内容从服务器推送到客户机或web浏览器。
首先,客户端使用EventSource接口建立连接。基于JavaScript的API使HTTP流保持打开状态并接收更新,直到最终将其关闭。
这是一个新的EventSource对象的示例,该对象设置为从服务器接收事件:
它们有何不同?
有两种主要的方法来处理数据传递。第一个称为客户端请求,它表示浏览器或应用正在从服务器请求数据。第二种方法称为服务器推送,这是远程服务器主动将数据推送到网站或应用程序。本质上,一个涉及客户端,另一个涉及服务器。
虽然只有两种方法可以进行数据传递,但是可以通过几种方法实现此过程:
- 长轮询或短轮询(客户端pull)
- WebSockets(服务器推送)
- 服务器发送的事件(服务器推送)
轮询是在客户端完成的,当应用程序或网站定期向服务器请求数据时会发生轮询。
WebSockets是客户端和服务器之间的持久连接,主要用作通信协议。
最后,SSE(Server-Sent Events)是一种异步机制,通过活动连接将数据推送到客户端。当新的数据块或更新可用时,服务器也可以发送数据。连接可能保持打开状态,但这并不一定意味着数据正在传输。
仅从这些定义,您就可以看到客户机-服务器进程有多么不同。这也意味着它们各有优缺点,这使得它们在某些情况下非常适合使用,而在另一些情况下就不那么实用了。
MQTT作用概述
MQTT协议依赖于类似网络的系统,包括服务器,一个或多个客户端和代理。代理是MQTT服务器,连接的设备是客户端。发布者和客户端都不会处理这些工作。相反,处理能力和通信主要由代理处理。
因此,MQTT允许开发人员建立通信通道层次结构。从视觉上看,这就像一个树枝。发布者或服务器首先向代理发送新数据,以及传递控制说明。
然后,代理会促进另一端的客户之间的信息交换。高级客户端可以从发布服务器接收每一条消息或更新,而低级客户端只接收与其基本级别相关的消息。
所有发布并发送给代理的数据(以及接收到的数据)均采用二进制协议进行编码。 因此,必须先解释该消息,然后才能使用数据内容。
尽管如此,MQTT仅通过纯文本分发安全性凭证,因此它并不完全安全,并且不能为大多数应用程序提供足够的身份验证或安全性。开发人员可以通过实现SSL框架解决此问题,该框架通过加密保护任何传输的数据。
MQTT:优点和缺点
优点:
- MQTT是一种难以置信的轻量级协议,旨在连接资源最受限的设备。
- 它内置了多层服务质量(QoS)。
- 大多数云OT厂商和提供商已经支持MQTT,使其成为传感器不断收集和报告聚合数据的IoT解决方案的理想选择。
- MQTT是双向的。
缺点:
- 由于集中代理的性质,开发人员在使用MQTT时可能会遇到扩展限制,本地代理中心会限制其支持的扩展量。
- 具有讽刺意味的是,MQTT通常运行在TCP/IP网络堆栈的顶部,该堆栈是为具有更大内存和处理能力的设备而设计的。因此,唤醒和通讯时间可能会延长,这可能会影响长期的电池消耗。
SSE概述
SSE连接通常在客户端-服务器配置之间的链接的客户端开始。客户端通过在JavaScript中创建新的EventSource对象来启动并打开连接。它通过HTTP请求发送相关的URL。
建立连接后,客户端将期待并寻找事件消息流。只要传输数据,HTTP请求就保持打开状态。一段时间后,当客户端认为传输过时时,连接将关闭。如果取消了初始请求,则客户端也可以直接关闭连接。
如您所见,SSE比MQTT更简单,并且不涉及代理。
SSE:优点和缺点
优点:
- 数据通过简单且广泛使用的HTTP协议而不是专有协议进行同步。
- 包括对重新建立连接和事件ID功能的内置支持。
- 对于利用单向通信的应用程序和服务非常有用。
缺点:
- 不幸的是,SSE只支持UTF-8编码,不支持二进制数据。
- 对最大打开连接数的严格限制可能使事情变得困难,每个浏览器都设置了限制。
- SSE是单向的。
MQTT与SSE
比较MQTT和SSE时要考虑的最重要的事情是它们的连接能力。例如,SSE是单向的,专门为需要从服务器提取信息的服务或应用程序而设计。另一方面,MQTT是一种健壮的双向通信选项,可以促进服务器与客户端之间来回的数据传输。
这意味着SSE非常适合将信息存储在服务器上并推送到客户端的应用程序,例如实时股票应用程序或基于新闻的服务。从本质上讲,不需要从客户端以相反的方向传递数据。
这也解释了为什么开发人员在物联网应用程序,传感器和设备中首选MQTT的原因,当然还有其他优点。由于信息具有双向结构,因此可以双向传递。
SSE开源解决方案
了解SSE之后,您可能已经准备好寻找可以帮助您入门的开源SSE软件。Gossed就是一个例子。它允许您将任何程序的标准输出作为服务器发送的事件推送到浏览器。
还有SSE Channel,可以将消息广播到所有连接的客户端。另外,此工具会自动维护历史记录。它的另一个功能是能够根据需要向客户端发送自动“保持活动(keep-alive)”数据包的功能。
MQTT开源解决方案
也有开放源码MQTT选项。Eclipse Mosquitto是轻量级的,适用于所有设备。它可以处理从智能手机到连接传感器的各种设备的消息传递需求。还有一个测试服务器,它允许您使用几个与MQTT相关的场景查看客户机的功能。
HiveMQ是MQTT的另一个代理,它在2019年4月成为一种开源软件。它专门用于处理与物联网设备相关的信息。该工具提供了一个实时监视界面,以及用于故障诊断的高级端到端MQTT分析。
实施中的困难
首先,为MQTT或SSE实现内部解决方案可能听起来可行。但是,有一些常见的问题需要克服,比如与消息顺序和有保障的传递相关的问题。您还必须牢记安全性,包括访问控制和配置。2019年,安全研究人员详细描述了至少3200个拥有智能家居技术的家庭是如何由于MQTT的不安全错误配置而可能受到黑客攻击的。
再加上其他必需的东西,比如创建开发人员文档,就很容易理解为什么您最终会认为,从操作和工程的角度来看,使用内部解决方案过于耗费人力和成本。随着最终用户数量的增长,你很可能会得出这样的结论。在加大努力的同时,这里列出的所有挑战可能会变得更成问题。
尽管如前所述,MQTT和SSE都具有开源选项,但更明智的选择是投资于商用的实时消息传递平台。 即使您扩大规模,它也可以帮助您始终获得较高的性能和可靠性。