Instanzen sind die Grundbausteine von App Engine. Sie stellen alle Ressourcen bereit, die für ein erfolgreiches Hosting Ihrer Anwendung erforderlich sind. Die Ausführung der Anwendung kann zu jeder Zeit auf einer oder mehreren Instanzen erfolgen. Im letzteren Fall werden Anfragen auf alle Instanzen verteilt. Jede Instanz beinhaltet eine Sicherheitsebene, die dafür sorgt, dass die Instanzen sich nicht versehentlich gegenseitig beeinträchtigen.
App Engine kann bei Trafficschwankungen Instanzen automatisch erstellen und herunterfahren. Alternativ haben Sie die Möglichkeit, eine Anzahl an Instanzen anzugeben, die unabhängig vom Umfang des Traffics ausgeführt werden sollen. Um festzulegen, wie und wann neue Instanzen erstellt werden, geben Sie für Ihre Anwendung den entsprechenden Skalierungstyp an. Die Skalierungseinstellungen werden auf der App Engine-Versionsebene als Teil der Datei app.yaml angewendet.
Skalierungstypen
App Engine unterstützt die im Folgenden aufgeführten Skalierungstypen. Diese steuern, wie und wann Instanzen erstellt werden:
- Automatisch (Standard)
- Einfach
- Manuell
Den Skalierungstyp müssen Sie in der Datei appengine-web.xml
Ihrer Anwendung festlegen.
Standardmäßig verwendet Ihre Anwendung die automatische Skalierung, was bedeutet, dass App Engine die Anzahl der inaktiven Instanzen verwaltet.
- Autoscaling
- Beim Autoscaling werden Instanzen auf der Grundlage von Anfragerate, Antwortlatenz und anderen Anwendungsmesswerten erstellt. Sie können für jeden dieser Messwerte Schwellenwerte sowie die Mindestanzahl an Instanzen angeben, die immer ausgeführt werden sollen. Dazu konfigurieren Sie das Element
automatic_scaling
.
- Einfache Skalierung
- Bei der einfachen Skalierung werden dynamisch Instanzen erstellt, wenn die Anwendung Anfragen erhält. Die jeweilige Instanz wird heruntergefahren, wenn die Anwendung inaktiv wird. Die einfache Skalierung ist ideal für zeitweilige oder durch Nutzeraktivität gesteuerte Aufgaben.
- Manuelle Skalierung
- Bei der manuellen Skalierung wird die Anzahl der Instanzen festgelegt, die unabhängig von der Arbeitslast kontinuierlich ausgeführt werden sollen. Dies ermöglicht komplexe Initialisierungen und Anwendungen, die vom Status des Arbeitsspeichers im Zeitablauf abhängen.
Funktion | Autoscaling | Einfache Skalierung | Manuelle Skalierung |
---|---|---|---|
Zeitlimit für Anfragen |
10 Minuten für HTTP-Anfragen und Aufgaben in Aufgabenwarteschlangen. Wenn die Anwendung innerhalb dieses Zeitlimits keine Antwort zurückgibt, unterbricht App Engine den Anfrage-Handler und gibt einen Fehler aus, der von Ihrem Code verarbeitet werden muss.
Für ältere Laufzeiten (Java 8, PHP 5 und Python 2):
|
24 Stunden für HTTP-Anfragen und Aufgaben in Aufgabenwarteschlangen. Wenn die Anwendung innerhalb dieses Zeitlimits keine Antwort zurückgibt, unterbricht App Engine den Anfrage-Handler und gibt einen Fehler aus, der von Ihrem Code verarbeitet werden muss.
Eine einfach skalierte Instanz kann für viele Stunden |
Wie bei der einfachen Skalierung. |
Hintergrundthreads | Nicht zulässig | Zulässig | Zulässig |
Wohnsitz | Instanzen werden basierend auf Nutzungsmustern heruntergefahren. |
Instanzen werden auf Grundlage des Parameters idle-timeout heruntergefahren. Ist eine Instanz inaktiv, etwa weil länger als idle-timeout keine Anfrage eingegangen ist, wird die Instanz heruntergefahren.
|
Instanzen bleiben im Speicher und der Status bleibt für alle Anfragen erhalten. Werden Instanzen beendet, wird eine /_ah/stop -Anfrage in den Logs dokumentiert.
Gibt es einen /_ah/stop -Handler oder einen registrierten Shutdown-Hook, verbleiben vor dem Herunterfahren 30 Sekunden für die Ausführung.
|
Starten und Herunterfahren | Instanzen werden zur Verarbeitung von Anfragen nach Bedarf erstellt. Bei Inaktivität werden sie automatisch heruntergefahren. |
Instanzen werden zur Verarbeitung von Anfragen nach Bedarf erstellt. Bei Inaktivität werden sie auf Grundlage des Konfigurationsparameters idle-timeout automatisch heruntergefahren. Wenn Sie eine Instanz manuell beenden, können auf dieser noch 30 Sekunden lang Anfragen verarbeitet werden, bevor die Instanz automatisch beendet wird.
|
An die Instanzen wird von App Engine automatisch eine Startanfrage in Form einer leeren GET-Anfrage an /_ah/start gesendet. Wie bei der einfachen Skalierung kann eine Instanz, die manuell beendet wird, 30 Sekunden lang noch Anfragen verarbeiten, bevor sie zwangsweise beendet wird.
|
Instanzadressierung | Instanzen sind anonym. |
Die Instanz „i“ der Version „v“ des Dienstes „s“ kann unter der folgenden URL adressiert werden:
https://i-dot-v-dot-s-dot-app_id.REGION_ID.r.appspot.com .
Wurde für eine benutzerdefinierte Domain eine Platzhalterzuordnung für Subdomains eingerichtet, kann auch ein Dienst oder eine seiner Instanzen über eine URL im Format https://s.domain.com oder https://i.s.domain.com adressiert werden.
Der Status jeder Instanz wird sicher im Cache gespeichert und kann in nachfolgenden Anfragen abgerufen werden.
|
Wie bei der einfachen Skalierung. |
Skalieren |
Die Anzahl der Instanzen wird von App Engine je nach Verarbeitungsvolumen automatisch skaliert. Bei der Skalierung werden die Einstellungen für automatic_scaling berücksichtigt, die pro Version in der Konfigurationsdatei bereitgestellt werden.
|
Für einen Dienst mit einfacher Skalierung wird die maximale Anzahl der Instanzen mit dem Parameter max_instances der Einstellung basic_scaling festgelegt. Die Anzahl der aktiven Instanzen skaliert mit dem Verarbeitungsvolumen.
|
Die Anzahl der Instanzen für eine Version wird in der entsprechenden Konfigurationsdatei des Dienstes festgelegt. Die Anzahl der Instanzen entspricht in der Regel der Größe eines im Speicher verbliebenen Datasets oder dem gewünschten Durchsatz für Offline-Arbeiten. |
Dynamische Instanzen skalieren
App Engine-Anwendungen mit einfacher Skalierung oder mit Autoscaling können je nach Umfang der eingehenden Anfragen mit einer beliebigen Anzahl dynamischer Instanzen zum jeweiligen Zeitpunkt ausgeführt werden. Steigt die Anzahl der Anfragen für Ihre Anwendung, wird bei Bedarf auch die Anzahl der dynamischen Instanzen erhöht.
Anwendungen mit einfacher Skalierung
Wenn Sie die einfache Skalierung verwenden, versucht App Engine, Ihre Kosten niedrig zu halten, wenn das Volumen eingehender Anfragen zunimmt, auch wenn dies eventuell zu einer höheren Latenz führt.
Wenn keine der vorhandenen Instanzen zum Bearbeiten einer eingehenden Anfrage verfügbar ist, startet App Engine eine neue Instanz. Auch nach dem Start einer neuen Instanz müssen möglicherweise noch einige Anfragen in der Warteschlange platziert werden, bis die neue Instanz den Startvorgang abgeschlossen hat. Wenn die geringstmögliche Latenz erforderlich ist, prüfen Sie die Verwendung des Autoscaling, mit dem präventiv neue Instanzen erstellt werden, um die Latenz zu minimieren.
Anwendungen mit Autoscaling
Wenn Sie das Autoscaling verwenden, hat jede Instanz in Ihrer Anwendung eine eigene Warteschlange für eingehende Anfragen. Bevor die Warteschlangen zu groß werden und die Latenz Ihrer Anwendung merklich erhöhen, erstellt App Engine automatisch eine oder mehrere neue Instanzen, um die zunehmende Arbeitslast zu bewältigen.
Sie können die Einstellungen für das Autoscaling so konfigurieren, dass eine Balance zwischen der gewünschten Leistung und den anfallenden Kosten hergestellt wird. In der folgenden Tabelle werden diese Einstellungen beschrieben.
Einstellungen für Autoscaling | Beschreibung |
---|---|
CPU-Zielauslastung | Legt den Schwellenwert für die CPU-Auslastung fest. Wenn die CPU-Nutzung diesen Schwellenwert überschreitet, werden mehr Instanzen zur Verarbeitung des Traffics gestartet. |
Zieldurchsatz – Auslastung | Legt den Durchsatz-Schwellenwert für die Anzahl von gleichzeitigen Anfragen fest, ab dem mehr Instanzen zur Verarbeitung des Traffics gestartet werden. |
Maximale Anzahl gleichzeitiger Abfragen | Legt die maximale Anzahl gleichzeitiger Anfragen fest, die eine Instanz annehmen kann, bevor der Planer eine neue Instanz erzeugt. |
Im Video zu den Planereinstellungen von App Engine sehen Sie die Auswirkungen dieser Einstellungen.
Herunterskalieren
Wenn die Anzahl der Anfragen abnimmt, reduziert App Engine die Anzahl der Instanzen. Die abwärts gerichtete Skalierung trägt dazu bei, dass alle laufenden Instanzen einer Anwendung so effizient und kostengünstig wie möglich genutzt werden.
Wenn eine Anwendung überhaupt nicht verwendet wird, deaktiviert App Engine die zugehörigen dynamischen Instanzen, lädt sie jedoch sofort wieder, sobald sie benötigt werden. Durch das wiederholte Laden der Instanzen können auch Anfragen geladen und die Latenz für Nutzer erhöht werden.
Sie können eine Mindestanzahl von inaktiven Instanzen festlegen. Wenn Sie basierend auf dem Anfrageaufkommen eine geeignete Anzahl von inaktiven Instanzen für Ihre Anwendung festlegen, kann jede Anfrage mit geringer Latenz ausgeführt werden, die nur bei einer ungewöhnlich hohen Anzahl von Anfragen zunimmt.
Autoscaling herunterskalieren
Wenn Ihre Anwendung Autoscaling verwendet, müssen inaktive Instanzen etwa 15 Minuten inaktiv sein, bevor sie heruntergefahren werden. Damit eine oder mehrere inaktive Instanzen weiter ausgeführt werden, setzen Sie den Wert von min_idle_instances
auf 1
oder höher.
Skalierung und Anfragen in Batches
Wenn Sie Anfragen in Batches an Ihre Dienste senden, z. B. zur Verarbeitung an eine Aufgabenwarteschlange, wird sofort eine große Anzahl an Instanzen erstellt. Zur Steuerung dieses Vorgangs sollten Sie die Rate der pro Sekunde gesendeten Anfragen möglichst begrenzen. Wenn Sie beispielsweise Google Tasks verwenden, können Sie die Rate steuern, mit der Aufgaben per Push übertragen werden.
Lebenszyklus von Instanzen
Instanzstatus
Die Instanz eines automatisch skalierten Dienstes wird immer ausgeführt. Die Instanz eines manuellen oder einfachen skalierten Dienstes dagegen kann auch gestoppt werden. Alle Instanzen eines Dienstes und einer Version haben denselben Status. Sie können den Status der Instanzen durch Verwaltung der Versionen ändern. Sie können:
- Die Seite „Versionen” in der Google Cloud Console verwenden.
- Verwenden Sie die Befehle
gcloud app versions start
undgcloud app versions stop
. - Sie können den Dienst „Module“ verwenden.
Starten
Jede Dienstinstanz wird als Reaktion auf eine Startanfrage erstellt. Dies ist eine leere HTTP-GET
-Anfrage an /_ah/start
. Diese Anfrage wird von App Engine gesendet, um eine Instanz anzulegen. Nutzer können keine Anfrage an /_ah/start
senden. Instanzen mit manueller und einfacher Skalierung müssen erst auf die Startanfrage antworten, bevor sie eine weitere Anfrage verarbeiten können. Die Startanfrage kann auf zweifache Weise verwendet werden:
- Zum Starten eines für unbestimmte Zeit ausgeführten Programms, ohne dass weitere Anfragen akzeptiert werden
- Zum Initialisieren einer Instanz, bevor weiterer Traffic eingeht
Manuelle, einfache und automatische Skalierungsinstanzen werden unterschiedlich gestartet. Wenn Sie eine Instanz mit manueller Skalierung starten, sendet App Engine sofort eine /_ah/start
-Anfrage an jede Instanz. Wenn Sie die Instanz eines Dienstes mit einfacher Skalierung starten, lässt App Engine Traffic zur Instanz zu. Die /_ah/start
-Anfrage wird aber erst dann an die Instanz gesendet, wenn diese ihre erste Nutzeranfrage erhält. Mehrere Instanzen mit einfacher Skalierung werden nur bei Bedarf gestartet, um zusätzlichen Traffic zu verarbeiten. Instanzen mit Autoscaling erhalten keine /_ah/start
-Anfrage.
Wenn eine Instanz auf die /_ah/start
-Anfrage mit dem HTTP-Statuscode 200–299
oder 404
antwortet, wird davon ausgegangen, dass sie erfolgreich gestartet wurde und zusätzliche Anfragen verarbeiten kann. Andernfalls beendet App Engine die Instanz. Manuelle Skalierungsinstanzen werden sofort neu gestartet, während einfache Skalierungsinstanzen erst dann neu gestartet werden, wenn sie zum Verarbeiten von Traffic benötigt werden.
Herunterfahren
Das Herunterfahren kann durch die folgenden geplanten und ungeplanten Ereignisse ausgelöst werden:
- Es gibt zu viele Instanzen und nicht genügend Anwendungsanfragen (Traffic).
- Sie beenden eine Instanz manuell.
- Sie stellen eine aktualisierte Version des Dienstes bereit.
- Die Instanz überschreitet den maximalen Arbeitsspeicher für die konfigurierte
instance_class
. - Ihre Anwendung hat das Kontingent von Instanzstunden verbraucht.
- Ihre Instanz wird auf eine andere Maschine verschoben, entweder weil die aktuelle Maschine, auf der die Instanz ausgeführt wird, neu gestartet wird oder weil App Engine die Instanz zur Verbesserung der Lastverteilung verschoben hat.
Einer der Vorteile der Plattform "Nur zahlen, was Sie tatsächlich benötigen" der App Engine-Standardumgebung, wie oben unter Herunterskalieren beschrieben, besteht darin, dass das System die Anzahl der Instanzen automatisch auf null herunterskaliert, wenn kein Traffic vorhanden ist. Dies trägt dazu bei, dass App Engine eine kostengünstige Lösung für kleine Anwendungen darstellt, die keine kontinuierlichen Anfragen erhalten. Wenn eine Instanz heruntergefahren werden muss, werden neu eingehende Anfragen an andere Instanzen weitergeleitet (falls vorhanden) und Anfragen, die aktuell verarbeitet werden, haben Zeit, zum Ende zu kommen.
Wenn eine Instanz heruntergefahren werden muss, sendet App Engine das SignalKILL
(SIGKILL
), das die Instanz beendet.
Ladeanfragen
Wenn App Engine eine neue Instanz für die Anwendung erstellt, muss die Instanz zuerst alle für die Verarbeitung der Anfrage erforderlichen Bibliotheken und Ressourcen laden. Dies geschieht während der ersten Anfrage an die Instanz, die als Ladeanfrage bezeichnet wird. Da die Anwendung während einer Ladeanfrage initialisiert wird, dauert die Anfrage länger.
Hier ein paar Tipps, um die Dauer von Ladeanfragen zu verkürzen:
- Laden Sie nur den für den Start benötigten Code.
- Greifen Sie so wenig wie möglich auf das Laufwerk zu.
- Oft kann Code schneller aus einer ZIP- oder JAR-Datei als aus vielen einzelnen Dateien geladen werden.
Aufwärmanfragen
Aufwärmanfragen sind ein spezieller Typ von Ladeanfragen. Sie laden Anwendungscode in eine Instanz, bevor Liveanfragen durchgeführt werden.
Instanzen mit manueller oder einfacher Skalierung erhalten keine /_ah/warmup
-Anfrage.
Instanzlaufzeit
App Engine versucht, Instanzen mit manueller und einfacher Skalierung auf unbegrenzte Zeit auszuführen. Derzeit kann die Betriebszeit von Instanzen mit manueller und einfacher Skalierung jedoch nicht garantiert werden. Hardware- und Softwarefehler, die zur vorzeitigen Beendigung oder zu wiederholten Neustarts führen, können ohne Vorwarnung auftreten und oft nur mit erheblichem Zeitaufwand behoben werden. Daher sollten Sie Ihre Anwendung so konfigurieren, dass diese Fehler toleriert werden.
Hier sind einige Vorgehensweisen, um Ausfallzeiten durch Instanzneustarts zu vermeiden:
- Beschleunigen Sie den Neustart vorhandener Instanzen bzw. den Start neuer Instanzen.
- Erstellen Sie bei lang laufenden Berechnungen regelmäßig Prüfpunkte, damit Sie den Vorgang beim jeweiligen Status fortsetzen können.
- Ihre Anwendung sollte "zustandslos" sein. Es darf also nichts auf der Instanz gespeichert werden.
- Führen Sie Aufgaben mithilfe von Warteschlangen asynchron aus.
- Wenn Sie Ihre Instanzen für manuelle Skalierung konfigurieren:
- Verwenden Sie ein Load-Balancing-Modul für mehrere Instanzen.
- Konfigurieren Sie mehr Instanzen, als für die Verarbeitung des normalen Traffics erforderlich sind.
- Schreiben Sie eine Fallback-Logik, die im Cache gespeicherte Ergebnisse verwendet, wenn keine manuelle Skalierungsinstanz verfügbar ist.
NTP mit App Engine-Standardumgebung
Die App Engine-Standardumgebung hat NTP-Dienste (Network Time Protocol), die Google NTP-Server verwenden. Der NTP-Dienst kann jedoch nicht bearbeitet werden.