Мне нужно выполнить некоторую обработку асинхронных заданий с помощью веб-запроса, который я буду периодически опроса, пока он не будет завершен. У меня есть весь стек и работает локально, но я не могу концептуально понять, как переместить это на рабочий уровень EBS. Я использую Django с Celery и RabbitMQ локально и с успехом могу заменить RabbitMQ на Amazon SQS. Однако, когда я попытался создать рабочий уровень, который работал бы от той же базы данных RDS, что и webapp, но не был успешным. Я застрял в точке, где я могу отправлять сообщения в очередь, но не могу прочитать их из очереди. Мне нужно использовать эти сообщения, чтобы выполнить некоторую дорогостоящую операцию в базе данных и подготовить результат для потребителя. Есть ли какая-то архитектурная штука, которую мне не хватает? Как и где я могу получить демона сельдерея до обработки сообщений SQS?
Амазонский эластичный бобовый лейбл
Ответ 1
Из Эластичная документация по бобовому стеклу:
При запуске среды AWS Elastic Beanstalk вы выбираете тип среды, платформу и тип среды. Выбранный вами уровень среды определяет, поддерживает ли AWS Elastic Beanstalk ресурсы для поддержки веб-приложения, которое обрабатывает запросы HTTP (S) или веб-приложение, которое обрабатывает задачи фоновой обработки.
AWS Elastic Beanstalk устанавливает демон каждого экземпляра Amazon EC2 в группе автоматического масштабирования для обработки сообщений SAN ASazon в уровне рабочей среды. Демон извлекает данные из очереди Амазонки SQS, вставляет ее в тело сообщения HTTP POST-запроса и отправляет его на настраиваемый пользователем URL-адрес на локальном хосте. Тип контента для тела сообщения в запросе HTTP POST по умолчанию - application/json.
С точки зрения разработчика приложение, работающее на рабочем уровне, представляет собой просто обычную веб-службу. Он получит вызовы от демонстратора AWS Elastic Beanstalk, предоставленного вам в экземпляре.
Запросы отправляются в заданное вами значение HTTP-Path. Это делается таким образом, чтобы отображаться в веб-приложении в уровне рабочей среды, что демон вызвал запрос. Таким образом, демона выполняет аналогичную роль в балансировщике нагрузки на уровне среды веб-сервера.
Уровень рабочей среды после обработки сообщений в очереди пересылает сообщения через локальный loopback в веб-приложение с указанным вами URL-адресом. URL-адрес очереди доступен только с локального хоста. Поскольку вы можете получить доступ только к URL очереди из одного экземпляра EC2, аутентификация не требуется для проверки сообщений, которые доставляются по URL-адресу.
Веб-приложение в уровне рабочей среды должно прослушивать только локальный хост. Когда веб-приложение в уровне рабочей среды возвращает ответ 200 OK, чтобы подтвердить, что он получил и успешно обработал запрос, демон отправляет вызов DeleteMessage в очередь SQS, чтобы сообщение было удалено из очереди. (SQS автоматически удаляет сообщения, которые находились в очереди дольше, чем сконфигурированный RetentionPeriod.) Если приложение возвращает любой ответ, отличный от 200, или нет ответа в течение настроенного периода InactivityTimeout, SQS снова делает сообщение видимым в очереди и доступны для другой попытки обработки.
Ответ 2
В настоящее время я использую "стандартный" веб-уровень (сконфигурированный с большим количеством процессов и потоков) с моим приложением Django + Celery, и у меня есть экземпляр EC2 с пользовательским AMI, работающим с RabbitMQ. SQS не полностью поддерживается сельдерейцем, http://docs.celeryproject.org/en/latest/getting-started/brokers/sqs.html:
Транспортировка SQS нуждается в улучшении во многих областях, и там есть несколько открытых ошибок.
Честно говоря, я никогда не понимал, каким должен быть/должен вести себя веб-рабочий уровень, но моя текущая конфигурация, похоже, работает очень хорошо (я также использую билльдеринг для управления задачами периода). Я демоннизировал Celery с помощью Supervisor (который уже используется Elastic Beanstalk для управления apache).