Vermeiden Sie Latenz bei der Abfrage von Aktivitätsaufgaben - AWS Step Functions

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Vermeiden Sie Latenz bei der Abfrage von Aktivitätsaufgaben

Die GetActivityTask-API ist so konzipiert, dass sie ein taskToken einmalig unterstützt. Wenn ein taskToken während der Kommunikation mit einem Aktivitäts-Worker verloren geht, können mehrere GetActivityTask-Anfragen für 60 Sekunden blockiert werden, die auf eine Antwort warten, bis ein Timeout für GetActivityTask stattfindet.

Wenn Sie nur eine kleine Anzahl von Abrufen haben, die auf eine Antwort warten, ist es möglich, dass alle Anforderungen hinter der blockierten Anforderung auflaufen und anhalten. Wenn Sie jedoch eine große Anzahl ausstehender Umfragen für jede Aktivität haben (Amazon Resource Name, ARN), und ein Teil Ihrer Anfragen in der Warteschleife stecken bleibt, können noch viele weitere Anfragen erhalten taskToken und mit der Bearbeitung beginnen.

Für Produktionssysteme empfehlen wir mindestens 100 offene Abrufe pro Aktivitäts-ARN zu jedem Zeitpunkt. Wenn ein Abruf blockiert wird, und einen Teil dieser Abrufe dahinter auflaufen, gibt es nach wie vor viele weitere Anfragen, die ein taskToken erhalten, um weiterzuarbeiten, während die GetActivityTask-Anfrage blockiert ist.

So vermeiden Sie diese Art von Latenzproblemen beim Abrufen von Aufgaben

  • Implementieren Sie Ihre Poller als separate Threads aus der Arbeit in Ihrer Aktivitäts-Worker-Implementierung.

  • Verwenden Sie mindestens 100 offene Abrufe pro Aktivitäts-ARN zu jedem Zeitpunkt.

    Anmerkung

    Eine Skalierung auf 100 offene Abrufe pro ARN kann kostspielig sein. Beispielsweise ist das Abfragen von 100 Lambda-Funktionen pro ARN 100-mal teurer als eine einzelne Lambda-Funktion mit 100 Abfrage-Threads. Um sowohl die Latenz zu reduzieren als auch die Kosten zu minimieren, verwenden Sie eine Sprache mit asynchronem E/A und implementieren pro Worker mehrere Abfrage-Threads. Ein Beispiel für einen Aktivitäts-Worker, in dem die Poller-Threads unabhängig von der Arbeitsthreads sind, finden Sie unter Beispiel für einen Aktivitäts-Worker in Ruby.

Weitere Informationen zu Aktivitäten und Aktivitäts-Workern finden Sie unter Aktivitäten.