0

我正在将 tty 的 stdout 和 stderr 流式传输到 RabbitMQ(准确地说是日志)。这些日志可以在网站上查看,当内容流式传输到 RabbitMQ 时,它们由 Web 服务器使用并使用 WebSockets 转发到客户端。日志在发送到 RabbitMQ 后立即被持久化。

当用户访问网站时,会呈现持久化的日志,并使用 WebSockets 流式传输连续的部分。问题是存在竞争条件,因为持久化日志可能缺少在呈现站点和通过 WebSocket 接收第一个块之间发生的日志块。

我的想法是将所有块保留在队列中,并在连接后通过 WebSocket 发送它们。此外,我会添加一个工作人员来收听某种“已完成”事件,然后将队列中的所有内容都取出并立即持久化。

问题是我不知道这是否可以使用 RabbitMQ 或如何实现。有什么想法或其他解决方案吗?

我认为这并不重要,但我的堆栈正在使用 Ruby Sinatra 和 Bunny RabbitMQ 客户端。

4

1 回答 1

0

虽然我同意您关于从上次中断的地方开始的一般想法,但在加载初始页面后,您尝试做的事情不应该从 RabbitMQ 完成。

这会导致很多潜在的问题,我在之前的博客文章中已经概述了这些问题。

我不会尝试使用 RMQ 执行此操作,而是从数据库层执行此操作。

当您将内容推送到数据库中时,您将拥有一个 ID——希望它是顺序的。如果没有,请在条目中添加一个序列。

当您为用户加载页面时,将他们所在的当前 ID 发送到浏览器。

在页面完成加载并设置 websocket 连接后,通过 websocket 发送用户在消息列表中的当前位置。然后 websocket 连接可以使用该 id 说“给我这个 id 之后的所有消息,并开始流式传输它们”

同样,这不是通过 RabbitMQ 完成的(请参阅我关于为什么这是一个坏主意的文章),而是通过您的数据库和顺序 ID。

于 2015-10-26T14:26:54.057 回答