WebSocket:对于实时应用程序至关重要,但扩展需要仔细规划
对实时、同步应用程序的需求不断增长,使得 WebSocket 成为现代软件开发中的重要组成部分。在 Compose,WebSocket 是我们服务的基础,使我们的后端 SDK 能够仅使用后端代码提供低延迟的交互式应用程序。 然而,扩展 WebSocket 带来了重大挑战。 以下是重要的经验教训:
优雅部署:保持连接持久性
无缝部署至关重要;用户永远不会遇到中断。 为了确保部署期间 WebSocket 连接的持久性,我们采用了强大的重新连接策略:
- 新服务器已上线。
- 一旦健康,旧服务器开始返回 503(服务不可用)响应来进行健康检查。
- 连续四个 503 后,负载均衡器会删除不健康的服务器。 (健康检查每 5 秒进行一次,过程最多 25 秒。)
- 旧服务器发送自定义 WebSocket 关闭消息,指示客户端以随机间隔延迟重新连接,防止重新连接激增。 此消息包括:
- 短暂断开连接(约 10 秒)期间的用户友好消息。
- 随机延迟以避免惊群问题。 客户端还成倍增加与部署相关的重新连接的退避。
- 20 秒的延迟,以允许负载均衡器重定向流量。
旧服务器在客户端断开连接后完全关闭。 渲染或铁路等托管服务需要特别注意,以确保在部署期间顺利进行客户端连接传输。 这些服务通常会等待所有请求完成后再关闭,这会显着延长持久 WebSocket 连接的停机时间。
一致的消息架构:定义清晰的沟通
与 HTTP 的内置路由约定不同,WebSocket 需要自定义消息架构。 在 Compose 中,我们使用 2 字节类型前缀进行消息分类:
- 节省空间(仅 2 字节),可扩展至 65,536 种类型。
- 允许客户端轻松解析类型前缀而不影响数据。
- 通过版本化消息类型简化 API 升级。
const MESSAGE_TYPE_TO_HEADER = { RENDER_UI: "aa", UPDATE_UI: "ab", SHOW_LOADING: "ac", RENDER_UI_V2: "ad", /* ... */ };
我们还使用分隔符来分隔消息字段,与 JSON 相比,提高了编码/解码速度和内存效率。
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 }; }
使用 TypeScript 允许我们在前端和后端之间共享消息模式,防止不一致。
心跳机制:检测静默断开
没有关闭事件的意外连接断开可能会导致连接失效。 强大的心跳机制至关重要:
- 服务器每30秒发送一次ping消息,期望乒乓球响应。 >
- 客户端断开并重新连接是否在45秒内未收到ping。 服务器关闭了在45秒内错过乒乓球的连接。
- 这个双向心跳监视检测和处理端网络看起来功能的情况,但服务器没有接收响应。
http后备:处理网络限制
> Websocket可以在限制性网络上阻止。 撰写使用服务器量事件(SSE)作为接收更新的后备,HTTP请求客户端到服务器通信。>
SSE的基于HTTP的自然使其不易阻塞,提供了可靠的替代方案,其潜伏期相对较低。
进一步的考虑
缩放Websockets涉及其他复杂性:
>
缺乏标准工具:诸如限制速率和数据验证之类的功能通常需要自定义实现。
- >无法缓存响应:
- 与HTTP不同,Websockets缺乏标准的缓存机制。
- 人均身份验证:确保处理之前的每个消息的有效性对安全至关重要。
- 尽管存在这些挑战,但Websocket仍然是快速,实时和协作应用程序的最佳解决方案。 在Compose,Websockets为我们的整个平台提供动力,使开发人员可以使用我们的SDK从后端逻辑创建完整的Web应用程序。 在我们的文档中了解更多信息。
以上是缩放Websocket的课程的详细内容。更多信息请关注PHP中文网其他相关文章!

JavaScript核心数据类型在浏览器和Node.js中一致,但处理方式和额外类型有所不同。1)全局对象在浏览器中为window,在Node.js中为global。2)Node.js独有Buffer对象,用于处理二进制数据。3)性能和时间处理在两者间也有差异,需根据环境调整代码。

JavaScriptusestwotypesofcomments:single-line(//)andmulti-line(//).1)Use//forquicknotesorsingle-lineexplanations.2)Use//forlongerexplanationsorcommentingoutblocksofcode.Commentsshouldexplainthe'why',notthe'what',andbeplacedabovetherelevantcodeforclari

Python和JavaScript的主要区别在于类型系统和应用场景。1.Python使用动态类型,适合科学计算和数据分析。2.JavaScript采用弱类型,广泛用于前端和全栈开发。两者在异步编程和性能优化上各有优势,选择时应根据项目需求决定。

选择Python还是JavaScript取决于项目类型:1)数据科学和自动化任务选择Python;2)前端和全栈开发选择JavaScript。Python因其在数据处理和自动化方面的强大库而备受青睐,而JavaScript则因其在网页交互和全栈开发中的优势而不可或缺。

Python和JavaScript各有优势,选择取决于项目需求和个人偏好。1.Python易学,语法简洁,适用于数据科学和后端开发,但执行速度较慢。2.JavaScript在前端开发中无处不在,异步编程能力强,Node.js使其适用于全栈开发,但语法可能复杂且易出错。

javascriptisnotbuiltoncorc; saninterpretedlanguagethatrunsonenginesoftenwritteninc.1)javascriptwasdesignedAsalightweight,解释edganguageforwebbrowsers.2)Enginesevolvedfromsimpleterterterpretpreterterterpretertestojitcompilerers,典型地提示。

JavaScript可用于前端和后端开发。前端通过DOM操作增强用户体验,后端通过Node.js处理服务器任务。1.前端示例:改变网页文本内容。2.后端示例:创建Node.js服务器。

选择Python还是JavaScript应基于职业发展、学习曲线和生态系统:1)职业发展:Python适合数据科学和后端开发,JavaScript适合前端和全栈开发。2)学习曲线:Python语法简洁,适合初学者;JavaScript语法灵活。3)生态系统:Python有丰富的科学计算库,JavaScript有强大的前端框架。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

禅工作室 13.0.1
功能强大的PHP集成开发环境

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器