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.

Python ist Rackspaces KERNtechnologie

Einleitung

Um Branchenführer im Managed Hosting zu sein, muss man schnell und flexibel sein. Durch die Verwendung von Python zur Implementierung unserer Unternehmensdatensysteme kann Rackspace seine internen Systeme schnell und effektiv ändern, um mit den Veränderungen in der Branche und unseren eigenen Geschäftsprozessen Schritt zu halten. Dies geschieht über ein zentrales Kundeninformationssystem namens "CORE", das sowohl für Customer Relationship Management (CRM) als auch für Enterprise Resource Planning (ERP) verwendet wird. Python und CORE sind Schlüsselfaktoren, die es Rackspace ermöglichen, unseren Fanatical Support(tm) und einen schnelleren Kundenservice zu bieten.

Hintergrund

Die zentrale Kundendatenbank von Rackspace begann als einfaches ERP-System zur Bereitstellung und Verfolgung von Managed Servern. Sie begann bescheiden als kleine Sammlung von PHP-Seiten, die für die wenigen hundert Server, die den Anfang der Kundenbasis von Rackspace bildeten, gute Dienste leisteten.

Mit dem Wachstum von Rackspace wurde dieses kleine PHP-System zum Zentrum des Geschäfts bei Rackspace. Jedes Mal, wenn sich eine Gelegenheit zur Automatisierung eines Prozesses bot, wurde sie in dieses System integriert.

Nach ein paar Jahren war das Ergebnis ein großes, nicht wartbares Durcheinander aus Tausenden von PHP-Seiten und Modulen, die hauptsächlich von einer Person geschrieben und gepflegt worden waren. Die Grenzen von PHP (damals Version 3) waren ausgereizt, das System war für eine Person zu viel zu pflegen, und es war schwierig, neue Leute für die Mitarbeit zu gewinnen.

View of Rackspace Managed Hosting Data Center

Rackspace Managed Hosting bietet maßgeschneiderte Server in hochmodernen Rechenzentren Zoomen Sie hinein

Unser erster Versuch, das System zu aktualisieren, kam mit der Veröffentlichung von PHP Version 4. Diese Version versprach bessere objektorientierte Fähigkeiten, und es war der richtige Zeitpunkt für Rackspace, mehr Leute für das Projekt einzusetzen.

Das System wurde von Grund auf neu konzipiert, einschließlich neuer Datenbankschemata und Strategien für das Anwendungsdesign. Zu diesem Zeitpunkt benannten wir das Projekt in "CORE" um, ein Akronym für Core Objects Reused Everywhere (weit verbreitete Kernobjekte), um das übergeordnete Designziel von CORE widerzuspiegeln: Modularität und Wiederverwendbarkeit in allen Systemen des Unternehmens. Mit diesem Ziel vor Augen machte sich unser Team an die Arbeit und nutzte die objektorientierten Funktionen von PHP.

Obwohl wir die Anwendung anpassen und die Funktionalität erweitern konnten, scheiterte das Projekt letztendlich größtenteils an den Problemen, die bei der Verwendung des von PHP bereitgestellten Objekt-Frameworks auftraten.

Speicherlecks, inkonsistente Schnittstellen, inkonsistente interne Datenmodelle, zufällig freigegebene Objekte, mehrfache Objektkopien trotz expliziter Verwendung von Referenzen, interne PHP-Fehler und nicht nachvollziehbare Codefehler machten die Aufgabe in PHP fast unmöglich.

Selbst nachdem wir eine relativ stabile Codebasis erreicht hatten, waren wir unserem Ziel, Kernobjekte überall wiederzuverwenden, noch lange nicht nahe, da wir reine objektorientierte Methoden aufgeben mussten, nur um die inhärenten Probleme von PHP zu umgehen. Es wurde deutlich, dass PHP für unsere großen, geschäftskritischen Projekte ungeeignet war. Eine neue Lösung musste gefunden werden.

Python in CORE

Wir hatten Python immer als hervorragenden Kandidaten für die Implementierung unseres Unternehmenssystems betrachtet, aber es wurde zunächst zugunsten der Weiterentwicklung der bestehenden (riesigen) Codebasis, die wir bereits in PHP hatten, zurückgestellt. Damals glaubten wir, dass PHP in CORE erfolgreich eingesetzt werden könnte, indem wir ein besser strukturiertes Systemdesign einführen.

Leider reichte das nicht aus, um unsere anderen Probleme mit PHP zu überwinden, also bewerteten wir unsere Situation neu. Die erste Alpha-Version von Python 2.2 war kürzlich veröffentlicht worden, und wir beschlossen, mit der Arbeit an einem neuen CORE-Framework zu beginnen, das die neuen Funktionen dieser Version nutzte.

