[译]比较 Socket.IO 和 HTTP:主要区别和用例

原文链接:https://ably.com/topic/socketio-vs-http

在规划实时应用程序时,您应该仔细考虑要使用哪些技术。本文对Socket.IO实时库和HTTP协议进行了比较。下面您将了解每种解决方案的功能、每种解决方案的优缺点以及何时使用它们。

什么是Socket.IO?

Socket.IO 是一个创建于 2010 年的库,提供客户端和服务器之间的实时双向通信。它允许管理连接、发送和接收消息等等。这使得 Socket.IO 成为构建消息/聊天应用程序的理想选择。

Socket.IO 需要两个库 - 一个在服务器上,一个在客户端上。 Socket.IO 创建者维护以下“官方”:

一些 Socket.IO 客户端和服务器实现可以用其他语言实现。请阅读Socket.IO 是什么来获取列表。

下图总结了典型的 Socket.IO 设置:

img

Socket.IO 主要特性

Socket.IO 具有以下主要特性:

Socket.IO 的优缺点

Socket.IO 专业人士

Socket.IO 缺点

什么是 HTTP?

HTTP 是一种请求/响应协议,作为 Web 的主要通信机制,构建在 TCP 网络协议之上。有限版本最初由 Tim Berners-Lee 于 1989 年提出,随后经过快速修改以支持更广泛的浏览器和服务器功能。 HTTP 工作组于 1996 年将这些修改记录为 HTTP/1.0 ( RFC 1945 )。

HTTP 在 RESTful 架构(即 REST API)中很常见。 REST 的经典用例是 CRUD 应用程序,其中 HTTP POST、PUT、GET、PUT 和 DELETE 动词提供了一种简单的方法来实现创建、读取、更新和删除数据的操作。

传统的 HTTP 消息流如下所示:

img

HTTP 技术的出现可以实现实时应用程序:

HTTP 关键特性

我们已经看到了 HTTP 的多个新版本,每个版本都添加了新功能。

HTTP 的优点和缺点

HTTP 优点

HTTP 缺点

Socket.IO 和 HTTP 有什么区别?

下表快速总结了 Socket.IO 和 HTTP 之间的主要区别。

套接字IOHTTP协议
良好的浏览器兼容性,可回退到 HTTP 长轮询优秀的浏览器兼容性
服务器端平台兼容性和非浏览器客户端兼容性尚可,部分地方存在差距出色的服务器端和非浏览器客户端兼容性
双向通讯单向通讯
事件驱动的通信非事件驱动通信(使用 SSE,事件驱动通信仅适用于从服务器到客户端)
出色的连接效率——一旦建立,WebSocket 连接的整个生命周期都需要单个 TCP 连接连接效率良好——通信生命周期内需要多个连接
有状态的无国籍
丰富的功能集功能需要自行实现

我应该使用 Socket.IO 还是 HTTP?

这取决于您的用例;在本节中,我们将研究两者的合适用例。

何时使用 Socket.IO

Socket.IO 非常适合构建涉及多个用户和服务器之间的消息交换的任何应用程序,您希望在其中维护整体状态并希望获得响应式双向实时用户体验。示例包括聊天/消息应用程序、多用户游戏、协作编辑(例如 Google 文档)、基于位置的应用程序等。

Socket.IO 具有良好的跨浏览器兼容性,但其对不同平台(即非 JavaScript/Node.js)的支持可能参差不齐。如果您使用的是良好支持的客户端/服务器组合,并且您不关心支持旧版浏览器,那么 Socket.IO 就可以了。如果您需要替代方案,请阅读我们的Socket.IO 替代方案文章以获取选项。

何时使用 HTTP

HTTP 非常适合多用户应用程序,在这些应用程序中,您不需要两个方向的实时响应,但您仍然关心每个客户端和服务器之间可靠、安全的数据交换。想想传统的 REST/CRUD 应用程序——银行应用程序、电子邮件应用程序、天气应用程序和电子商务应用程序。

如果您想要实时响应,但仅限于从服务器到客户端,那么 SSE 是一个可行的解决方案。 SSE 对于提供实时信息更新的应用程序很有用,但用户只是消费数据,而不是写入数据。很好的例子可能包括股票行情或新闻行情应用程序。

HTTP 是一项非常成熟的技术,对 Web 浏览器、服务器平台和非浏览器客户端类型提供大力支持。如果您担心对 Socket.IO 等库的支持不完整,请考虑使用原始 HTTP 构建您的应用程序。

总体而言,Socket.IO 和 HTTP 哪个更好?

您应该使用 Socket.IO 还是 HTTP 取决于您的用例。 Socket.IO 等基于 WebSocket 的解决方案对于构建具有低延迟、高效连接和高性能要求的实时应用程序至关重要。然而,当涉及到平台兼容性和可扩展性时,Socket.IO 可能会下降——如果这些出现问题,HTTP 可能是更好的方法。

Ably 是 Socket.IO 的替代品,具有强大的发布/订阅消息传递、针对每种主要语言和开发平台的超过 25 个 SDK、可用的专门专家支持等等。有关详细比较,请参阅Ably 与 Socket.IO。借助可用的 WebSocket 和 REST 库,您可以轻松集成。

All things about Spring Modulith
ThingsBoard的领域模型