10 gängige API-Resilienz-Designmuster mit API Gateway

Bobur Umurzokov

Bobur Umurzokov

November 1, 2023

Technology

API-Resilienz bezieht sich auf den Aufbau robuster APIs, die verschiedenen Herausforderungen standhalten und sicherstellen, dass sie weiterhin effektiv funktionieren. API-Gateways spielen dabei eine Schlüsselrolle, da sie als Einstiegspunkt für externe Anfragen fungieren und die Kommunikation zwischen verschiedenen Diensten verwalten, indem sie gängige API-Resilienz-Muster berücksichtigen. Eines der beliebtesten Open-Source-API-Gateways, Apache APISIX, bietet eine Vielzahl von Funktionen, um die Resilienz und Robustheit von APIs zu verbessern. In diesem Artikel werden wir 10 gängige API-Resilienz-Designmuster untersuchen und wie sie mit APISIX implementiert werden können.

Hier ist eine Liste aller 10 API-Resilienz-Muster:

  1. Rate Limiting.
  2. Retry.
  3. Timeout.
  4. Fallback.
  5. Cache.
  6. Redundanz.
  7. Health Checks.
  8. Circuit Breaker.
  9. Bulkhead.
  10. Fault Injection.

Was ist API-Resilienz?

API-Resilienz bezieht sich auf die Fähigkeit einer API, ihre vorgesehenen Funktionen konsistent und zuverlässig auszuführen, selbst bei Fehlern, hohem Datenverkehr oder unerwarteten Bedingungen. Es geht nicht darum, Ausfälle zu vermeiden, sondern darum, die Tatsache zu akzeptieren, dass Ausfälle passieren werden, und darauf so zu reagieren, dass Ausfallzeiten oder Datenverluste vermieden werden. Das Ziel der Resilienz ist es, die Anwendung nach einem Ausfall wieder in einen voll funktionsfähigen Zustand zu versetzen. Resiliente APIs sind so konzipiert, dass sie Ausfälle elegant handhaben können, unabhängig davon, ob diese Ausfälle innerhalb der API selbst, von abhängigen Diensten oder aufgrund externer Faktoren wie Netzwerkprobleme oder Latenz, API-Versionen-Inkompatibilität und anderen Problemen, die aufgrund von Änderungen in der Umgebung oder unerwartetem Benutzerverhalten auftreten können, stammen.

Warum API-Resilienz auf der Ebene des API-Gateways?

Viele bestehende Softwareentwicklungsframeworks umfassen eine Reihe von Praktiken und Mustern, die sicherstellen sollen, dass APIs verfügbar, reaktionsschnell und genau bleiben. Die Implementierung von API-Resilienz auf der Ebene des API-Gateways, anstatt in einzelnen Diensten oder anderswo im System, bietet jedoch mehrere strategische Vorteile.

1. Zentralisierte Kontrolle: Das API-Gateway dient als zentraler Einstiegspunkt für alle API-Anfragen und bietet eine einzigartige Möglichkeit, Resilienz-Muster einheitlich über alle Dienste hinweg zu verwalten und durchzusetzen. Diese Zentralisierung vereinfacht die Implementierung und Wartung von Resilienz-Funktionen.

2. Konsistenz: Durch die Handhabung von Resilienz auf der Ebene des API-Gateways wird sichergestellt, dass ein konsistenter Ansatz zur Behandlung von Ausfällen, Rate Limiting, Timeouts und anderen Resilienz-Strategien über alle Dienste hinweg gewährleistet ist. Diese Konsistenz ist entscheidend, um ein zuverlässiges und vorhersehbares Systemverhalten aufrechtzuerhalten.

3. Reduzierte Komplexität: Die Implementierung von Resilienz-Funktionen in jedem Microservice kann zu doppelter Arbeit und erhöhter Komplexität führen. Das API-Gateway abstrahiert diese Anliegen, sodass sich Dienstentwickler auf die Geschäftslogik konzentrieren können, anstatt auf die Handhabung von Resilienz.

4. Verbesserte Ressourcennutzung: Das API-Gateway kann Ressourcen effizient verwalten und den Datenverkehr verteilen, sodass kein einzelner Dienst überlastet wird. Dieser Lastenausgleich trägt zur Gesamtresilienz des Systems bei.

5. Einfacheres Monitoring und Logging: Ein zentraler Punkt, durch den der gesamte API-Datenverkehr fließt, erleichtert die Überwachung der Gesundheit Ihrer Dienste und die Protokollierung von Problemen. Diese zentralisierte Sicht ist unschätzbar, um Probleme schnell zu identifizieren und darauf zu reagieren.

6. Vereinfachte Sicherheit: Sicherheitsmaßnahmen wie Authentifizierung, Autorisierung und Verschlüsselung können konsistent auf der Ebene des API-Gateways angewendet werden, sodass alle Dienste geschützt sind, ohne dass redundante Konfigurationen erforderlich sind.

7. Verbesserte Leistung: Das API-Gateway kann Caching und Antwortaggregation implementieren, wodurch die Anzahl der Aufrufe an Backend-Dienste reduziert und die Gesamtleistung des Systems verbessert wird.

