Instanzverwaltung

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 app.yaml 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.
Die folgende Tabelle vergleicht die Leistungsmerkmale der drei Skalierungstypen:

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):

  • Das Zeitlimit für Aufgaben in Aufgabenwarteschlangen und Anfragen von Cronjobs beträgt 10 Minuten.
  • Das Zeitlimit für andere HTTP-Anfragen beträgt 1 Minute.
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 /_ah/start zur Ausführung eines Programms oder Skripts verwenden, ohne einen HTTP-Antwortcode zurückzugeben.

Wie bei der einfachen Skalierung.
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. Wenn ein /_ah/stop-Handler vorhanden ist, hat er vor dem Herunterfahren 30 Sekunden Zeit 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:

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.

App Engine sendet normalerweise das Signal STOP (SIGTERM) an den Anwendungscontainer. Die Anwendung muss nicht auf dieses Ereignis reagieren, kann dies aber nutzen, um alle erforderlichen Bereinigungsaktionen auszuführen, bevor der Container heruntergefahren wird. Unter normalen Bedingungen wartet das System bis zu 3 Sekunden, bis die Anwendung beendet wird, und sendet dann das Signal KILL (SIGKILL). Wenn die Anwendung das Signal SIGTERM nicht erfasst, wird die Instanz sofort heruntergefahren.

Möglicherweise werden einige Logeinträge zum Herunterfahren der Instanz angezeigt, dazu gehören:

[start] Quitting on terminated signal
[INFO] Handling signal: term
[INFO] Worker exiting (pid: 21)
[INFO] Worker exiting (pid: 24)
[INFO] Shutting down: Master
[start] Start program failed: termination triggered by nginx exit

Diese Logmeldungen geben keine Fehlerbedingung an, sind aber Hinweise auf den normalen Prozess zum Herunterfahren der Instanz. Beachten Sie, dass sich [start] und Start in den Logs auf einen Plattformprozess mit dem Namen start beziehen und nichts mit dem Starten einer Instanz oder einer Anwendung zu tun haben.

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.

Weitere Informationen zum Verwenden von Aufwärmanfragen finden Sie unter Aufwärmanfragen konfigurieren.

Instanzlaufzeit

App Engine versucht, Instanzen mit manueller und einfacher Skalierung auf unbegrenzte Zeit auszuführen. Derzeit kann die Betriebszeit manueller und einfacher Skalierungsinstanzen jedoch nicht sichergestellt werden.

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.