У меня есть 2 сервера, использующие одни и те же данные, расположенные в хранилище AWS S3. Один обрабатывает HTTP-трафик, другой выполняет более долгую работу. Принцип его работы заключается в том, что HTTP-протокол сохраняет данные в S3, отправляет событие в бэкэнд, и данные обрабатываются.
Однако кажется, что каждые пару минут в бэкэнде возникает ошибка, потому что данные на S3 еще не существуют. Есть ли задержка между загрузкой файлов в S3 и их доступностью для других клиентских подключений?
Я уверен, что загрузка завершилась к тому времени, когда серверная часть получит доступ к этим файлам, и HTTP-сервер использует соединение для поддержания активности с S3.
Хотя первый ответ, предполагающий тайм-аут вслепую, скорее всего, сработает, могу ли я предложить изучить события уведомления S3. Если вы планируете масштабирование до более чем двух серверов, использование чего-то вроде SNS или SQS для управления тем, что происходит, например, после успешной записи объекта, значительно упростит задачу, чем полагаться на тайм-ауты общего доступа.
Вы можете прочитать об этой функции здесь: http://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html
Из-за того, как S3 распределяет данные после загрузки и как они балансируют нагрузку в своих внешних запросах, вполне вероятно, что объекту может потребоваться пара секунд для полного распространения по их инфраструктуре. Я бы рекомендовал просто добавить задержку в несколько секунд в вашу логику (между загрузкой и извлечением) или, возможно, просто обнаружить сбой, затем подождать несколько секунд и повторить попытку.