Websocket 将大量数据推送到浏览器的简单服务器?

Websocket 将大量数据推送到浏览器的简单服务器?,websocket,push,mqtt,message-queue,Websocket,Push,Mqtt,Message Queue,我正在构建一个Web应用程序,它使用从服务器推送的数据 每个消息都是JSON,可能很大,有数百千字节,消息每分钟发送几次,并且顺序无关紧要 服务器应该能够持久化尚未传递的消息,可能为客户端存储数兆字节几天,直到客户端无法联机。未发送消息的存储大小有一个限制,例如每个客户端20mb,超过此限制时,旧的未发送消息将被删除 服务器应该能够同时处理大约1000个连接。如何简单地实现它 可能的解决方案 我在想,也许可以将消息作为文件存储在磁盘上,并使用浏览器池1秒钟,检查新消息,然后使用NGinx或类似的

我正在构建一个Web应用程序,它使用从服务器推送的数据

每个消息都是JSON,可能很大,有数百千字节,消息每分钟发送几次,并且顺序无关紧要

服务器应该能够持久化尚未传递的消息,可能为客户端存储数兆字节几天,直到客户端无法联机。未发送消息的存储大小有一个限制,例如每个客户端20mb,超过此限制时,旧的未发送消息将被删除

服务器应该能够同时处理大约1000个连接。如何简单地实现它

可能的解决方案 我在想,也许可以将消息作为文件存储在磁盘上,并使用浏览器池1秒钟,检查新消息,然后使用NGinx或类似的东西提供消息?是否有针对此类用例的NGinx配置/模块

或者最好使用MQTT服务器或一些消息队列(如Rabbit MQ)和一些浏览器适配器?

MQTT很可能不是您想要的。该协议是轻量级的,正如评论所指出的,该协议规定可能只存在“大小不超过268435455(256 MB)”的控制数据包。显然,这对于您的用例来说太小了


此外,如果在消息发布时客户端未连接(并且未订阅该特定主题),则消息将永远不会被传递EDIT:正如@Brits所指出的,这只适用于QoS为0的酒吧/酒吧。

就像JD Allen提到的,您需要像或这样的排队服务。有无数其他此类服务/库/包存在,因此请进一步调查


如果您想扮演自己的角色,可能需要考虑使用并包装一些您自己的应用程序逻辑。不过,这可能有点老套,所以对这一建议持保留态度。

实际上,MQTT支持跨客户端连接持久化会话的概念,但客户端必须首先连接并请求“非干净”会话。之后,如果客户端断开连接,代理将保留所有发送给该客户端的QoS=1或2消息,直到它重新连接

从技术上讲,使用MQTT v3.x,服务器应该永远保存所有这些断开连接的客户端的所有消息!每条消息的最大负载为256MB,但服务器应该保存您提供的所有消息。这给MQTTV5要解决的服务器带来了一个大问题。大多数现实世界的代理都有可配置的设置

但是,如果连接通过可能意外中断和重新连接的不可靠网络(无线、蜂窝调制解调器等),MQTT将大放异彩


如果客户机通过相当可靠的网络连接,那么使用RabbitMQ的AMQP将更加灵活,因为客户机可以创建和管理各个队列。但最妙的是,您可以使用RabbitMQ混合使用这两种协议,因为它有一个MQTT插件。因此,不可靠网络上的较小客户端可以通过MQTT进行连接,其他客户端可以通过AMQP进行连接,并且它们都可以相互通信。

对于StackOverflow来说,请求建议是不合适的。MQTT代理不会像您希望的那样对消息进行排队。Rabbit MQ或AMQ之类的东西更适合此用例。谢谢,我不知道MQTT不能保证消息传递,似乎Rabbit MQ非常适合此用例…“在消息发布时,消息将永远不会被传递”-这不一定正确。只要QOS1+,cleansession=0且客户端以前已连接,MQTT代理就会为您存储消息。MQTT确实提供服务质量保证;但是这些只有在收到客户端的初始订阅后才会生效。“我甚至看到一些代理实现了65536MB的消息大小上限”MQTT 3.1发布数据包的最大值为2^28字节(256Mb),因此我认为您可能会有一个输入错误(不是所有代理都支持这个;Mosquitto支持)。无论如何,这远远超过了OP的规定要求。@Brits你完全正确,谢谢你指出这一点!我已经用相关文档更新了我的答案。另外,在阅读5.0 MQTT规范时,我发现一件有趣的事情是,它没有像3.1.1中那样明确提到256MB限制,尽管在两个版本中都是如此。@Mathyou MQTT 5类似(请参阅和)。问题中提到的数据包大小为“数百KB”,因此我不确定您为什么会说“这对于您的用例来说太小了”?。MQTT可以满足所有规定的要求,但正如FrankP所指出的,有一些替代方案提供了更大的灵活性(问题中没有足够的信息来进一步评论)。