Batch-Anfrageverarbeitung mit API Gateway
April 27, 2023
Batch request processing ist eine leistungsstarke Technik in der Webentwicklung, die verwendet wird, um die Leistung von APIs zu verbessern. Sie ermöglicht es Entwicklern, mehrere API-Anfragen in einen einzigen HTTP-Anfrage/Antwort-Zyklus zu gruppieren. Mit anderen Worten: Eine einzelne API-Anfrage eines Clients kann in mehrere API-Anfragen an eine Reihe von Backend-Servern umgewandelt werden, und die Antworten werden aggregiert und als eine einzige Antwort an den Client zurückgegeben. Dies kann die Anzahl der Roundtrips zwischen Client und Server erheblich reduzieren.
In diesem Artikel werden wir untersuchen, wie man Batch-Anfrageverarbeitung in Apache APISIX implementiert, und einige Anwendungsfälle betrachten, in denen dies vorteilhaft sein kann.
Es ähnelt dem API Composition-Muster, das häufig in der Microservices-Architektur angewendet wird.
Warum Batch-Anfrageverarbeitung verwenden?
Wenn ein Client mehrere API-Anfragen an einen Server sendet, erfordert jede Anfrage einen separaten HTTP-Anfrage/Antwort-Zyklus. Dies kann zu erhöhter Latenz, reduzierter Leistung und erhöhter Serverlast führen. Durch die Gruppierung mehrerer Anfragen in eine einzige Batch-Anfrage kann die Anzahl der HTTP-Anfrage/Antwort-Zyklen reduziert werden, was zu einer verbesserten Leistung und geringerer Latenz führt.
Batch-Anfrageverarbeitung kann besonders nützlich sein in Szenarien, in denen Sie mehrere Datensätze in einer einzigen Transaktion abrufen oder aktualisieren müssen, wie z.B.:
- Abrufen mehrerer Datensätze aus einer Datenbank
- Aktualisieren mehrerer Datensätze in einer Datenbank
- Ausführen mehrerer API-Anfragen, um eine Aufgabe abzuschließen
Praxisbeispiele für Batch-Anfrageverarbeitung
Beispiel 1:
Angenommen, Sie haben eine Social-Media-Anwendung, die den Feed eines Benutzers anzeigt, der Beiträge von seinen Freunden und Seiten, denen er folgt, enthält. Um diesen Feed zu füllen, müssen Sie mehrere API-Anfragen durchführen, um die erforderlichen Daten abzurufen, wie z.B.:
- Abrufen einer Liste der Freunde des Benutzers und der Seiten, denen er folgt.
- Für jeden Freund oder jede Seite die neuesten Beiträge abrufen.
In einem traditionellen Ansatz würden Sie jede dieser API-Anfragen separat durchführen. Zuerst rufen Sie eine Liste der Freunde des Benutzers ab, und in der zweiten Anfrage holen Sie die neuesten Beiträge für jeden Freund des Benutzers. Dies kann zu erhöhter Latenz führen, insbesondere wenn der Benutzer viele Freunde hat und vielen Seiten folgt.
Beispiel 2:
Ein weiteres Beispiel: Sie haben eine mobile Anwendung, die eine Liste von Produkten anzeigt, die Benutzer durchstöbern können. Um diese Liste zu füllen, müssen Sie mehrere API-Anfragen durchführen, um Produktdaten von einem entfernten Server abzurufen, wie z.B.:
- Abrufen einer Liste von Produkt-IDs.
- Für jede Produkt-ID die Produktdetails (Name, Beschreibung, Bild usw.) abrufen.
Beispiel 3:
Stellen Sie sich vor, Sie haben eine Webanwendung zur Konferenzverwaltung, in der es mehrere Sprecher im System gibt, und Sie möchten die Sitzungen und verwandten Themen eines Sprechers auf einer einzigen Webseite anzeigen. Ein Backend-Conference API-Service hat zwei verschiedene Endpunkte /speaker/{speakerId}/sessions
und /speaker/{speakerId}/topics
, um diese Informationen bereitzustellen. Um sowohl die Sitzungen als auch die Themen eines einzelnen Sprechers anzuzeigen, können Sie zwei Anfragen von der Frontend-App senden, was keine ideale Lösung ist. Stattdessen können Sie ein API Gateway verwenden, um alle diese Anfragen in eine einzige HTTP-Anfrage zu gruppieren, wie im nächsten Abschnitt erklärt wird.
Batch-Anfrageverarbeitung mit Apache APISIX API Gateway
Um Batch-Anfrageverarbeitung in APISIX zu implementieren, können Sie das batch-requests-Plugin verwenden. Dieses Plugin ermöglicht es Ihnen, eine Reihe von API-Anfragen in einer einzigen HTTP POST
-Anfrage-Nutzlast zu definieren. Jede Anfrage kann ihre eigene HTTP-Methode, URL-Pfad, Header und Nutzlast haben. Siehe unten ein Beispiel für einen curl-Befehl für Beispiel 3 (Conference API-Anfragen):
curl -i http://{API_GATEWAY_HOST_ADDRESS}/speaker -X POST -d \
'{
"pipeline": [
{
"method": "GET",
"path": "/speaker/1/topics"
},
{
"method": "GET",
"path": "/speaker/1/sessions"
}
]
}'
Wenn eine Batch-Anfrage von APISIX empfangen wird, wird das batch-requests-Plugin die Nutzlast parsen und jede Anfrage in der Batch parallel ausführen. Das Plugin aggregiert auch die Antworten jeder Anfrage und gibt sie in einer einzigen HTTP-Antwort an den Client zurück. Siehe den nächsten Demo-Abschnitt, um Schritt für Schritt zu erfahren, wie dies erreicht werden kann.
Demo des Batch-Requests-Plugins
Bevor Sie das batch-requests-Plugin verwenden können, müssen Sie Apache APISIX installieren.
Voraussetzungen
- Docker wird verwendet, um den containerisierten etcd und APISIX zu installieren.
- curl wird verwendet, um Anfragen an die APISIX Admin API zu senden. Sie können auch einfache Tools wie Postman verwenden, um mit der API zu interagieren.
APISIX kann einfach mit dem folgenden Quickstart-Skript installiert und gestartet werden:
curl -sL <https://run.api7.ai/apisix/quickstart> | sh
Konfigurieren des Backend-Service (Upstream)
Sie müssen den Backend-Service für die Conference API konfigurieren, an den Sie Anfragen weiterleiten möchten. Dies kann durch Hinzufügen eines Upstream-Servers in Apache APISIX über die Admin API erfolgen.
curl http://127.0.0.1:9180/apisix/admin/upstreams/1 -X PUT -d '
{
"name": "Conferences API upstream",
"desc": "Register Conferences API as the upstream",
"type": "roundrobin",
"scheme": "https",
"nodes": {
"conferenceapi.azurewebsites.net:443": 1
}
}'
Erstellen einer Route für die Batch-Verarbeitungs-API
Wir müssen eine neue Route erstellen, die Anfragen an /speaker
abfängt und einen öffentlichen virtuellen Endpunkt für die Batch-Verarbeitung mit dem [public-api](https://apisix.apache.org/docs/apisix/plugins/public-api/)
-Plugin bereitstellt.
curl http://127.0.0.1:9180/apisix/admin/routes/a -X PUT -d '
{
"uri": "/speaker",
"plugins": {
"public-api": {
"uri": "/apisix/batch-requests"
}
}
}'
Erstellen einer Route für die Endpunkte der Themen und Sitzungen des Sprechers
Als Nächstes erstellen wir eine weitere Route für die Endpunkte der Themen und Sitzungen des Sprechers (/speaker/*/topics
und /speaker/*/topics
), sodass einzelne Anfragen, die vom API Gateway aus Batch-Anfragen extrahiert werden, um die Themen oder Sitzungen des Sprechers abzurufen, an die verantwortlichen Conference API-Endpunkte weitergeleitet werden, und wir verweisen auf den vorhandenen Upstream-Service.
curl http://127.0.0.1:9180/apisix/admin/routes/b -X PUT -d '
{
"methods": ["GET"],
"uris": ["/speaker/*/topics","/speaker/*/sessions"],
"plugins": {
"proxy-rewrite":{
"host":"conferenceapi.azurewebsites.net"
}
},
"upstream_id":"1"
}'
Sie werden feststellen, dass wir ein weiteres proxy-rewrite-Plugin verwenden und implizit die Host-Adresse für die Conference API angeben. Andernfalls könnte das API Gateway eine DNS-Umwandlung durchführen und die Conference API über ihre IP-Adresse anfragen.
Testen der Batch-Anfrageverarbeitung
Hier ist ein Beispiel, wie das batch-requests-Plugin in APISIX verwendet werden kann:
curl -i http://127.0.0.1:9080/speaker -X POST -d \
'{
"pipeline": [
{
"method": "GET",
"path": "/speaker/1/topics"
},
{
"method": "GET",
"path": "/speaker/1/sessions"
}
]
}'
In diesem Beispiel ist die Route für den /speaker
-Endpunkt definiert, der Batch-Anfrageverarbeitung über das batch-requests-Plugin unterstützt. Das Plugin ist mit einer Reihe von zwei Anfragen konfiguriert, die jeweils einen Sprecherdatensatz nach ID mit Themen und Sitzungen abrufen. Wenn Sie diesen Befehl ausführen, erhalten Sie eine zusammengeführte Antwort vom API Gateway zurück:
[
{
"body":"{\r\n \"collection\": {\r\n \"version\": \"1.0\",\r\n \"links\": [],\r\n \"items\": [\r\n {\r\n \"href\": \"https://conferenceapi.azurewebsites.net/topic/8\",\r\n \"data\": [\r\n {\r\n \"name\": \"Title\",\r\n \"value\": \"Microsoft\"\r\n }\r\n ],\r\n \"links\": [\r\n {\r\n \"rel\": \"http://tavis.net/rels/sessions\",\r\n \"href\": \"https://conferenceapi.azurewebsites.net/topic/8/sessions\"\r\n }\r\n ]\r\n },\r\n {\r\n \"href\": \"https://conferenceapi.azurewebsites.net/topic/10\",\r\n \"data\": [\r\n {\r\n \"name\": \"Title\",\r\n \"value\": \"Mobile\"\r\n }\r\n ],\r\n \"links\": [\r\n {\r\n \"rel\": \"http://tavis.net/rels/sessions\",\r\n \"href\": \"https://conferenceapi.azurewebsites.net/topic/10/sessions\"\r\n }\r\n ]\r\n }\r\n ],\r\n \"queries\": [],\r\n \"template\": {\r\n \"data\": []\r\n }\r\n }\r\n}",
"status":200,
"headers":{
"Expires":"-1",
"Connection":"keep-alive",
"Pragma":"no-cache",
"Content-Length":"953",
"Server":"APISIX/3.2.0",
"Content-Type":"application/vnd.collection+json",
"X-AspNet-Version":"4.0.30319",
"Cache-Control":"no-cache",
"X-Powered-By":"ASP.NET"
},
"reason":"OK"
},
{
"body":"{\r\n \"collection\": {\r\n \"version\": \"1.0\",\r\n \"links\": [],\r\n \"items\": [\r\n {\r\n \"href\": \"https://conferenceapi.azurewebsites.net/session/206\",\r\n \"data\": [\r\n {\r\n \"name\": \"Title\",\r\n \"value\": \"\\r\\n\\t\\t\\tjQuery Mobile and ASP.NET MVC\\r\\n\\t\\t\"\r\n },\r\n {\r\n \"name\": \"Timeslot\",\r\n \"value\": \"05 December 2013 09:00 - 10:00\"\r\n },\r\n {\r\n \"name\": \"Speaker\",\r\n \"value\": \"Scott Allen\"\r\n }\r\n ],\r\n \"links\": [\r\n {\r\n \"rel\": \"http://tavis.net/rels/speaker\",\r\n \"href\": \"https://conferenceapi.azurewebsites.net/speaker/16\"\r\n },\r\n {\r\n \"rel\": \"http://tavis.net/rels/topics\",\r\n \"href\": \"https://conferenceapi.azurewebsites.net/session/206/topics\"\r\n }\r\n ]\r\n }\r\n ],\r\n \"queries\": [],\r\n \"template\": {\r\n \"data\": []\r\n }\r\n }\r\n}",
"status":200,
"headers":{
"Expires":"-1",
"Connection":"keep-alive",
"Pragma":"no-cache",
"Content-Length":"961",
"Server":"APISIX/3.2.0",
"Content-Type":"application/vnd.collection+json",
"X-AspNet-Version":"4.0.30319",
"Cache-Control":"no-cache",
"X-Powered-By":"ASP.NET"
},
"reason":"OK"
}
]
Die maximale Größe einer Batch-Anfrage ist durch das API Gateway begrenzt. Sie können die API Gateway-Dokumentation für die aktuellen Grenzwerte und die Konfiguration des Anfrage-Timeouts überprüfen.
Fazit
- Batch-Anfrageverarbeitung mit API Gateway kann eine nützliche Technik sein, um die Leistung Ihrer API zu verbessern.
- Apache APISIX bietet ein Plugin namens
batch-requests
, das Entwicklern die einfache Implementierung von Batch-Anfrageverarbeitung ermöglicht.
Nächste Schritte
Mit API Gateway ist es auch möglich, eine benutzerdefinierte Aggregation der Antwortdaten für Ihre Benutzer bereitzustellen. Sie können das serverless-function-Plugin verwenden, um benutzerdefinierten Code auszuführen und die Antworten von Backend-Services zu kombinieren und sie in einer anderen Struktur an den API-Konsumenten zurückzugeben.