Поскольку никто не предоставлял решение этого сообщения, а также тот факт, что мне отчаянно нужно обходное решение, вот моя ситуация и некоторые абстрактные решения/идеи для обсуждения.
Мой стек:
- Торнадо
- Сельдерей
- MongoDB
- Redis
- RabbitMQ
Моя проблема: найдите способ для Торнадо, чтобы отправить задачу сельдерея (решена), а затем асинхронно собрать результат (любые идеи?).
Сценарий 1: (запрос/ответ взлома плюс веб-хост)
- Tornado получает (пользовательский) запрос, затем сохраняет в локальной памяти (или в Redis) запрос {jobID: (user)}, чтобы помнить, где распространять ответ, и запускает задачу celery с идентификатором job
- Когда сельдерей завершает задачу, он выполняет webhook на каком-то url и сообщает торнадо, что этот идентификатор job закончил (плюс результаты)
- Tornado получает запрос (пользователь) и перенаправляет ответ на (пользователь)
Может ли это случиться? Есть ли у него логика?
Сценарий 2: (торнадо плюс длинный опрос)
- Tornado отправляет задачу сельдерея и возвращает некоторые первичные данные json клиенту (jQuery)
- jQuery делает некоторый длинный опрос при получении первичного json, скажем, каждые x микросекунд, а торнадо отвечает в соответствии с некоторым флагом базы данных. Когда задача celery завершается, этот флаг базы данных имеет значение True, затем завершается "loop" jQuery.
Является ли это эффективным?
Любые другие идеи/схемы?