Рассмотрим нашу текущую архитектуру:
+---------------+
| Clients |
| (API) |
+-------+-------+
∧
∨
+-------+-------+ +-----------------------+
| Load Balancer | | Nginx |
| (AWS - ELB) +<-->+ (Service Routing) |
+---------------+ +-----------------------+
∧
∨
+-----------------------+
| Nginx |
| (Backend layer) |
+-----------+-----------+
∧
∨
----------------- +-----------+-----------+
File Storage | Gunicorn |
(AWS - S3) <-->+ (Django) |
----------------- +-----------------------+
Когда клиент, мобильный или веб-сервер пытается загружать большие файлы (более GB) на наши серверы, часто приходится сталкиваться с таймаутами в режиме ожидания. Либо из их клиентской библиотеки, например, в iOS, либо из нашего балансировщика нагрузки.
Когда файл фактически загружается клиентом, никаких тайм-аутов не происходит, потому что соединение не является "незанятым", байты передаются. Но я думаю, что когда файл был перенесен в базовый слой Nginx, и Django начинает загрузку файла на S3, соединение между клиентом и нашим сервером становится бездействующим до завершения загрузки.
Есть ли способ предотвратить это и на каком уровне я должен решить эту проблему?