Getty Images/iStockphoto
API-Caching-Verfahren, die alle Entwickler kennen sollten
API-Caching kann die Leistung und Antwortzeit einer Anwendung verbessern, allerdings nur, wenn es richtig umgesetzt wird. Caching-Techniken, die Entwickler kennen sollten.
Bei korrekter Implementierung kann API-Caching die Last einer Anwendung reduzieren und die Reaktionsfähigkeit erhöhen. Ohne ordnungsgemäße Implementierung und Tests können Caching-Probleme jedoch zu unkontrollierbaren Lasten, kaskadierenden Fehlern und schließlich zum Zusammenbruch einer Anwendung führen.
Viele Management-Tools – auch Open Source Tools - lassen sich problemlos in eine Anwendung integrieren, um API-Caching-Prozesse durchzuführen. Mit der richtigen Kombination von Tools und Techniken können Entwicklungs- und Testteams sicherstellen, dass die Zwischenspeicherung ordnungsgemäß funktioniert und die Anwendungsleistung nicht unnötig beeinträchtigt wird.
Was ist API-Caching?
API-Caching ist ein Prozess, bei dem häufig angeforderte Objekte in einem sekundären Datenspeicher abgelegt werden, um ständige Aufrufe an eine primäre Datenbank oder eine andere Art von Datenspeicher zu vermeiden. Der Hauptvorteil eines Cache-Speichers ist die Verarbeitungsgeschwindigkeit, da er es einer Anwendung ermöglicht, häufig angeforderte Objekte aus Quellen abzurufen, auf die sie schnell und einfach zugreifen kann.
Bei der Entscheidung zwischen einem primären Datenspeicher und einem Cache geht es vor allem um Geschwindigkeit und Größe. Die Daten in einer primären Datenbank sind zwar besser strukturiert und durchsuchbar, der Zugriff darauf kann jedoch schwieriger sein als bei einem dedizierten Cache.
Bestimmen Sie die Basisleistung
Bei der Integration von API-Caching in eine Anwendung sollten Entwickler von Anfang Tests im Vorfeld in Betracht ziehen. Zum einen ist es wichtig, sich mit Performance Benchmarks vertraut zu machen, insbesondere um die Leistung einer Anwendung mit Caching mit der Leistung ohne aktiviertes Caching zu vergleichen.
Zu Beginn können Entwickler mit Tools wie Apache JMeter oder Locust Lasttests für API-Anfragen erstellen. Mit diesen beiden Open Source Tools können Entwickler die Anzahl der API-Anfragen skalieren, um verschiedene Anfragelasten von unterschiedlichen Benutzertypen zu simulieren. Die Ergebnisse dieser frühen Lasttests können im Vorfeld einen Maßstab für die Leistung der Anwendung liefern.
Die Netzwerkbandbreite, die Latenzzeit und die Verarbeitungsleistung eines Computers können einen erheblichen Einfluss auf die Menge der generierten Anfragen haben. Entwickler müssen dies beim Vergleich von Lasttestergebnissen berücksichtigen, da die Ergebnisse von einer Ausführung zu einer anderen möglicherweise keinen gültigen Vergleich darstellen. Um diese Art von Diskrepanzen zu vermeiden, sollten Sie ein Cloud-Lasttest-Tool einsetzen, das stabile, isolierte Server verwendet, die eine konsistente Netzwerkbandbreite und Latenz bieten. BlazeMeter oder CloudTest sind einige gute Beispiele für Tools, die dies leisten.
Ausführen von Testszenarien für Anfragen
Nach dem Erhalt eines Basis-Benchmarks können Entwickler das Caching implementieren und die Leistung der Anwendung neu bewerten. Im Idealfall sollte sich die Fähigkeit der Anwendung, die Last unter Stress zu bewältigen, verbessern – und damit hoffentlich auch ihre Gesamtleistung. Unabhängig von der Leistung sollten Teams jedoch auch die Antworten auf Anfragen validieren, um sicherzustellen, dass sich der Cache richtig verhält.
Eine Möglichkeit, dies zu bestätigen, besteht darin, Testszenarien zu erstellen, die auf aktualisierte Werte prüfen und die Entwickler in wenigen Schritten ausführen können. Hier ein Beispiel:
- Konfigurieren Sie eine Gruppe von Anfragen so, dass sie ausschließlich den Cache der Anwendung verwenden.
- Führen Sie eine Aktualisierung eines Wertes in der primären Datenbank der Anwendung durch.
- Senden Sie nach der erwarteten Ablaufzeit des Cache eine Anfrage an die Anwendung, um zu überprüfen, ob der aktualisierte Wert zurückgegeben wurde.
Je nach Cache-Implementierung können Entwickler auch Testszenarien durchführen, um bestimmte Funktionen zu validieren.
Verwenden Sie Key-Value Stores
Viele Open Source Caching Tools – Memcached ist ein Beispiel – verwenden einen Key-Value-Ansatz, um den Cache im Speicher zu füllen, wenn Anfragen eingehen. Bevor ein Wert im Cache vorhanden ist, überprüft eine Anwendung den Cache auf den angegebenen Schlüssel, der die Objekte identifiziert, die als Teil der Antwort zurückgegeben werden sollen.
Ist kein Schlüssel im Cache vorhanden, fragt das Tool eine Datenbank ab und liefert eine Antwort für den Cache, die zusammen mit dem erwarteten Schlüssel verwendet wird. Nachfolgende Anfragen nach demselben Schlüssel erfordern keine Abfrage der Datenbank, da sie nun im Cache gespeichert sind.
Vermeiden Sie das donnernde Herdenproblem
Stellen Sie sich vor, es gibt zehn Server, die alle dieselbe Webseitenanwendung bedienen. Die Webseite wird in einem Cache gespeichert, der alle fünf Minuten abläuft, um sicherzustellen, dass die Benutzer stets die aktuellste Version der Seite sehen. Der Cache kann ablaufen, während diese zehn Server noch stark belastet sind, was dazu führt, dass jeder Server gleichzeitig den Cache abfragt, keine Webseite findet und versucht, direkt auf die primäre Datenbank zuzugreifen.
Die Zwischenspeicherung unter hoher Last – insbesondere in einem verteilten System – kann zu dem so genannten donnernden Herdenproblem führen. Wenn zehn Server die Datenbank gleichzeitig abfragen, entsteht eine hohe Last, und eine rechenintensive Abfrage kann leicht dazu führen, dass eine kaskadenartige Anzahl von Anfragen fehlschlägt, während die Datenbank sich weiter abmüht. Wenn diese fehlgeschlagenen Anfragen erneut versucht werden, belasten sie die Datenbank noch mehr und machen die Anwendung möglicherweise unbrauchbar.
Glücklicherweise gibt es einige Möglichkeiten, ein solches Szenario zu vermeiden. Zum einen können Sie den Cache sperren, um sicherzustellen, dass jeweils nur ein Prozess den Cache aktualisieren kann. Mit dieser Sperre können Anwendungen, die versuchen, den Cache zu aktualisieren, die zuvor gespeicherten Werte verwenden, bis die Aktualisierung abgeschlossen ist. Entwickler können auch einen externen Prozess zur Aktualisierung des Cache verwenden, anstatt sich auf die Anwendung selbst zu verlassen.
Eine weitere nützliche Methode zur Vermeidung einer donnernden Herde ist die Aktualisierung des Cache-Ablaufs auf einen vorhergesagten Wert, wenn sich die Ablaufzeit des Cache nähert. In einem solchen Fall können Anwendungen, die auf den Cache angewiesen sind, auch die voraussichtlichen Ablaufzeiten berechnen und auf diese Weise besser sicherstellen, dass nicht alle Daten auf einmal ablaufen.