我正在将一个tty的stdout和stderr传输到RabbitMQ(确切地说是日志)。这些日志可以在网站上查看,当内容流式传输到RabbitMQ时,它们由Web服务器使用,并使用WebSockets转发到客户端。将日志发送到RabbitMQ后,日志会立即保留。
当用户访问网站时,将呈现持久化日志,并使用WebSockets对连续部分进行流式处理。问题是存在竞争条件,因为持久化日志可能会丢失在呈现站点和通过WebSocket接收第一个块之间发生的日志块。
我的想法是将所有块保留在队列中,并在连接后通过WebSocket发送。另外,我会添加一个工作人员来监听某种“已完成”事件,然后将所有事件记录在队列中并立即将其保留下来。
问题在于我不知道使用RabbitMQ是否可行。任何想法或其他解决方案?
我觉得这不重要但我的堆栈是使用Ruby Sinatra和Bunny RabbitMQ客户端。
答案 0 :(得分:0)
虽然我同意你关于从中断的地方开始的一般想法,但在加载初始页面之后,你正在尝试做的事情并不是应该从RabbitMQ完成的事情。
这会导致很多潜在的问题,我outlined in a blog post, previously。
我不会尝试使用RMQ,而是从数据库层执行此操作。
当你把东西推入数据库时,你有一个ID - 希望是一个顺序的。如果没有,请在条目中添加序列。
当您为用户加载页面时,请将他们所在的当前ID发送到浏览器。
页面完成加载并且您正在设置websocket连接后,通过websocket在消息列表中发送用户的当前位置。然后websocket连接可以使用该ID来说明"在此id之后给我所有消息,然后开始流式传输#34;
同样,这不是通过RabbitMQ(参见my article on why this is a bad idea)完成的,而是通过您的数据库和顺序ID完成的。