Wir haben kürzlich ein kleines Projekt gestartet, um zu bereinigen, wie Teile unserer Systeme hinter den Kulissen bei Buffer kommunizieren. Ein kurzer Kontext: Wir verwenden etwas namens SQS (Amazon Simple Queue Service). bestand darin, routinemäßige Wartungsarbeiten durchzuführen: die Tools zu aktualisieren, die wir verwenden, um Warteschlangen lokal zu testen und ihre Konfiguration zu bereinigen. Aber während wir herausgefunden haben, welche Warteschlangen wir tatsächlich verwenden, haben wir etwas gefunden, was wir nicht erwartet hatten: sieben verschiedene Hintergrundprozesse (oder Cron-Jobs, bei denen es sich um geplante Aufgaben handelt, die automatisch ausgeführt werden) und Worker, die bis zu fünf Jahre lang stillschweigend ausgeführt wurden. Hier erfahren Sie, warum das wichtig ist, wie wir sie gefunden haben und was wir dagegen unternommen haben. Warum das wichtiger ist, als Sie denken: Ja, Laufen Unnötige Infrastruktur kostet Geld. Ich habe eine schnelle Berechnung durchgeführt und für einen dieser Arbeiter hätten wir in 5 Jahren etwa 360-600 US-Dollar bezahlt, aber definitiv reine Verschwendung für einen Prozess, der nichts bewirkt. Ich würde jedoch behaupten, dass die finanziellen Kosten tatsächlich den geringsten Teil des Problems ausmachen Eine Frage, die das Onboarding verschlingt und Unsicherheit erzeugt. Wir haben alle Angst davor, einen Code anzufassen, weil er vielleicht etwas Wichtiges tut. Sogar „vergessene“ Infrastrukturen müssen beachtet werden, wenn sich etwas anderes ändert. Und mit der Zeit verblasst das institutionelle Wissen. War es eine vorübergehende Lösung, die das Unternehmen verlassen hat? Es ist einfach, mit dem Finger darauf zu zeigen, aber die Wahrheit ist, dass dies in jedem langlebigen System ganz natürlich geschieht. Eine Funktion wird nicht mehr unterstützt, aber der Hintergrundjob, der sie unterstützt hat, läuft weiter. Eine geplante Aufgabe wird nach einer Architekturänderung überflüssig, aber niemand denkt daran, dies zu überprüfen. Wir führten eine geplante Aufgabe aus, die die gesamte Datenbank auf Geburtstage überprüfte, die mit dem aktuellen Datum übereinstimmten, und schickten den Kunden eine personalisierte E-Mail. Während einer Umgestaltung im Jahr 2020 haben wir unser Transaktions-E-Mail-Tool umgestellt, aber vergessen, diesen Worker zu entfernen – er lief noch fünf Jahre lang weiter. Keines davon ist ein Versagen von Einzelpersonen – es sind Prozessversagen. Ohne absichtliche Bereinigung, die in unsere Arbeitsweise integriert ist, gewinnt die Entropie. Wie unsere Architektur uns dabei geholfen hat, sie zu finden (ein beliebter Ansatz, bei dem Unternehmen ihren Code in viele kleine, unabhängige Dienste aufteilen) vor Jahren. Wir haben unseren Monolithen in separate Dienste aufgeteilt, jeder mit seinem eigenen Repository, seiner eigenen Bereitstellungspipeline und seiner Infrastruktur. Damals machte es Sinn: Jeder Dienst konnte für sich allein mit klaren Grenzen zwischen den Teams bereitgestellt werden. Im Laufe der Jahre stellten wir jedoch fest, dass der Aufwand für die Verwaltung Dutzender Repositorys die Vorteile für ein Team unserer Größe überwog. Deshalb haben wir die Dienste in einem einzigen Repository mit mehreren Diensten zusammengefasst Es stellte sich heraus, dass dies die Entdeckung ermöglichte. In der Welt der Microservices ist jedes Repository eine eigene Insel. Es gibt keinen einzigen Ort, an dem nach Warteschlangennamen gesucht werden kann, und es gibt keine einheitliche Ansicht darüber, was wo ausgeführt wird. Wir konnten jede Warteschlange auf ihre Produzenten und Produzenten zurückführen, aber auf diese existierte nicht mehr. Die Konsolidierung war nicht dazu gedacht, uns dabei zu helfen, Zombie-Infrastruktur zu finden – aber sie hat es geschafftEntdeckung fast unvermeidlich. Was wir tatsächlich getan haben Nachdem wir die verwaisten Prozesse identifiziert hatten, mussten wir entscheiden, was wir mit ihnen machen wollten. So haben wir es angegangen: Zuerst haben wir jedes einzelne zu seinem Ursprung zurückverfolgt. Wir haben den Git-Verlauf und die alte Dokumentation durchforstet, um zu verstehen, warum jeder Worker überhaupt erstellt wurde. In den meisten Fällen war der ursprüngliche Zweck klar: eine einmalige Datenmigration, eine Funktion, die eingestellt wurde, eine vorübergehende Problemumgehung, die ihren Nutzen überlebte. Dann bestätigten wir, dass sie tatsächlich ungenutzt waren. Bevor wir etwas entfernten, haben wir eine Protokollierung hinzugefügt, um sicherzustellen, dass diese Prozesse nicht stillschweigend etwas Wichtiges tun, das wir übersehen haben. Wir haben einige Tage lang überwacht, um sicherzustellen, dass sie überhaupt nicht angerufen wurden, und haben sie dann schrittweise entfernt. Wir haben nicht alles auf einmal gelöscht. Wir haben die Prozesse einzeln entfernt und auf unerwartete Nebenwirkungen geachtet. (Zum Glück gab es keine.) Abschließend haben wir dokumentiert, was wir gelernt haben. Wir haben unseren internen Dokumenten Notizen darüber hinzugefügt, was jeder Prozess ursprünglich getan hat und warum er entfernt wurde, damit zukünftige Ingenieure sich nicht wundern, wenn etwas Wichtiges verloren geht. Was sich nach der Bereinigung geändert hat: Wir sind noch am Anfang der Messung der vollständigen Auswirkungen, aber hier ist, was wir bisher gesehen haben. Unsere Infrastrukturinventur ist jetzt korrekt. Wenn jemand fragt: „Welche Arbeiter beschäftigen wir?“ Wir können diese Frage tatsächlich mit Zuversicht beantworten. Auch die Onboarding-Gespräche sind einfacher geworden. Neue Ingenieure stolpern nicht über mysteriöse Prozesse und fragen sich, ob ihnen der Kontext fehlt. Die Codebasis spiegelt wider, was wir tatsächlich tun, und nicht das, was wir vor fünf Jahren getan haben. Behandeln Sie Refaktoren als Archäologie und Prävention. Meine größte Erkenntnis aus diesem Projekt: Jeder bedeutende Refaktor ist eine Chance für die Archäologie. Wenn Sie tief in einem System stecken und wirklich verstehen, wie die Teile zusammenhängen, sind Sie in der perfekten Position, zu hinterfragen, was noch benötigt wird. Diese Warteschlange aus einem alten Projekt? Der Worker, den jemand für eine einmalige Datenmigration erstellt hat? Die geplante Aufgabe, die auf eine Funktion verweist, von der Sie noch nie gehört haben? Möglicherweise laufen sie noch. Folgendes bauen wir künftig in unseren Prozess ein: Fragen Sie bei jedem Refactoring: Was berührt dieses System sonst noch, was wir eine Weile nicht betrachtet haben? das einzige Repository noch. Während wir uns weiter konsolidieren, sind wir zuversichtlich, dass wir weitere dieser verborgenen Relikte finden werden. Aber jetzt sind wir darauf vorbereitet, sie einzufangen und zu verhindern, dass sich neue bilden. Wenn sich Ihr gesamter Code an einem Ort befindet, kann sich die verwaiste Infrastruktur nirgendwo verstecken.

You May Also Like

Enjoyed This Article?

Get weekly tips on growing your audience and monetizing your content — straight to your inbox.

No spam. Join 138,000+ creators. Unsubscribe anytime.

Create Your Free Bio Page

Join 138,000+ creators on Seemless.

Get Started Free