Logo
Section 1 / 9

创建一个简单的 WebSocket

学习由 Phoenix Channels 驱动的实时应用的基本原理。

导入

创建一个简单的 WebSocket

学习由 Phoenix Channels 驱动的实时应用的基本原理。

WebSockets 作为实时应用的基石

我们将使用 WebSockets 作为通信层;它们是当今实时网络应用的核心支柱。尽管未来技术演进可能导致变化,但在当前的技术环境下,WebSockets 仍是最佳解决方案。下一节我们将开始构建实时应用,但在此之前,先来深入解析 WebSockets 的工作原理。理解 WebSockets 对于开发和交付实时应用至关重要。

注意: 我们将通过一个“Hello, World!”风格的 Phoenix 应用来演示 WebSocket 的通信过程。

当该应用运行后,我们将分析 WebSocket 的各个组成部分,以理解其工作机制。

分层的重要性

虽然可以不完全理解各层技术(如 WebSockets)就构建实时系统,但缺乏这些知识在长远来看可能会带来问题。

作者注: 我还记得自己首次部署实时 Phoenix 应用时,对涉及的各层技术理解不够深入,导致 WebSockets 无法连接!经过研究后才意识到,必须更深入地掌握 WebSockets 知识,才能适配生产环境中的负载均衡器,并降低应用内存占用。深入学习各层技术后,我得以确保每一层都正常运行。

为什么选择 WebSockets?

过去,由于通信层的技术限制,编写实时系统非常困难。开发者不得不在性能、成本和维护之间做出权衡,复杂的实现方式常常逼近浏览器的能力极限。这些技术高度依赖特定浏览器,导致同一客户端在一种浏览器中正常工作,而在另一种浏览器中却失效。

WebSocket 的支持情况

WebSocket 协议的 RFC 标准随 HTML5 规范于 2011 年发布,旨在解决实时网页通信的挑战。虽然初期推广较慢,但如今所有主流浏览器均已原生支持 WebSocket,已可视为成熟可靠的应用开发技术。

...
支持的浏览器

WebSockets 的优势

本课程将主要采用 WebSockets 作为通信层,原因如下:

  • WebSockets 可通过单一 TCP 连接实现高效双向数据通信,有效减少消息带宽消耗,并避免频繁建立连接带来的开销。

  • Elixir 对 WebSockets 支持强大,尤其与 cowboy 网络服务器 配合良好。它与 Erlang 的进程模型高度契合,有助于构建高性能、高可靠的系统。

  • WebSockets 起始于 HTTP 请求,因此可无缝兼容大多数标准 Web 技术,如负载均衡器和代理服务器。

  • WebSockets 可部署在 Elixir 应用的边缘位置,便于未来在新技术出现时灵活替换通信层。

使用 WebSockets 的应用实例

WebSockets 功能强大,这一点从众多知名且成功的应用中可见一斑。

...
Facebook、Yahoo Finance 和 Slither 使用 WebSockets
  • Facebook Messenger 使用 WebSockets 实现用户客户端之间的实时聊天,使消息交互感觉流畅迅速。

  • Yahoo Finance 利用 WebSockets 实现全球金融市场实时股票行情推送。

  • 多人在线游戏如 Slither 风靡一时(也极具趣味性),其核心完全依赖 WebSockets 实现。

WebSockets 支撑着许多关键业务功能,例如实时通知和网站动态信息展示。我们每天通过 WebSockets 发送数亿条事件。

  • Facebook:令人惊讶的是,单个页面上存在大量活跃的 WebSocket 连接。这看起来几乎像一个 bug,因为多个连接使用相同的 URL。Facebook 在消息中采用二进制协议,似乎专为小数据包优化。

  • Reddit:Reddit 使用基于 GraphQL 的 WebSocket 协议。协议内容清晰易读,数据负载较为常规,且与评论数量和投票行为紧密相关。

话不多说,现在该动手实践了!我们将使用一个小型本地 Elixir 应用,暴露一个 WebSocket 接口,演示如何连接 WebSocket 以及如何发送数据。后续课程中,我们将利用这一方法来检查和调试自己的应用。

Phoenix 入门

连接我们的第一个 WebSocket