WebSocket:对于实时应用程序至关重要,但扩展需要仔细规划
对实时、同步应用程序的需求不断增长,使得 WebSocket 成为现代软件开发中的重要组成部分。在 Compose,WebSocket 是我们服务的基础,使我们的后端 SDK 能够仅使用后端代码提供低延迟的交互式应用程序。 然而,扩展 WebSocket 带来了重大挑战。 以下是重要的经验教训:
优雅部署:保持连接持久性
无缝部署至关重要;用户永远不会遇到中断。 为了确保部署期间 WebSocket 连接的持久性,我们采用了强大的重新连接策略:
旧服务器在客户端断开连接后完全关闭。 渲染或铁路等托管服务需要特别注意,以确保在部署期间顺利进行客户端连接传输。 这些服务通常会等待所有请求完成后再关闭,这会显着延长持久 WebSocket 连接的停机时间。
一致的消息架构:定义清晰的沟通
与 HTTP 的内置路由约定不同,WebSocket 需要自定义消息架构。 在 Compose 中,我们使用 2 字节类型前缀进行消息分类:
<code class="language-typescript">const MESSAGE_TYPE_TO_HEADER = { RENDER_UI: "aa", UPDATE_UI: "ab", SHOW_LOADING: "ac", RENDER_UI_V2: "ad", /* ... */ };</code>
我们还使用分隔符来分隔消息字段,与 JSON 相比,提高了编码/解码速度和内存效率。
<code class="language-typescript">const DELIMITER = "|"; function createDelimitedMessage(type: string, args: any[]) { return [MESSAGE_TYPE_TO_HEADER[type], ...args].join(DELIMITER); } function parseDelimitedMessage(message: string) { const [type, ...args] = message.split(DELIMITER); return { type, args }; }</code>
使用 TypeScript 允许我们在前端和后端之间共享消息模式,防止不一致。
心跳机制:检测静默断开
没有关闭事件的意外连接断开可能会导致连接失效。 强大的心跳机制至关重要:
http后备:处理网络限制
> Websocket可以在限制性网络上阻止。 撰写使用服务器量事件(SSE)作为接收更新的后备,HTTP请求客户端到服务器通信。>
SSE的基于HTTP的自然使其不易阻塞,提供了可靠的替代方案,其潜伏期相对较低。
进一步的考虑
缩放Websockets涉及其他复杂性:
>
缺乏标准工具:诸如限制速率和数据验证之类的功能通常需要自定义实现。
以上是缩放Websocket的课程的详细内容。更多信息请关注PHP中文网其他相关文章!