Hinweis: Obwohl JavaScript für diese Website nicht unbedingt erforderlich ist, werden Ihre Interaktionsmöglichkeiten mit den Inhalten eingeschränkt sein. Bitte aktivieren Sie JavaScript für das volle Erlebnis.

Verwendung von Python zur Zuverlässigkeitssteigerung instabiler APIs

Einleitung

Sales Spirit ist das Unternehmen hinter mehreren Publisher-Websites, wie z. B. Prijsvergelijken.nl: der größten Vergleichswebsite für Telekommunikation in den Niederlanden. Wichtig für unseren Erfolg ist ein vollständiges und fehlerfreies Produktangebot auf unseren Websites. Um dieses Ziel zu erreichen, arbeiten wir eng mit vielen Geschäftspartnern zusammen. Die Pflege unterschiedlicher und variierender Produktangebote von Geschäftspartnern ist ein ständiger Kampf.

Die Automatisierung der Wartung mithilfe von Partner-APIs ist ein wichtiger Aspekt unserer Arbeit bei Sales Spirit. Diese APIs variieren stark in Bezug auf Zuverlässigkeit, Leistung, Protokolle und Sprache, Vollständigkeit usw. Gleichzeitig möchten wir unseren Kunden zuverlässige, gut funktionierende und vollständige Websites anbieten. Erst als wir Python in unseren Arbeitsablauf integrierten, waren wir dieser Herausforderung gewachsen. Python hat uns geholfen, eine API-Plattform zu entwickeln, die nicht nur eine hervorragende Ausgabe liefert, sondern auch sehr gut lesbar und wartbar ist.

Aufbau einer API-Plattform mit Python

Wir haben bei Sales Spirit eine maßgeschneiderte API-Plattform entwickelt, um mit den von unseren Geschäftspartnern bereitgestellten APIs umzugehen. Die Plattform hat viele Anwendungsfälle, einer davon ist unsere Postleitzahlenprüfung. Kunden können auf unserer Breitbandvergleichsseite ihre Postleitzahl und Hausnummer eingeben, um die Breitbandverfügbarkeit an ihrer Wohnadresse zu prüfen. Im Hintergrund prüfen wir die Verfügbarkeit von Breitband bei mehreren Breitbandanbietern mithilfe ihrer APIs. In diesem speziellen Anwendungsfall sind Leistung und Zuverlässigkeit sehr wichtig, da wir es mit einem Live-Dienst zu tun haben. Die APIs selbst bieten dies nicht immer.

Wir haben die Leistung und Zuverlässigkeit durch die Organisation unserer API-Plattform in einer Master-Worker-Konfiguration sichergestellt. Die Worker laufen parallel und jeder bearbeitet einen API-Aufruf. Die Worker sind auch isoliert, sodass die API-Plattform stabil bleibt, falls mit einem Worker etwas passiert. Ein weiterer Vorteil der isolierten Worker ist, dass sie leicht beendet werden können. Wir können den Workern daher eine Zeitbegrenzung setzen, was hilft sicherzustellen, dass unsere Plattform innerhalb eines bestimmten Zeitrahmens Ergebnisse liefern kann. Die Master-Worker-Konfiguration wurde mithilfe von Python Threads implementiert. Im Gegensatz zu anderen Thread-Lösungen sind Python-Threads sehr einfach zu verwenden. Die meisten Operationen in Python sind aufgrund des Global Interpreter Lock (GIL) garantiert atomar. Dies hat uns enorm viel Zeit gespart und gleichzeitig die Threadsicherheit für unsere Worker gewährleistet. Als Bonus ist die Infrastruktur für die Erstellung von Python Threads gut organisiert und dokumentiert und in die Standardbibliothek von Python integriert. Um unsere API-Plattform zu vervollständigen, mussten wir eine Lösung für die einfache Verarbeitung und Sammlung von API-Ergebnissen finden. Für den Verarbeitungsteil haben wir eine Bibliothek mit einer Reihe von Datenverarbeitungswerkzeugen geschrieben. Die meisten Werkzeuge sind im Wesentlichen abstrakte Versionen beliebter Python-Bibliotheken, die vollständig auf unsere Bedürfnisse zugeschnitten sind. Unser Werkzeug zur Generierung von SQL-Abfragen aus API-Ergebnissen basiert beispielsweise vollständig auf SQLAlchemy. Python glänzt wirklich, wenn es darum geht, leistungsstarke und einfach zu bedienende Abstraktionen von ansonsten komplizierten Operationen zu schreiben.

Wir haben eine spezielle, threadsichere Ausgabe-Klasse zur Sammlung von API-Ergebnissen entworfen. Die Klasse wird jedem Worker als Objekt übergeben. Worker können Ergebnisse in das Objekt schreiben, ohne sich darum kümmern zu müssen, wie alle Daten schließlich zusammenkommen. Wir haben Python-Listen und -Wörterbücher als unsere grundlegenden Bausteine für die Entwicklung der Ausgabe-Klasse verwendet. Somit wurde die meiste Schwerstarbeit zur Gewährleistung der Threadsicherheit der Ausgabe-Klasse direkt von Python übernommen.

Die in die Ausgabe-Klasse geschriebenen Ergebnisse werden mit dem Master-Thread geteilt. Es ist die Aufgabe des Masters, die einzelnen Ergebnisse zusammenzuführen und eine endgültige Ausgabe zu generieren. Der Master erhält seine Anweisungen aus einer Konfigurationsdatei. Die Konfigurationsdatei kann einfache Anweisungen enthalten, z. B. alle Ergebnisse als Liste auszugeben. Es ist auch möglich, eine Wiederholungsanweisung für fehlgeschlagene API-Anfragen einzurichten. Die Verwendung von Anweisungen wie diesen kann die Qualität der Ausgabe verbessern, hat aber Auswirkungen auf die Leistung. Für Live-Dienste wie die Postleitzahlenprüfung ist dies möglicherweise nicht der beste Ansatz zur Verbesserung der Ausgabequalität und -vollständigkeit. Stattdessen füllen wir die Lücken mit der Ausgabe von Workern, die erfolgreich waren. Mit unserer API-Plattform ist diese fortschrittliche Nachbearbeitungstechnik mit nur wenigen Zeilen in der Konfigurationsdatei eingerichtet.

Schlussfolgerung

Wichtig für den Erfolg von Sales Spirit ist ein vollständiges und fehlerfreies Produktangebot auf unseren Websites. Die Seiten werden oft automatisch mit Daten bestückt, die über Partner-APIs bezogen werden. Die Sicherstellung der Qualität von Websites, die diese APIs nutzen, ist eine echte Herausforderung.

Wir haben Python verwendet, um eine maßgeschneiderte API-Plattform zu entwickeln, die mit den von unseren Geschäftspartnern bereitgestellten APIs umgeht. Die API-Plattform stellt die Qualität unserer Produkte sicher und ist Teil unseres Erfolgs. Python hat uns geholfen, eine API-Plattform zu entwickeln, die nicht nur eine hervorragende Ausgabe liefert, sondern auch sehr gut lesbar und wartbar ist. Python hat uns Tage an Entwicklungszeit gespart und wird uns aufgrund der Lesbarkeit und Wartbarkeit des Codes in Zukunft noch mehr sparen.