具有容错和持久消息存储的 Websockets 服务器

具有容错和持久消息存储的 Websockets 服务器

我开始尝试使用 websockets。

有谁知道有哪个 websockets 服务器(开源或付费)可以提供 websocket“通道”的持久存储?我发现的所有示例都没有解决持久性问题——如果 websockets 服务器出现故障,所有“通道”数据都会丢失。

Pusher 等服务并没有真正讨论它们是否解决了耐用性问题(而且我还没有收到技术支持的回复)。

很高兴能自己做,但不想重新发明轮子。

编辑:

我并不是在寻找 websockets 101 信息。这些信息很容易获得,也很容易理解。

我正在寻找一个支持 websocket 且具有 websocket 数据持久存储的服务器(开源或付费),这样,如果某个服务器出现故障,新的服务器可以接管原始服务器停止的位置。

两个主要目的:

  1. 支持 websockets 网络工作组设想的故障转移方案https://datatracker.ietf.org/doc/html/draft-ibc-websocket-dns-srv-02#section-5.1(最重要的是,当客户端连接到故障转移服务器时,会发送错过的消息)
  2. 支持新订阅者必须接收所有已发布的过去消息的场景。

当然,这可以在应用层处理......但这不是我想要的。

编辑

因此,经过一些研究,以下安装选项似乎是最强大的:

看似“真实”的托管服务

  • Pusher(很棒的 AP​​I,但尚无历史记录功能)
  • PubNub(有历史记录)

如果 websockets 不可用,所有上述服务都可以正常回退到其他通信方式。

我找不到任何提供“开箱即用”集群、故障转移和持久消息存储来回放历史记录的开源项目。有些项目可能可以作为良好的起点,但并不是我所寻找的。

答案1

Hornetq 是一个通用消息代理,支持 JMS、STOMP 和 Websockets+Stomp。它提供消息持久性以及许多其他功能。

答案2

频道数据是什么意思?

管理数据应该是服务器中运行的应用程序的职责(想想 LAMP)。

想想看,当您创建一个包含表单的 HTML 文件并将其放入普通的 Apache 中时,会节省多少数据。每次请求之后,所有“表单数据”都会丢失。

编辑:

你走错路了。

Websockets 与持久性或耐久性没有任何关系,SMTP、HTTP 或 IMAP 也是如此。它只是一种传输描述。(哎呀,甚至 syslog 也没有在 RFC 中谈论持久性)

我不知道您在寻找什么,但我很确定它不是 websocket 发送或接收的字节的耐用性,而是发送字节后构建的数据的耐用性。

这个问题已经解决过几次了,我只参考标准 RDBMS 框架:

  • 休眠 (java)
  • SQLAlchemy (python)
  • ActiveRecord (红宝石)

如果您只发送 JSON,那么您也可以使用一些非关系存储,如 Riak、Redis、MongoDB、CouchDB。

当然,您需要解析数据并从中创建适合您设置的内容。我不想这么说,但保存通过 websocket 发送的内容而不了解其含义,这与使用 tcpdump 然后用 ed 读取它差不多。

我可以建议将这个问题迁移到 stackoverflow 吗?我不认为 serverfault 是框架架构和开发的正确地方。

答案3

为了回答问题的一部分,即推进器持久性 我可以确认,如果连接到 Pusher 服务的用户和他们所连接的 WebSocket 服务器死亡,他们将自动重新连接到另一个 WebSocket 服务器。通道数据仅作为瞬时数据存在于 WebSocket 服务器中,我们有一个完全独立的系统,允许我们的 WebSocket 服务器分发和使用来自连接客户端的信息。目前,我们不会在 Pusher 中保留信息。数据只是在连接的组件(例如我们的 REST API)和连接的客户端之间分发。

目前,如果在客户端重新连接期间发送消息,用户将错过这些消息。但是,我们正在实现频道历史记录,这意味着我们将在频道内保留数据。这意味着可以检索用户错过的任何消息。由于我们的 WebSocket 服务器不会处理数据的持久性,如果我们丢失了 WebSocket 服务器,我们不会丢失频道数据。

答案4

因此,经过一些研究,以下安装选项似乎是最强大的:

看似“真实”的托管服务

  • Pusher(很棒的 AP​​I,但尚无历史记录功能)
  • PubNub(有历史记录)

如果 websockets 不可用,所有上述服务都可以正常回退到其他通信方式。

我找不到任何提供“开箱即用”集群、故障转移和持久消息存储来回放历史记录的开源项目。有些项目可能可以作为良好的起点,但并不是我所寻找的。

相关内容