Я пытаюсь создать службу, которая будет запускать пользовательские java-процессы в контейнерах Docker в AWS (скорее всего, ECS). Один Java-процесс на контейнер для каждого пользователя. Единственное исключение из этого может быть при установке нового контейнера для того, что плохо себя ведет. Java-процесс - это пакетное программное обеспечение, которое нельзя изменить в соответствии с моими потребностями. По сути, я собираюсь создать службу SaaS на основе этого конкретного программного обеспечения, и я знаю, что будут детали лицензирования, которые необходимо согласовать с разработчиком программного обеспечения.
Java-процесс имеет собственный встроенный веб-сервер, который использует нестандартные порты, например (30000-30004) для доступа к своему веб-интерфейсу. Он может поддерживать HTTP или HTTPS в зависимости от конфигурации. Я планирую запускать как можно больше этих контейнеров на каждый экземпляр EC2, чтобы сделать его более рентабельным (это будет означать, что разные порты экземпляров EC2 будут сопоставлены с внутренними портами (30000–30004) контейнеров.
Я хотел бы обернуть встроенный пользовательский интерфейс java-процесса несколькими другими элементами, чтобы обеспечить контроль над Java-процессом (остановка, запуск и т. Д.) И обслуживать мой пользовательский интерфейс через другой веб-сервер или, возможно, шлюз API через Lambda. Это позволит пользователю запускать или останавливать свой экземпляр по мере необходимости, и вся система будет использовать эти запросы для запуска или остановки конкретного контейнера Docker пользователя.
Чтобы дать представление о масштабе, возможно, что одновременно могут быть десятки тысяч пользователей. Прогнозируемый размер рынка для этого проекта составляет около 100 000 пользователей. Возможный размер рынка составляет около 2 миллионов пользователей в месяц. На самом деле, это будет примерно 10 000 пользователей, из которых примерно 7 500 будут активны в течение любого месяца. Потенциальный масштаб этого, вероятно, исключает возможность использования Application Load Balancer с индивидуальной настройкой целевой и целевой группы для каждого экземпляра контейнера пользователя, поскольку ограничения на ALB допускают только 1000 целей и только 100 правил.
Чтобы дать представление о скорости изменений, отдельный контейнер может работать в течение нескольких часов или, возможно, дня или более, пока пользователь взаимодействует с ним. Но иногда его можно использовать только в течение нескольких минут. Контейнер для отдельного пользователя может понадобиться только раз в неделю или две, или он может использоваться ежедневно.
Теперь к вопросу, какие из лучших решений для обработки трафика маршрутизации к упомянутым контейнерам Docker? Я надеюсь разместить все это в моем собственном домене и использовать маршрутизацию на основе путей для получения запросов в соответствующие контейнеры.
Например:
Пользователи не должны иметь доступа ни к одному контейнеру, кроме того, который запускается специально для их сеанса. В java-процессе есть встроенная аутентификация, которая может помочь в этом.
По сути, я создаю мультитенантную службу из одного пользовательского программного обеспечения, я знаю, что мне придется создать довольно много пользовательских инструментов, и я не прочь сделать это. Я бы предпочел решения, которые хорошо работают с Python, когда требуется собственный код, но при необходимости приветствуются и другие языки. Я подозреваю, что мне нужно будет включить какой-то агент или сценарий запуска в контейнеры или в экземпляры EC2, выполняющие их, которые будут регистрировать контейнер в системе маршрутизации после запуска контейнера. Затем мне нужно было бы изучить аналогичный сценарий выключения для удаления регистрации контейнера, а также обычную систему для очистки в случае, если контейнер или экземпляр EC2 выйдет из строя без надлежащего выключения. Я уже изучил HAProxy и Nginx, и я готов услышать идеи по этому поводу, но другие варианты также очень приветствуются.
Заранее благодарим вас за ваши предложения!
Вы определенно правы в том, что вам нужно создать множество специальных инструментов для этого, но я думаю, что это можно сделать.
Я бы сделал это с помощью балансировщика нагрузки приложений (ALB) и целевых групп. ALB может создавать настраиваемую маршрутизацию на основе пути и отправлять трафик в определенные целевые группы (читай: серверы или, в вашем случае, контейнеры Docker) в соответствии с правилами пути, например:
Вам нужно будет создать инструменты для;
Вероятно, вы можете сделать все это в рамках лямбда-функции. Я не вижу причин, по которым для их завершения потребуется больше, чем максимальное время жизни в 5 минут ... самая длинная часть будет ждать, пока контейнеры станут активными, и даже это не так уж и долго.