Die Macht der Introspektion

Eine der ersten Aufgaben bei der Erstellung des neuen Frameworks war die Erstellung der Datenbankoberfläche.

Pythons Introspektionsmodell wurde mit der Veröffentlichung von Python 2.2 erheblich verbessert. Wir beschlossen, es zur Erstellung einer generischen Datenbankoberflächenklasse auf Basis eines mit DBI 2.0 konformen Datenbankconnectors zu verwenden. Bei diesem Ansatz werden anstatt manuell Abfragen oder tabellenspezifische Wrapper zu schreiben, durch eine Meta-Klasse alle Datenbankabfragen in eine einzige saubere API abstrahiert.

Wir erstellen Nachkommen dieser Meta-Klasse, um eine API für jede Tabelle zu erstellen. Jede Tabellenklasse enthält einige Klassenkonstanten, die die Spalten in der Datenbank beschreiben. Auf diese Weise können wir schnell und einfach neue Tabellen zur Gesamt-API hinzufügen, ohne uns um Implementierungsdetails für eine bestimmte Tabelle kümmern zu müssen.

Die API verwendet auch Metadaten, um automatisch Werte zu validieren und zu konvertieren, die an die Datenbank übergeben werden. Dies geschieht durch eine "Normalisierungsfunktion", die die durch die API übergebenen Python-Datentypen in gültige SQL-Werte umwandelt. Die Funktion überprüft auch Typen und Formate, die nicht unbedingt von der Datenbank oder von Python überprüft werden, wie z. B. Telefonnummern und Postleitzahlen.

Objekte überall wiederverwenden

Sobald die Datenbank-API fertig war, erstellten wir eine zweite Schicht von Klassen darüber. Diese höherrangige API implementiert die Geschäftslogik für spezifische Anwendungen, wie z. B. Kontaktverwaltung oder Bearbeitung von Supportanfragen. Sie verhindert auch, dass Benutzer Operationen durchführen, die inkonsistent mit den Geschäftspraktiken von Rackspace sind, oder Daten zuweisen, die zu anderen Arten von High-Level-Datenbeschädigungen in der Datenbank führen würden.

Mit der Erstellung dieser zweiten Schicht erreichten wir unser ursprüngliches Ziel, Kernobjekte überall wiederzuverwenden. Programmierer im gesamten Unternehmen begannen, diese API zu verwenden, um Schnittstellen zu Anwendungsfunktionalitäten zu implementieren. Dies erforderte wenig Interaktion mit unserem API-Entwicklungsteam und konnte ohne Angst vor der missbräuchlichen Verwendung der API erfolgen.

Obwohl wir die API hauptsächlich für CORE, die zentrale Unternehmensanwendung, entwickelt haben, wird sie in einer Reihe anderer Systeme bei Rackspace wiederverwendet. Zum Beispiel baute eine Gruppe einen SOAP-Server auf die API auf, um von ihren PHP-Anwendungen darauf zugreifen zu können. Andere Anwendungen verwenden die API direkt, und es war äußerst erfreulich zu sehen, wie unsere Arbeit wiederverwendet und so einfach mit anderen Systemen integriert wurde.

Python mit Apache integrieren

Mit der API war unsere nächste Aufgabe bei der Entwicklung von CORE, ein nützliches Templating-Modul zu finden, um unseren Python-Code mit HTML-Seiten zu integrieren, die auf dem Apache-Webserver laufen.

Nachdem wir eine Reihe von verfügbaren Python-basierten Templating-Modulen geprüft hatten, entschieden wir uns, einen eigenen einfachen Parser zu erstellen. Unser Ansatz war, serverseitige Vorlagenseiten in Python-Servlets zu konvertieren, deren Ausgabe vom HTTP-Server an den Browser des Benutzers gesendet wird.

Obwohl dies eine ziemlich einfache Übung war, stießen wir auf einige Probleme, die aus unserem Design der CORE-Datenbank-Meta-Klasse herrührten. Wir stellten fest, dass das Ändern von Klassen und Modulen zur Laufzeit, wie es die Meta-Klasse tut, die Richtlinien des optionalen eingeschränkten Ausführungsumgebungs von Python verletzt. Da wir der Meinung waren, dass die eingeschränkte Ausführung eine notwendige Komponente zur Unterstützung eines persistenten Webmoduls ist, entschieden wir uns, CORE über CGIs statt über mod_python oder ähnliche persistente Lösungen zu deployen.

Da schnelle Hardware und mehrere Server leicht verfügbar sind und unser Template-Parser den von ihm erzeugten Python-Servlet-Code vorkompiliert und zwischenspeichert, ist die CGI-Lösung für unsere Bedürfnisse ausreichend. Sie ermöglicht uns auch, Probleme wie Datenbankverbindungs-Pooling und die Beschränkung der Ausführungsumgebung außerhalb von Python zu lösen.