8. Graceful Degradation: Im Falle eines Dienstausfalls kann das API-Gateway den Datenverkehr umleiten oder Fallback-Antworten bereitstellen, sodass das System elegant degradiert und weiterhin Funktionalität bietet.

9. Schnellere Wiederherstellung: Die zentralisierte Natur des API-Gateways ermöglicht eine schnellere Implementierung von Korrekturen und Updates, sodass das System nach einem Ausfall schnell wieder voll funktionsfähig gemacht werden kann.

10. Vereinfachte Client-Interaktion: Clients müssen nur mit dem API-Gateway interagieren, das eine konsistente und zuverlässige Schnittstelle bietet und die Komplexität der zugrunde liegenden Microservices abstrahiert.

Aus Entwicklersicht reduziert der API-Gateway-Ansatz auch die Zeit, die für die Implementierung häufig verwendeter Resilienz-Muster benötigt wird. Lassen Sie uns jedes Muster am Beispiel der API-Kommunikation zwischen Diensten in einer typischen Konferenz-App entdecken und verstehen, wie sie aktiviert werden können.

Dieser Beitrag konzentriert sich hauptsächlich auf den theoretischen Teil und bietet Referenzen zur relevanten Dokumentation. Entwickler können diese Muster implementieren, indem sie jeden Link überprüfen und die bereitgestellten Anleitungen durchgehen. Mit APISIX ist es möglich, diese Designmuster über die Admin API, eine statische YAML-Datei oder das APISIX Dashboard zu konfigurieren.

1. Rate Limiting

Wie der Name schon sagt, kontrolliert Rate Limiting die Anzahl der Anfragen, die ein Client in einem bestimmten Zeitraum stellen kann. APISIX bietet ein limit-req Plugin zur Konfiguration von Rate Limiting. Dieses Plugin ermöglicht es Ihnen, Regeln basierend auf den Eigenschaften einzelner Anfragen (zu viele von einem bestimmten Benutzer, einer Client-Anwendung oder einem Standort) für die Begrenzung von Anfragen zu definieren, um sicherzustellen, dass Ihre API nicht von zu vielen Anfragen überlastet wird.

Implementierung von resilienten Anwendungen Rate Limiting

Die Rate-Limiting-Richtlinie kann auch verwendet werden, um den Zugriff für nicht autorisierte Benutzer zu beschränken. Überprüfen Sie die Anleitung, um zu sehen, wie das Plugin verwendet wird für Rate Limiting.

2. Retry

Das Retry-Muster beinhaltet das automatische Wiederholen einer API-Anfrage, wenn sie fehlschlägt. Mit APISIX können Sie den Wiederholungsmechanismus für ein Upstream-Objekt konfigurieren, um die Anzahl der Wiederholungen und die Bedingungen, unter denen eine Wiederholung versucht werden soll, festzulegen.

Implementierung von resilienten Anwendungen Retry

Durch die Konfiguration des Upstreams mit Wiederholungseigenschaften sendet APISIX automatische Wiederholungsanfragen an den Backend-Teilnehmerdienst, wenn die vorherige Anfrage aufgrund eines Timeouts oder eines Netzwerkproblems fehlgeschlagen ist.

3. Timeout

Das Setzen eines Timeouts stellt sicher, dass eine Anfrage nicht unbegrenzt hängen bleibt, wenn der Backend-Dienst nicht reagiert. APISIX ermöglicht es Ihnen, Timeouts für Ihre APIs in der gleichen Upstream-Objekt-Konfiguration festzulegen, sodass Anfragen beendet werden, wenn sie zu lange brauchen, um zu antworten.

Implementierung von resilienten Anwendungen Retry

Falls der Teilnehmerdienst langsam reagiert, kann APISIX ein Fail-Fast-Muster anwenden und schnell auf die Anfrage der Client-App antworten, um die Reaktionsfähigkeit des gesamten Systems zu verbessern.

4. Fallback

Ein Fallback-Muster bietet eine Standardantwort, wenn ein Dienst nicht verfügbar ist. APISIX ermöglicht es Ihnen, die Upstream-Prioritäten zu definieren. Wenn der primäre Endpunkt ausfällt, kann das API-Gateway den Datenverkehr an einen sekundären Dienst umleiten oder eine vordefinierte Antwort mithilfe eines response-rewrite-Plugins im Falle von Dienstausfällen wie HTTP 500 zurückgeben.

Implementierung von resilienten Anwendungen Fallback

Oder Sie verwenden das proxy-cache-Plugin, um Antworten zwischenzuspeichern und sie zu servieren, wenn das Backend ausgefallen ist. Beispielsweise zeigt die mobile App eine zwischengespeicherte Liste der Konferenzteilnehmer an, wenn der Teilnehmerdienst ausgefallen ist.

5. Cache

Das Zwischenspeichern von Antworten kann die Belastung Ihrer Backend-Dienste erheblich reduzieren. APISIX bietet ein proxy-cache-Plugin, das es Ihnen ermöglicht, Antworten zwischenzuspeichern und sie direkt vom API-Gateway aus zu servieren, wodurch die Latenz verringert und die Leistung verbessert wird.

