Я написал API для Django, цель которого - работать в качестве моста между серверной частью веб-сайта и внешними сервисами, которые мы используем, чтобы веб-сайт не обрабатывал много запросов к внешним API (CRM, события календаря)., провайдеры электронной почты и т. д.).
API в основном опрашивает другие службы, анализирует результаты и перенаправляет их в серверную часть веб-сайта.
Сначала я выбрал очередь задач на базе Celery, так какмне показалось, что это правильный инструмент для передачи этой обработки в другой экземпляр, но я начинаю думать, что она не совсем соответствует цели.
Поскольку веб-сайт ожидает синхронных ответов, мой код содержит много:
results = my_task.delay().get()
или
results = chain(fetch_results.s(), parse_results.s()).delay().get()
Что не похоже на правильный способ использования задач Celery.
Он эффективен при одновременной обработке десятков запросов и параллельной обработке результатов - например, в периодической задаче refresh - но добавляет много накладных расходов для простых запросов (fetch - parse- forward), которые представляют большую часть трафика.
Должен ли я работать полностью синхронно для этих "простых запросов" и сохранять задачи Celery для определенных сценариев?Существует ли альтернативный дизайн (возможно, с использованием asyncio), который лучше подходит для целей моего API?
Использование Django, Celery (с Amazon SQS) на экземпляре EBS EC2.