У меня есть 2 проблемы, связанные с фоновыми задачами:
- Фоновые задачи записи блокируют основной поток.
- Потеря данных, если поступает менее 20 событий, если нет постоянного веб-трафика, моя задача записи не завершается и происходит периодическая очистка фона задача останавливается.
FastAPI BackgroundTasks для пакетной записи событий
Я использую библиотеку Boto3 для отправки событий в Firehose, и это не асинхронно. Чтобы снизить задержку, я помещаю события в очередь событий и записываю пакеты по 20 событий в Firehose, каждый пакет запускается в FastAPI BackgroundTasks.
Возможно, BackgroundTasks — неподходящий инструмент для AWS Lambda?
Блокировка фоновых задач
Чтобы предотвратить ожидание в основном потоке, я выполняю пакетную запись в Firehose в обычной функции, а не в асинхронный. Я вижу, что пакетная запись выполняется в отдельном от основного потока потоке. Однако во время записи в основном потоке ничего не происходит.
Завершение фоновой задачи, когда AWS Lambda неактивен
Я также пытался иметь асинхронную периодическую фоновую задачу, которая просыпается раз в минуту и сбрасывает события, которые не достигли 20, для пакетной записи. Однако эта фоновая задача завершается, если к конечной точке не поступает постоянный трафик. Это завершение работы также предотвратит завершение запущенной фоновой задачи записи.
Увеличить количество рабочих процессов Uvicorn в AWS Lambda?
Возможная проблема заключается в том, что FastAPI сервер Uvicorn по умолчанию работает только с одним работником. Я также пытался найти место для изменения количества рабочих Unicorn в консоли Terraform или AWS, но не нашел документации о том, как это сделать. Я даже увеличил размер памяти до 1,8 ГБ, чтобы получить 2 ядра для моей микроВМ.
FastAPI на AWS Lambda или EC2
Не могу сказать, проблема ли это в моей проблеме это небольшая неправильная конфигурация или вместо этого было бы проще запустить FastAPI на статическом экземпляре EC2. Вероятно, у вас не возникнет проблем с фоновыми задачами в EC2, но интеграция с API Gateway, вероятно, сложнее.
Подробнее здесь: https://stackoverflow.com/questions/783 ... round-task