Unit Testing

Dank des Unit-Testing-Moduls, das mit Python geliefert wird, erreichen unsere Projekte die Produktion mit weitaus weniger Fehlern, als wir es uns jemals vorstellen konnten, als wir PHP benutzten. Während der Wartung mit PHP gab es immer die Frage, ob eine Änderung an einer Stelle etwas anderes an einer anderen Stelle der Anwendung kaputt machen würde.

Wir schreiben jetzt für jede einzelne API Unit-Tests, während die API entwickelt wird. Das bedeutet, dass wir die Änderungen in einem Modul sowie ihre Auswirkungen auf alle anderen überprüfen können, indem wir einfach die Unit-Tests für die gesamte API ausführen.

Seit der Einführung von Python und Unit-Tests haben sich die Bugs, die wir in bereitgestellten Anwendungen sehen, hauptsächlich auf die Benutzeroberfläche verlagert, wie z. B. Layout-Probleme oder fehlerhafte Ereignisbehandlung.

Heutzutage kommen nur noch sehr wenige Fehler von der API selbst, und selbst diese sind im Allgemeinen das Ergebnis schlechten Revisionsmanagements oder mangelnder DBA-Koordination während des Anwendungsdeployments. Python kann nicht _alle_ Probleme während der Entwicklung lösen, aber es hat die Anzahl der kritischen Systemfehler für uns definitiv reduziert.

Dokumentation

Mangelnde Dokumentation war ein Hauptproblem bei unseren früheren Entwicklungsbemühungen. Wir haben verschiedene Tools und Richtlinien ausprobiert, um unsere PHP-Bemühungen zu dokumentieren, aber letztendlich sind diese gescheitert. Der Code änderte sich zu schnell, und die damals für PHP verfügbaren Code-Dokumentationstools waren zu wählerisch, um den Aufwand für die korrekte Analyse der Dokumentation zu rechtfertigen. Darüber hinaus machte die Mischung aus PHP und HTML, trotz sorgfältiger Planung und Coding-Strategien, das Entschlüsseln und Verstehen des Codes schwieriger.

Glücklicherweise wurde Python mit Blick auf die Dokumentation entwickelt, mit der Verwendung von "Docstrings" für Module, Klassen und Methoden. Da Dokumentation tatsächlich Teil der Sprache selbst ist und pydoc ein Standardmodul in der Python-Distribution ist, war es einfach, API-Dokumentation in HTML und andere Formate zu extrahieren.

Im Laufe der Zeit haben wir festgestellt, dass die syntaktische Struktur von Python zu extrem lesbarem Code führt, und das allein hilft bei der Gesamtaufgabe der Dokumentation und Wartung von Code.

Schlussfolgerung

Python hat die Entwicklungsprozesse für das CORE-Projekt dramatisch verbessert und zu schnelleren Entwicklungszeiten und schnelleren Releases geführt, die es uns ermöglichen, mit den sich ständig ändernden Geschäftsprozessen von Rackspace Schritt zu halten.

Python ermöglichte es uns, ein ausgeklügeltes dynamisches Datenmodell zu erstellen, das flexibel und einfach zu bedienen ist, um Datenbankoperationen zu abstrahieren. Damit haben wir unser Ziel, Kernobjekte überall wiederzuverwenden, verwirklicht.

Pythons integrierte Unit-Testing- und Dokumentationstools verbessern unsere Fähigkeit, ein stabileres, fehlerfreieres Produkt bereitzustellen und zu warten, erheblich.

Das Ergebnis ist eine erfolgreiche Unternehmensanwendung, die maßgeblich zur Erfüllung des Versprechens von Rackspace Managed Hosting beiträgt: Fanatical Support, Unmatched Speed und Unlimited Flexibility in der Managed Hosting-Branche.

Über den Autor

Nick Borko ist Director of Internal Application Development und Projektmanager für Rackspaces Unternehmensdatenbankanwendung CORE. Rackspace Managed Hosting ist führend in der Bereitstellung von Managed Hosting-Diensten für kleine und mittlere Unternehmen. Alle Kundenplattformen umfassen hochmoderne Rechenzentren, kundenspezifische Server, burstfähige Konnektivität, eine SLA mit 99,999 % Uptime, einen dedizierten Account Manager, sofortige Notfallreaktion und Zugang zu erfahrenen Live-Technikern rund um die Uhr für die Unterstützung aller Hardware- und Kernsoftware. Rackspace wurde 1998 gegründet, hat seinen Hauptsitz in San Antonio, Texas, und verwaltet Server für Kunden in mehr als 80 Ländern.