Opracowałem aplikację opartą na platformie Docker składającą się z wielu mikrousług. Musi konsumować wiadomości Amazon SQS i je przetwarzać. Na początku chciałem skorzystać z AWS Elastic Beanstalk, ale potem przewróciłem się o usługę EC2 Container Service. Teraz nie wiem, który wybrać.
Obecnie Elastic Beanstalk obsługuje środowiska wielopojemnikowe. To świetnie, ponieważ każda mikrousługa ma własny serwer aplikacji w kontenerze Dockera. Następnym problemem jest skalowanie:
Nie wiem, jak działa mechanizm skalowania. Na przykład: mam 5 kontenerów docker w moim środowisku Elastic Beanstalk. Teraz tylko piąty kontener docker jest mocno obciążony, ponieważ ma ogromną liczbę komunikatów SQS do przetworzenia, pozostałe cztery są prawie bezczynne, ponieważ nie potrzebują dużo procesora lub może nie mają wielu komunikatów SQS. Załóżmy, że w piątym kontenerze działa serwer aplikacji JBoss. O ile wiem, serwer może zużywać ograniczoną liczbę równoległych żądań, nawet jeśli jest wystarczająco dużo procesora / pamięci.
Jeśli kontener JBoss Docker nie jest w stanie obsłużyć ilości żądań, ale jest wystarczająco dużo procesora / pamięci, oczywiście chcę automatycznie uruchomić drugi kontener Docker / JBoss na tej samej instancji. Ale co się stanie, jeśli nie mam wystarczającej ilości procesora / pamięci? Oczywiście chcę obrócić w drugiej instancji, którą można skonfigurować za pomocą grupy autoskalowania w EB. Teraz kręci się druga instancja, ale każdy pojemnik z wyjątkiem piątego jest prawie bezczynny, oczywiście nie chcę, aby w drugiej instancji pojawiały się 4 niepotrzebne, co byłoby marnowaniem zasobów. Tylko piąta powinna się pojawić, a pozostałe powinny skalować się jak piąta skala w oparciu o konfigurowalne parametry, takie jak np .: procesor / pamięć / SQS.
Nie wiem dokładnie, czy Amazon ECS to robi, czy w ogóle jest to możliwe, ale naprawdę nie mogę znaleźć w Internecie żadnego źródła na ten temat, czyli ogólnie rzecz biorąc, skalowanie oparte na instancjach / kontenerach.
Odpowiedzi:
EB vs ECS naprawdę sprowadza się do kontroli. Czy chcesz kontrolować skalowanie i pojemność, czy też chcesz, aby to było bardziej abstrakcyjne i zamiast tego skupić się głównie na aplikacji. ECS da Ci kontrolę, ponieważ musisz określić rozmiar i liczbę węzłów w klastrze oraz określić, czy powinno być używane automatyczne skalowanie. Dzięki EB po prostu udostępniasz plik Dockerfile, a EB zajmuje się skalowaniem aprowizacji liczby i rozmiaru węzłów, w zasadzie można zapomnieć o infrastrukturze z trasą EB.
Oto dokumentacja EB na Docker: http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_docker.html
Dzięki ECS będziesz musiał najpierw zbudować infrastrukturę, zanim zaczniesz wdrażać plik Dockerfile, więc tak naprawdę sprowadza się to do 1) znajomości infrastruktury i 2) poziomu wysiłku, jaki chcesz poświęcić na infrastrukturę w porównaniu z aplikacją.
źródło
Nie po to, żeby wskrzesić martwe pytanie, ale miejmy nadzieję, że to komuś pomoże.
Przyjęta odpowiedź nie jest wystarczająco jasna: na podstawie tego, co opisano w OP, OP chce ECS, a nie Multi-Container Elastic Beanstalk (MCEB). O ile wiem, MCEB nigdy nie próbuje efektywnie pakować kontenerów w instancje. OP pyta w komentarzu „jeśli tylko jeden jest pod obciążeniem, skaluje tylko ten, czy też zawsze skaluje instancje i uruchamia wszystkie kontenery, bez względu na to, pod jakim są obciążeniem?” Odpowiedź brzmi: „to drugie”; MCEB skaluje instancje i uruchamia wszystkie kontenery, niezależnie od obciążenia, pod jakim się znajdują.
Edytować
Nie używaj architektury, którą sobie wyobrażasz.
Jak mikro są Twoje mikroserwisy? Czy byłoby śmieszne dać im t2.nano? Następnie utwórz z nich pojedynczą aplikację Docker EB - aplikacje robocze EB mogą być obsługiwane przez komunikaty SQS. Lub użyj apex.run .
Edycja 31.01.18:
AWS Fargate wydaje się całkiem fajne.
Edycja 05.06.19:
Użyj EKS, jeśli chcesz zaaranżować pojemniki, aby zaspokoić swędzenie. Ale naprawdę staraj się tego unikać. Systemy rozproszone są trudne.
źródło