Expertise · Komplexe Architekturen
Mehrere Systeme, die zusammen funktionieren müssen, auch wenn eines davon ausfällt.
Wir entwerfen und betreiben Plattformen aus mehreren Diensten, mit Message-Bus, begrenzten Wiederholungen, Idempotenz-Schlüsseln, Circuit Breakern und Veröffentlichung mit automatischer Rückkehr. Jedes der folgenden Muster läuft in einem eigenen System, nicht in einem Diagramm.
Bereits gebautOperăm patru platforme proprii cu arhitecturi diferite și le putem deschide pe toate. Cifrele sunt măsurate azi cu comenzi, nu preluate din documentație: aichat are 28 de directoare de serviciu, 235 de modele de date pe patru scheme și o magistrală de mesaje cu 297 de cozi și 17.525 de legături; Kallina are 472 de funcții edge, 559 de migrări și 28 de sarcini programate în bază; MEGA CRM are un backend de 9.516 linii cu 99 de rute și 179 de politici de acces pe rând; Taskin rulează 21 de sarcini programate fără niciun Docker. Rezerva pe care o spunem noi: în două locuri documentația proprie a rămas în urma codului — o afirmație despre numărul de linii era depășită cu 16%, iar o diagramă de infrastructură descria un server pe care nu mai rulăm nimic. Am folosit măsurătoarea, nu documentul.
„Komplexe Architektur“ bedeutet nicht viele Kästen auf einer Zeichnung. Es bedeutet, dass Sie wissen, was passiert, wenn einer davon nicht antwortet. Ein System mit drei Diensten, die synchron aufgerufen werden, ohne Wiederholungsgrenze und ohne Idempotenz, ist fragiler als ein Monolith — denn jede neue Verbindung ist eine neue Fehlerart, und Fehlerarten vermehren sich schneller als Funktionen.
Unsere Arbeit beginnt mit der Trennung von Verantwortlichkeiten und endet bei dem, was sichtbar wird, wenn etwas ausfällt. In einer der eigenen Plattformen laufen Nachrichten nicht direkt zwischen Diensten, sondern über einen Nachrichtenbus mit 297 Warteschlangen, 9 Exchanges und 17.525 Verbindungen, davon 278 pro Kunde generierte Warteschlangen, nicht von Hand geschrieben. Acht Warteschlangen haben einen Dead-Letter-Exchange und acht eine Message-TTL von fünf Minuten — das heißt, eine Nachricht, die nicht verarbeitet werden kann, landet irgendwo, wo sie gesehen werden kann, und verschwindet nicht.
Die Muster, die wir einsetzen, sind wenige und wiederholen sich: Wiederholungen mit im Code festgelegter Obergrenze, Idempotenzschlüssel, die eine zweite Zustellung desselben Ereignisses harmlos machen, ein Unterbrecher, der Aufrufe zu einem wiederholt ausfallenden Dienst stoppt, eine Verbrauchsgrenze vor kostenpflichtigen Aktionen und Alarme mit Wiederholschwelle, damit ein intermittierender Fehler nicht den Rest begräbt.
Der letzte Teil, der oft übersehen wird: die Veröffentlichung. Eine der Plattformen wird per Dateisynchronisierung veröffentlicht, ohne Docker, mit der Prüfung, dass die bereitgestellte Seite genau den Kennzeichner des gerade veröffentlichten Pakets enthält — nicht nur, dass der Server 200 zurückgibt — und mit automatischer Rückkehr zur vorherigen Version, wenn die Prüfung fehlschlägt. Die Regel entstand nach einem echten Vorfall, bei dem eine oberflächliche Prüfung eine gute Veröffentlichung aufgehoben hat.