Соединение http запроса / ответа модели с асинхронной очередью - PullRequest
8 голосов
/ 14 января 2009

Какой хороший способ связать модель синхронного http-запроса / ответа с моделью на основе асинхронной очереди?

Когда приходит HTTP-запрос пользователя, он генерирует рабочий запрос, который попадает в очередь ( beanstalkd в данном случае). Один из работников принимает запрос, выполняет работу и готовит ответ.

Модель очереди не является запросом / ответом - есть только запросы, а не ответы. Итак, вопрос в том, как лучше всего получить ответ обратно в мир HTTP и обратно пользователю?

Идеи:

  1. Beanstalkd поддерживает легкие темы или очереди (они называют их трубами). Мы могли бы создать канал для каждого запроса, попросить работника создать сообщение на этом канале и заставить процесс http сидеть и ждать в канале ответа. Не особенно нравится этот, так как у него есть процессы apache, занимающие память.

  2. Проведите опрос http-клиента для получения ответа. Первоначальный HTTP-запрос пользователя запускает задание в очереди и немедленно возвращается. Клиент (браузер пользователя) периодически запрашивает ответ. На бэкэнде рабочий помещает свой ответ в memcached, и мы подключаем nginx к memcached, чтобы опрос был легким.

  3. Использование Комета . Аналогично второму варианту, но с более изящным http-соединением, чтобы избежать опроса.

Я склоняюсь к 2, поскольку это легко и хорошо известно (я еще не использовал комету). Я предполагаю, что, вероятно, есть и гораздо более очевидная модель, о которой я не думал. Что ты думаешь?

Ответы [ 3 ]

1 голос
/ 11 января 2010

Опрос - простое решение; комета является более эффективным решением. Вы получили это прибито:)

Мне лично нравится комета (хотя я и предвзятый, поскольку помогал писать WebSync ), она позволяет вашим клиентам подписаться на канал и получать сообщение, когда ваш серверный процесс готов. Работает как чемпион.

1 голос
/ 15 января 2009

Вот , как эффективно реализовать запрос-ответ в JMS , что может быть полезно (хотя и ориентировано на Java / JMS). Общая идея состоит в том, чтобы создать временную очередь для каждого клиента / потока, а затем использовать correlationID для сопоставления запросов с ответами и т. Д.

0 голосов
/ 15 января 2009

Я собираюсь внедрить систему Beanstalkd и memcached для запуска ряда процессов после запроса - в данном случае, для поиска информации, когда пользователь входит в систему (например, количество сообщений, ожидающих пользователя). Информация сохраняется в Memcached и затем читается при следующей загрузке страницы.

Не зная немного больше о том, какие задачи вы выполняете, не так легко сказать, что нужно сделать или как. Вариант № 2, однако, самый простой, и это может быть все, что вам нужно - в зависимости от того, что вы подталкиваете обратно к рабочим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...