Здравствуйте, запустил сервер с Docker: docker run -p 8080:8080 project
Работает нормально, отвечает чем нужно, даже из интернета.
Но когда я пользуюсь им из моего приложения на Python, где используется aiohttp для асинхронного выполнения запросов, всегда или иногда мне приходит 504 ошибка, а сам docker пишет в консоли: "Error handling request". Почему это происходит и как исправить?
Ошибка явно из-за большого количества запросов, посылаемых сразу на сервер с docker. Неужели у него всё так плохо с обработкой такого объема? Мне бы хотелось этот сервер использовать, как api...
504 == Gateway timeout. по-видимому, веб-приложение внутри контейнера не тащит, или мало ресурсов ему. точнее не сказать, надо смотреть, какие нагрузки и какие запросы. может, он на каких-то особенных запросах стопорится.
Как и с обычным сервером, контейнер имеет ограничения по производительности.
Так что посмотрите логи контейнера, возможно дело в конфигурации апп. сервере, возможно, в ресурсах - CPU/RAM.
В первом случае помогут настройки, во втором - можно увеличить ресурсы контейнера или поднять несколько контейнеров с loadbalancer.
поднять несложно - можно например на разных портах.
Но чтобы было удобно пользоваться, надо поставить перед ними лоадбалансер - не суперсложно, но надо будет изучить как.
Vitaly Karasik, что странно, с трех консолей на localhost шлю в цикле запросы скриптом на питоне - все ответы приходят. А со стороны что-то сложности...
kkolorid,
К сожалению, навскидку я не могу понять, как у них можно увеличить количество параллельных workers/threads для обработки запросов.
Так что единственное что могу посоветовать - это спросить у разработчиков, и это похоже вы уже сделали https://github.com/rahiel/open_nsfw--/issues/3
Vitaly Karasik, попробовал закастылить через Flask. На нем сделал сервер, через который просто нативно якобы через консоль запускаю скрипт, который уже на др порте обращается к докеру - работает, хоть и медленно - вм в шоке по нагрузке, иногда ответы мимо летят.
Vitaly Karasik, а могу ли я в самой программе на питоне запускать docker сервер и из неё обращаться к серверу докера локально? Как такое реализовать на винде?
могу ли я в самой программе на питоне запускать docker сервер
разумеется можно, например через os.system().
Но опять-таки я не уверен, что понял для чего.
Если мы не знаем, как сделать контейнер с аппликацией более производительным, я бы вернулся к идее поднять несколько контейнеров с лоадбалансером перед ними. Вот пример https://levelup.gitconnected.com/set-up-a-nginx-lo...
Vitaly Karasik, просто на сервер может сразу и 1000 запросов улететь. Нужно, что бы он их обрабатывал по возможности параллельно и не крашился... Если я просто раскидывать по портам их буду, это вряд ли поможет... Дело в самом контейнере, мне кажется...
Vitaly Karasik, делаю, как в инструкции, один в один. Но почему-то на 5001 и 5002 портах контейнеры не работают. Сайт "The connection was reset. The connection to the server was reset while the page was loading."
Vitaly Karasik, ура, у нас есть движение! Действительно, поднял 9 портов и количество "хороших" ответов резко увеличилось. Однако, всё ещё несколько десятков пришло 504... И до сих пор "пачками". Результат радует, но не понятно, поможет ли мне гарантированно повышение количества рабочих контейнеров?
kkolorid, поскольку этот контейнер для нас "черный ящик", то единственный способ - проверить.
Если не поможет, надо подключить очередь или другой механизм для "уплощения" запросов в единицу времени.
Vitaly Karasik, а можно подробнее о том, как в моём случае очередь реализовать с лоадбалансером? Хотя бы в какую сторону думать. Разве это не должен лоадбалансер с nginx по дефолту делать?
Vitaly Karasik, кстати, если пытаюсь занимать порты 8090 и дальше, ломаются прошлые контейнеры. Больше 9ти не выходит, вообщем. от 8081 до 8089, на 8080 лоадбалансер.
очередь реализовать с лоадбалансером? Хотя бы в какую сторону думать. Разве это не должен лоадбалансер с nginx по дефолту делать?
Лоадбалансер умеет распределять запросы по бэкенд серверам.
Если есть бэкенд сервер, способный обработать 10 запросов в секунду, то поставив 10 серверов и лоадбалансер, мы сможем обработать 100 в секунду (в теории).
Что делать если запросы поступают пачками - 6000 запросов раз в минуту? Как раз в этой ситуации поможет очередь (RabbitMQ, например) - туда будут складываться запросы, а потом кто-то будет брать запросы из очереди и направлять в лоадбалансер. Если у вас такая ситуация с поступлением запросов, очередь может помочь.
А что конкретно там могло сломаться? Если я просто обращаюсь к серверу, даже через приложение, у меня всё работает отлично. Большое количественно запросов именно всё ломает. https://github.com/rahiel/open_nsfw-- - эта штука в docker