【问题标题】:Simple Server to PUSH lots of data to Browser?将大量数据推送到浏览器的简单服务器?
【发布时间】:2021-07-12 16:28:19
【问题描述】:

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

每条消息都是 JSON,可能很大,数百千字节,消息每分钟发送几次顺序无关紧要强>。

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

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

可能的解决方案

我在想也许将消息作为文件存储在磁盘上并使用浏览器池 1 秒,以检查新消息并使用 NGinx 或类似的东西提供它? NGinx 是否有一些用于此类用例的配置/模块?

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

【问题讨论】:

  • 寻求建议对于 StackOverflow 来说是题外话。
  • MQTT 代理不会像您想要的那样排队消息。像 Rabbit MQ 或 AMQ 这样的东西会更适合这个用例。

标签: websocket push mqtt message-queue


【解决方案1】:

MQTT 很可能不是您正在寻找的。该协议是轻量级的,正如 cmets 指出的那样,该协议指定可能只存在“大小不超过 268,435,455 (256 MB) 的控制包”source。显然,这对于您的用例来说太小了。

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

就像 JD Allen 提到的,您需要像 Rabbit MQAMQ 这样的排队服务。存在无数其他此类服务/库/包,因此请进行更多调查。

如果您想扮演自己的角色,可能值得考虑使用AWS SQS 并围绕它包装一些您自己的应用程序逻辑。不过,这可能有点老套,所以请谨慎对待这个建议。

【讨论】:

  • 谢谢,不知道MQTT不保证消息传递,看来Rabbit MQ很适合这种情况...
  • “在发布消息时,消息将永远不会被传递” - 这不一定是正确的。只要 QOS1+、cleansession=0 且客户端之前已连接,MQTT 代理就会为您存储消息。 MQTT 确实提供服务质量保证;但这些只有在收到客户的初始订阅后才会生效。
  • “我什至看到一些代理实现了 65536 MB 的消息大小上限” 最大 MQTT 3.1 发布数据包是 2^28 字节 (256Mb) 所以我认为你可能有错字 (并非所有经纪人都会支持这一点;Mosquitto 支持)。无论如何,这远远超过了 OP 的规定要求。
  • @Brits 你说得对,感谢您指出这一点!我已经用相关文档更新了我的答案。顺便说一句,我在阅读 5.0 MQTT 规范时发现有趣的一件事是,它没有像 3.1.1 那样明确提及 256MB 限制,尽管在两个版本中都是如此。
  • @Mathyou MQTT 5 类似(参见herehere)。问题中提到的数据包大小为“数百千字节”,所以我不确定您为什么说“这对于您的用例来说太小了”? MQTT 可以满足所有规定的要求,但正如 FrankP 指出的那样,还有一些替代方案可以提供更大的灵活性(问题中没有足够的信息来进一步评论)。
【解决方案2】:

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

使用 MQTT v3.x,从技术上讲,服务器应该永久保存所有这些断开连接的客户端的所有消息!每条消息的最大有效负载为 256MB,但服务器应该保存您提供的所有内容。这给 MQTT v5 修复的服务器带来了一个大问题。并且大多数现实世界的经纪人都有可配置的设置。

但是,如果连接是通过不可靠的网络(无线、蜂窝调制解调器等)进行的连接,可能会意外断开并重新连接。

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

【讨论】:

    猜你喜欢
    • 2015-09-15
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    相关资源
    最近更新 更多