2015-10-25 3 views
0

Я передаю stdout tty и stderr в RabbitMQ (журналы, если быть точным). Эти журналы можно просматривать на веб-сайте, а пока контент передается в RabbitMQ, они потребляются веб-сервером и отправляются клиенту с помощью WebSockets. Журналы немедленно сохраняются после отправки в RabbitMQ.RabbitMQ сохранить сообщения в очереди

Когда пользователь обращается к веб-сайту, резидентные журналы визуализируются, а последовательные части передаются с использованием WebSockets. Проблема в том, что существует условие гонки, так как в сохраняющихся журналах могут отсутствовать фрагменты журнала, которые произошли между рендерингом сайта и получением первого фрагмента через WebSocket.

Моя идея состояла в том, чтобы сохранить все куски в очереди и отправить их через WebSocket после подключения. Кроме того, я бы добавил рабочего, чтобы прослушать какое-то «завершенное» событие, которое затем берет все в очереди и сразу же сохраняется.

Проблема в том, что я не знаю, возможно ли это, используя RabbitMQ или как. Любые идеи или другие решения?

Я не думаю, что это действительно имеет значение, но мой стек использует Ruby Sinatra и Bunny RabbitMQ client.

ответ

0

В то время как я согласен с вашей общей идеей о том, чтобы подняться туда, где вы остановились, после загрузки главной страницы то, что вы пытаетесь сделать, это не то, что должно быть сделано с помощью RabbitMQ.

Существует много потенциальных проблем, которые могут возникнуть у меня, что у меня есть outlined in a blog post, previously.

Вместо того, чтобы пытаться сделать это с помощью RMQ, я бы сделал это из уровня базы данных.

Как вы толкаете вещи в базу данных, у вас есть идентификатор - надеюсь, тот, который является последовательным. Если нет, добавьте последовательность в записи.

При загрузке страницы для пользователя отправьте текущий идентификатор, который находится в браузере.

После того, как страница заканчивается загрузкой, и вы настраиваете соединение с веб-разъемом, отправьте текущее место пользователя в список сообщений через веб-узел. то соединение с websocket может использовать этот идентификатор, чтобы сказать «дать мне все сообщения после этого идентификатора и начать их потоковое».

Опять же, это не делается с помощью RabbitMQ (см. my article on why this is a bad idea), но через вашу базу данных и последовательные идентификаторы.

Смежные вопросы