Ich habe eine Docker-basierte Anwendung entwickelt, die aus mehreren Microservices besteht. Es muss Amazon SQS-Nachrichten konsumieren und verarbeiten. Zuerst wollte ich AWS Elastic Beanstalk verwenden, aber dann bin ich über den EC2 Container Service gestürzt. Jetzt weiß ich nicht, welchen ich wählen soll.
Ab sofort unterstützt Elastic Beanstalk Multi-Container-Umgebungen. Das ist großartig, weil jeder Microservice einen eigenen Anwendungsserver in einem Docker-Container hat. Das nächste Problem ist die Skalierung:
Ich weiß nicht, wie der Skalierungsmechanismus funktioniert. Zum Beispiel: Ich habe 5 Docker-Container in meiner Elastic Beanstalk-Umgebung. Jetzt ist nur der fünfte Docker-Container stark ausgelastet, da eine große Anzahl von SQS-Nachrichten verarbeitet werden muss. Die anderen vier sind fast inaktiv, da sie nicht viel CPU benötigen oder möglicherweise nicht viele SQS-Nachrichten enthalten. Nehmen wir an, im 5. Container wird ein JBoss-Anwendungsserver ausgeführt. Soweit ich weiß, kann der Server nur eine begrenzte Anzahl paralleler Anforderungen verarbeiten, selbst wenn genügend CPU / Speicher verfügbar ist.
Wenn der JBoss Docker-Container die Anzahl der Anforderungen nicht verarbeiten kann, aber genügend CPU / Speicher verfügbar ist, möchte ich natürlich automatisch einen zweiten Docker / JBoss-Container auf derselben Instanz starten. Aber was passiert, wenn ich nicht genug CPU / Speicher habe? Natürlich möchte ich eine zweite Instanz drehen, die über eine automatische Skalierungsgruppe in EB konfiguriert werden kann. Jetzt dreht sich eine zweite Instanz, aber jeder Container außer der fünften ist fast im Leerlauf. Natürlich möchte ich nicht, dass sie auch in der zweiten Instanz unnötig 4 erzeugen, was eine Verschwendung von Ressourcen wäre. Nur die 5. sollte erscheinen und die anderen sollten wie die 5. Skala basierend auf konfigurierbaren Parametern wie z. B.: CPU / Speicher / SQS skalieren.
Ich weiß nicht genau, ob Amazon ECS das tut oder ob es überhaupt möglich ist, aber ich kann im Internet wirklich keine Quelle zu diesem Thema finden, was im Allgemeinen gesagt wird, Skalierung basierend auf Instanzen / Containern.
Antworten:
EB vs ECS kommt wirklich auf die Kontrolle an. Möchten Sie Ihre Skalierung und Kapazität steuern oder möchten Sie diese abstrakter gestalten und sich stattdessen hauptsächlich auf Ihre App konzentrieren? ECS gibt Ihnen die Kontrolle, da Sie die Größe und Anzahl der Knoten im Cluster angeben müssen und festlegen müssen, ob die automatische Skalierung verwendet werden soll oder nicht. Mit EB stellen Sie einfach eine Docker-Datei bereit und EB kümmert sich um die Skalierung Ihrer Bereitstellung von Anzahl und Größe der Knoten. Grundsätzlich können Sie die Infrastruktur mit der EB-Route vergessen.
Hier ist die EB-Dokumentation zu Docker: http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_docker.html
Bei ECS müssen Sie zuerst die Infrastruktur erstellen, bevor Sie mit der Bereitstellung der Docker-Datei beginnen können, damit es wirklich auf 1) Ihre Vertrautheit mit der Infrastruktur und 2) den Aufwand ankommt, den Sie für die Infrastruktur im Vergleich zur App aufwenden möchten.
quelle
Eine tote Frage nicht wiederzubeleben, aber hoffentlich hilft das jemandem.
Die akzeptierte Antwort ist nicht klar genug: Basierend auf dem, was OP beschrieben hat, will OP ECS, nicht Multi-Container Elastic Beanstalk (MCEB). Soweit ich das beurteilen kann, versucht MCEB niemals, Container effizient in Instanzen zu packen. OP fragt in einem Kommentar: "Wenn nur eine unter Last ist, skaliert es nur diese oder skaliert es immer die Instanzen und startet alle Container, egal unter welcher Last sie sind?" Und die Antwort lautet "Letzteres"; MCEB skaliert die Instanzen und startet alle Container, unabhängig davon, unter welcher Last sie stehen.
Bearbeiten
Verwenden Sie nicht die Architektur, die Sie sich vorstellen.
Wie mikro sind Ihre Microservices? Wäre es lächerlich, jedem einen t2.nano zu geben? Machen Sie sie dann jeweils zu einer Docker-EB-App mit einem Container - EB-Worker-Anwendungen können von SQS-Nachrichten gesteuert werden. Oder verwenden Sie apex.run .
Bearbeiten 31.01.18:
AWS Fargate scheint ziemlich cool zu sein.
Bearbeiten 05.06.19:
Verwenden Sie EKS, wenn Sie Container orchestrieren müssen, um einen Juckreiz zu stillen. Aber versuchen Sie das wirklich zu vermeiden. Verteilte Systeme sind schwer.
quelle