websocket - 将大量数据推送到浏览器的简单服务器?
问题描述
我正在构建一个使用从 Server 推送的数据的 Web 应用程序。
每条消息都是 JSON,可能很大,有数百 KB,消息每分钟发送几次,顺序无关紧要。
服务器应该能够保留尚未传递的消息,可能会为客户端存储几兆字节数天,直到客户端无法上网。未发送消息的存储大小有限制,例如每个客户端 20mb,当超过此限制时,旧的未传递消息将被删除。
服务器应该能够处理大约1000 个同时连接。如何简单地实施?
可能的解决方案
我在想也许将消息作为文件存储在磁盘上并使用浏览器池 1 秒,以检查新消息并使用 NGinx 或类似的东西提供它?对于此类用例,NGinx 是否有一些配置/模块?
或者也许最好将 MQTT 服务器或一些消息队列(如 Rabbit MQ)与一些浏览器适配器一起使用?
解决方案
实际上,MQTT 支持跨客户端连接持续存在会话的概念,但客户端必须首先连接并请求“非干净”会话。之后,如果客户端断开连接,代理将保留所有发往该客户端的 QoS=1 或 2 消息,直到重新连接。
使用 MQTT v3.x,从技术上讲,服务器应该永远保存所有这些断开连接的客户端的所有消息!每条消息的最大有效负载为 256MB,但服务器应该保存您提供的所有内容。这给 MQTT v5 修复的服务器带来了一个大问题。大多数现实世界的经纪人都有可配置的设置。
但是,如果连接是通过不可靠的网络(无线、蜂窝调制解调器等),可能会意外断开并重新连接,那么 MQTT 会大放异彩。
如果客户端通过相当可靠的网络连接,那么带有 RabbitMQ 的 AMQP 会更加灵活,因为客户端可以创建和管理单独的队列。但巧妙的是,您可以使用 RabbitMQ 混合这两种协议,因为它有一个 MQTT 插件。因此,不可靠网络上的较小客户端可以通过 MQTT 连接,其他客户端可以通过 AMQP 连接,并且它们都可以相互通信。
推荐阅读
- javascript - 在 CI 环境中使用 Playwright 登录 Google
- mongodb - 使用 mongodb+srv 配置 Mongo
- android - 如何在没有完成活动的情况下设置活动结果?
- sql - 如何在sql server中将数据更新为json数组并选择数据作为json数组
- python - 在 pytorch 中定义一个连接不完整的网络,比如卷积
- android - 将 viewpager2 与 TabLayoutMediator 一起使用时调用下一个片段的生命周期方法
- embedded - 应用于嵌入式设备时的 NTP 服务器语法
- vb.net - VB.NET LINQ 中的左连接
- angular - 拖放附近的角度材料分类
- ios - tableView 单元格动态高度仅在一些滚动后才能正常工作