创建一个简单的 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 Messenger 使用 WebSockets 实现用户客户端之间的实时聊天,使消息交互感觉流畅迅速。
-
Yahoo Finance 利用 WebSockets 实现全球金融市场实时股票行情推送。
-
多人在线游戏如 Slither 风靡一时(也极具趣味性),其核心完全依赖 WebSockets 实现。
WebSockets 支撑着许多关键业务功能,例如实时通知和网站动态信息展示。我们每天通过 WebSockets 发送数亿条事件。
-
Facebook:令人惊讶的是,单个页面上存在大量活跃的 WebSocket 连接。这看起来几乎像一个 bug,因为多个连接使用相同的 URL。Facebook 在消息中采用二进制协议,似乎专为小数据包优化。
-
Reddit:Reddit 使用基于 GraphQL 的 WebSocket 协议。协议内容清晰易读,数据负载较为常规,且与评论数量和投票行为紧密相关。
话不多说,现在该动手实践了!我们将使用一个小型本地 Elixir 应用,暴露一个 WebSocket 接口,演示如何连接 WebSocket 以及如何发送数据。后续课程中,我们将利用这一方法来检查和调试自己的应用。