Implementierung von resilienten Anwendungen Cache

Überprüfen Sie das Tutorial Cache API responses, um zu erfahren, wie das proxy-cache-Plugin verwendet wird.

6. Redundanz

Jedes API-Gateway bietet eine gängige Funktion wie Load Balancing, das eingehende API-Anfragen auf mehrere Backend-Dienste (Knoten oder Instanzen) verteilt. Redundante Instanzen machen das System robuster gegen unregelmäßige Ereignisse. APISIX unterstützt verschiedene Algorithmen für den Lastenausgleich, wie Round-Robin, Least Connections und Consistent Hashing.

Implementierung von resilienten Anwendungen Redundanz

Im Fall des Teilnehmerdienstes können Sie zwei Instanzen hochfahren, und wenn Server A ausfällt, können Anfragen vom zweiten Server bedient werden.

7. Health Checks

Health Checking ist ein Mechanismus, der bestimmt, ob Upstream-Dienste basierend auf ihrer Reaktionsfähigkeit gesund oder ungesund sind. APISIX identifiziert, ob der Dienst verfügbar ist oder nicht, indem es upstream active health checks verwendet. Wenn Health Checks aktiviert sind, leitet APISIX Anfragen nur an Upstream-Dienste weiter, die als gesund gelten, und nicht an Dienste, die als ungesund gelten.

Implementierung von resilienten Anwendungen Health Checks

Um die API-Gesundheit regelmäßig zu überprüfen, benötigt APISIX einen HTTP-Pfad des Health-Endpunkts des Upstream-Dienstes. Daher müssen Sie zunächst den /health-Endpunkt für den Teilnehmerdienst hinzufügen.

8. Circuit Breaker

Das Circuit-Breaker-Muster verhindert, dass ein System Aufrufe an einen Dienst tätigt, der wahrscheinlich ausfällt, und schützt so das System vor kaskadierenden Ausfällen. APISIX bietet zwei Optionen zur Implementierung der Circuit-Breaker-Funktionalität: Verwendung eines api-breaker-Plugins in einer Route-Konfiguration oder Aktivierung von upstream passive health checks. Beide Wege handhaben Ausfälle und verhindern, dass Upstream-Dienste ständige Wiederholungsversuche unternehmen, wenn der Dienst ausfällt oder langsam arbeitet.

Implementierung von resilienten Anwendungen Circuit Breaker

APISIX überwacht die Anzahl der kürzlich aufgetretenen Ausfälle und verwendet diese Informationen, um zu entscheiden, ob der Vorgang fortgesetzt werden soll oder sofort eine Ausnahme zurückgegeben wird.

9. Bulkhead

Das Bulkhead-Muster isoliert Elemente innerhalb einer Anwendung, sodass sichergestellt ist, dass ein Teil des Systems bei einem Ausfall oder einer hohen Belastung weiterhin funktioniert. Um sicherzustellen, dass starker Datenverkehr oder Probleme bei Lesevorgängen vom Teilnehmerdienst die Verfügbarkeit und Leistung von Schreibvorgängen zum Teilnehmerdienst nicht beeinträchtigen, können Sie das Bulkhead-Muster mit APISIX implementieren.

Implementierung von resilienten Anwendungen Redundanz

Sie erstellen separate Route-Endpunkte im API-Gateway für zwei Upstream-Knoten, sodass alle Schreibanfragen an Dienst A und alle Leseanfragen an Dienst B weitergeleitet werden.

10. Chaos Testing

Chaos-Tests können sicherstellen, dass eine API in Produktionsumgebungen resilient ist. Mit dieser Methode können Sie die Resilienz Ihrer Anwendung oder Microservices-APIs gegen verschiedene Arten von Ausfällen bewerten und stärken, um die Zuverlässigkeit zu verbessern. Diese Methode ermöglicht die gezielte Einführung von Verzögerungen und das erzwungene Beenden von Anfragen mit festgelegten Fehlercodes, um verschiedene ungünstige Szenarien wie Dienstunterbrechungen, übermäßige Dienstnachfrage, erhebliche Netzwerkverzögerungen und Netzwerksegmentierung zu simulieren.

Implementierung von resilienten Anwendungen Redundanz

Das Fault Injection Plugin von APISIX bietet denselben Mechanismus, um verschiedene Ausfallszenarien zu simulieren, wie Fehler oder Verzögerungen im Teilnehmerdienst, um zu testen, wie die Client-App darauf reagiert.

Fazit

In diesem Blogbeitrag haben wir 10 gängige API-Resilienz-Designmuster überblickt und gezeigt, wie sie effektiv mit APISIX implementiert werden können. Durch die Zentralisierung von Resilienz-Strategien auf der Ebene des API-Gateways können Organisationen eine konsistente, vereinfachte und effiziente Verwaltung des API-Datenverkehrs und der Fehlerbehandlung erreichen.

Verwandte Ressourcen

Tags: