Von Simon Chemouil, Senior Director of Engineering

Es ist an der Zeit zu erzählen, wie diese frühe Entscheidung zur Standardweise wurde, wie wir Backendsysteme bauen, was wir darüber gelernt haben, Menschen und Software gemeinsam zu skalieren, und wie neue KI-Tools unsere heutige Bauweise beeinflussen.

Ziele und Ergebnisse

Größere Neuentwicklungen enden selten gut. Sie verlaufen, stocken und werden oft nie fertig, weil ein letztes Stück Legacy-Code alles zusammenhält. Unsere Geschichte verlief anders. Trotz Einschränkungen und einem ständigen Balanceakt zwischen neuen Features, Compliance und technischen Sanierungen haben wir die Anstrengung abgeschlossen.

Das Ergebnis ist nicht perfekt (Ist eine sechs Jahre alte Codebasis je perfekt?), aber es ist eine solide Grundlage, die uns ermöglicht zu expandieren, zu delegieren und zu beschleunigen. Wir haben jetzt Millionen Zeilen Rust über Hunderte von Diensten und unsere Ingenieurorganisation ist weit über 200 Personen hinaus gewachsen. Wir haben erreicht, was wir uns vorgenommen hatten, und mehr.

Wir minimierten die Opportunitätskosten der Neuentwicklung, indem wir den Rust-Stack opportunistisch ausbauten. Als unser PHP-Stack schwieriger zu entwickeln wurde, haben wir neue Features in Rust ausgeliefert. Dies hielt unsere Markteinführungszeit weitgehend unverändert: Die in die Neuentwicklung investierte Zeit wurde durch die zunehmend langsamen PHP-Produktaktualisierungen aufgrund technischer Schulden ausgeglichen.

Die Neuentwicklung erfolgte im Rahmen unseres Produktplans, nicht daneben. Wir machten Umwege, um gesamte Subsysteme neu zu bauen, aber diese waren unvermeidlich und zahlten sich schnell aus, sobald diese Pfade auf Rust liefen.

Leistung unter Druck

Ende 2020 und Anfang 2021 waren entscheidend. Der Boom trieb jedes System an seine Grenzen. Wir standen vor Verbindungstürmen und blockierenden I/O, die unsere PHP-Dienste sättigten. Da wir bereits in Rust-Grundlagen investiert hatten, konnten wir schnell reagieren: Wir migrierten unsere REST-APIs zu asynchronem Rust basierend auf Tokio.

Dieser Schritt ermöglichte die Wiederverwendung über Schichten hinweg und vereinfachte den Stack drastisch. Zusammen mit Verbesserungen an unserer C++-Handelsmaschine half es, Kraken zu einer der leistungsfähigsten Börsen zu machen – nicht nur im Niedriglatenzhandel, sondern über alle benutzerseitigen Systeme hinweg. Diese Reaktionsschnelligkeit ist jetzt Teil unserer Identität.

Architektur und Design: Team und System als eine Einheit

Ein Team und die Software, die es baut, sind symbiotisch, wie ein Baum und seine Umgebung. Unsere Legacy-Codebasis enthielt jahrelanges implizites, stammbezogenes Wissen — komplexe Logik, die nur von einer Handvoll Ingenieuren verstanden wurde. Die Neuentwicklung gab uns die Chance, dieses Wissen wiederzuentdecken, zu dokumentieren und zu teilen, es in gemeinsamen, kollektiven Verstand zu verwandeln.

Diese Ausrichtung um eine kohärente architektonische Vision brachte Konsistenz über den gesamten Stack, was es den Ingenieuren weit leichter machte, sich zu orientieren und über ihre unmittelbaren Domänen hinaus beizutragen. Diese Ebene der Zusammenarbeit war zuvor nicht möglich, und während tiefes Fachwissen immer noch wichtig ist, existiert es jetzt innerhalb einer gemeinsamen, zugänglichen Struktur. Diese Grundlage ist zu einem Eckpfeiler unserer Ingenieurkultur geworden.

Um sowohl Teams als auch Kapazität zu skalieren, entkoppelten wir Monolithen und bewegten uns hin zu einer ereignisgesteuerten Architektur, die von einem intern entwickelten Stream-Processing-Framework für Kafka in Rust unterstützt wird. Dieses Design unterstützt Autonomie, Komponierbarkeit und Beobachtbarkeit — mit klaren Grenzen und starken Verträgen.

Nach den Flitterwochen

Sechs Jahre später sind wir weit über die Flitterwochenphase mit Rust hinaus: Es ist zur Selbstverständlichkeit geworden. Tag für Tag sprechen wir mehr über unser Tokio-basiertes Ökosystem als über die Sprache selbst: gemeinsame Crates, Test-Frameworks, Metriken, Tracing und Service-Gerüste. Rust ist nun die Plattform, auf der wir stehen, nicht das Thema der Debatte.

Eine pragmatische mehrsprachige Strategie

Rust ist unsere primäre Backend-Sprache mit mehreren Millionen Zeilen in Hunderten von Kerndiensten und Hunderten von Ingenieuren, die täglich damit arbeiten. Aber wir optimieren nicht um jeden Preis für Einheitlichkeit. Wir privilegieren Geschwindigkeit und Autonomie. Verschiedene Probleme erfordern verschiedene Tools, und Teams behalten die Freiheit, schnell zu agieren – solange sie dasselbe Protokoll sprechen.

Dieses Protokoll ist gRPC (Protobuf). Wir standardisieren die interne Dienstkommunikation auf gRPC und gewährleisten saubere Interoperabilität über Rust, C++, Go, Python und TypeScript (Node.js). Wir definieren Protobufs einmal, generieren idiomatische Clients und Server für jeden unterstützten Stack, und alles andere — Tracing, Retries, Deadlines, Beobachtbarkeit — folgt automatisch. Dadurch können Teams nahtlos interagieren, unabhängig von der Implementierungssprache.

Unser Standard-Stack ist Rust – auf Tokio basierend, mit internen Bibliotheken für I/O, RPC, Speicherung und Telemetrie. Wir setzen weiterhin auf C++ für extrem heiße Pfade wie unsere Handelsmaschine. Go, Python und TypeScript haben jeweils ihren Platz, wenn ihre Ökosysteme oder Ergonomie mehr Sinn machen. Der Vertrag ist gRPC; die SLOs, Beobachtbarkeit und Sicherheitslage sind dieselben. Dies gibt uns Autonomie ohne Chaos: Teams wählen das richtige Werkzeug, aber alle Dienste teilen denselben Vertrag.

Warum Rust weiterhin Dividenden bringt

Die Ideen, die unsere frühe Einführung von Rust antrieben, bewähren sich weiterhin in der Produktion:

  • Zuverlässigkeit durch Konstruktion: Besitz und Leihen beseitigen ganze Klassen von Speicher- und Parallelitätsfehlern, bevor sie ausgeliefert werden.
  • Weniger Heisenbugs: diese schwer fassbaren Defekte, die ihr Verhalten beim Beobachten ändern, überleben selten Rusts Kompilierungsprüfungen.
  • Fehlermodi durch Design: explizite Fehlersemantik macht Fehler zu erstklassigen Konstrukten, nicht zu einem Nachgedanken.
  • Wiederverwendung in großem Maßstab: eine gemeinsame Laufzeit ermöglicht gemeinsame Crates für Codecs, Auth, Metriken und Konfiguration, die den Hebel über Teams vervielfachen.
  • Weniger Mühe, mehr Geschwindigkeit: da die Kosten für die Aufrechterhaltung fallen, reinvestierten wir diese Zeit in schnellere Produktlieferungen.

Die Reise war nicht ohne Umwege. Wir mussten manchmal pausieren und Subsysteme von Grund auf neu bauen, und diese Momente trugen echte Kosten. Wir stießen auch auf Perioden der Abhängigkeitsprobleme, verursacht durch schlecht definierte interne Grenzen und API-Oberflächen, die Implementierungsdetails in geteilte Crates zogen. Diese Herausforderungen waren nicht spezifisch für Rust — sie sind jedem vertraut, der ein schnell wachsendes System skaliert — aber sie lehrten uns, klarere Verträge und Isolationsgrenzen zu gestalten.

Trotzdem bringt Rust ein Maß an Präzision in die Geschäftslogik, das weiterhin von unschätzbarem Wert bleibt. Jahre später, wenn wir Code überprüfen, um eine Kodierung nachzuverfolgen oder einen kritischen Datenpfad zu klären, ist diese Präzision ein Segen. Die Absicht des Codes ist explizit, und die Invarianten werden vom Compiler selbst durchgesetzt. Die Rendite war dauerhaft: Stabilität, Klarheit und Vertrauen im gesamten Stack.

Coding in Rust mit KI-Assistenten

KI-Coding-Assistenten sind ein praktischer Bestandteil unseres Workflows geworden. Sie verstehen und schreiben Rust, helfen große Codebasen zu navigieren und erklären Idiome inline. Ingenieure nutzen sie auf unterschiedliche Weise – einige als Pair-Programming-Partner, andere durch strukturiertere, spezifikationsgetriebene Ansätze. Wie auch immer sie verwendet werden, sie machen das Codieren schneller und reduzieren die Reibung in der täglichen Entwicklung.

Das Design von Rust macht es besonders kompatibel mit KI-Tools. Sein starkes Typsystem, Borrow-Checker und Compiler-Hinweise bieten klares Feedback, das diesen Assistenten hilft, besseren, sichereren Code zu generieren. KI hilft bei der Gerüstbildung, Tests und Erkundungen, während Rust sicherstellt, dass das, was in der Codebasis landet, korrekt und wartbar ist. Die Kombination verbessert die Produktivität, ohne die Qualität zu beeinträchtigen.

Menschen und Kultur

Rust war ein Magnet für Ingenieure, die Wert auf Korrektheit, Leistung und Klarheit legen. Es zieht Menschen an, die Verantwortung übernehmen, systematisch denken und sich darum kümmern, dauerhafte Systeme zu bauen. Mit einem konsistenten Stack und geteilten Idiomen haben wir eine Kultur aufgebaut, in der Ingenieure über Domänen hinweg zusammenarbeiten, die Arbeit des anderen effektiv überprüfen und die Verantwortung für Qualität teilen.

Wir stellen auf Grundkenntnisse, Neugier und den Drang zur Verbesserung ein. Vorherige Rust-Erfahrung hilft, ist aber nicht erforderlich; am wichtigsten ist die Fähigkeit, über Systeme nachzudenken, sicheren und wartbaren Code zu schreiben und mit Integrität zu liefern. KI-Tools machen die Einarbeitung reibungsloser und helfen neuen Mitarbeitern, schnell an Fahrt zu gewinnen, aber großartige Ingenieurleistungen kommen immer noch durch Strenge, Zusammenarbeit und Pflege.

Unsere Mission geht über den Bau zuverlässiger Infrastrukturen hinaus: Kraken existiert, um die globale Einführung von Krypto zu beschleunigen, damit mehr Menschen finanzielle Freiheit und Inklusion erreichen können. Weitere Informationen finden Sie auf der Seite Kraken Culture Explained.

Diese Mission prägt, wie wir arbeiten und wen wir einstellen. Als Krakenites setzen wir auf Transparenz, Direktheit und radikales Eigentum; wir schätzen Integrität über Titel, Klarheit über Zeremonie und langfristiges Denken über Abkürzungen. Wir arbeiten mit Vertrauen und Autonomie, Vorliebe für Aktionen und der Erwartung, dass jeder sowohl Urteilsvermögen als auch Demut mitbringt.

Auf dieser Kultur bauen wir ein breites und ehrgeiziges Produktökosystem auf:

Diese Umgebung belohnt eine gemeinsame Denkweise: Präzision, Verantwortung und Stolz auf unsere Arbeit. Rust verstärkt diese Werte, indem es Strenge erfordert, und unsere Leute tragen diese weiter, indem sie mit Zweck und Vertrauen bauen. Wir sind immer auf der Suche nach Ingenieuren, die diese Denkweise teilen und mit uns wachsen möchten.

Der neue Standard

Was als technische Auffrischung begann, wurde zu viel mehr. Rust ist jetzt das Fundament, auf dem wir bauen und denken – es ermöglicht leise Leistung, Sicherheit und Geschwindigkeit, während Teams sich auf Produkt und Wirkung konzentrieren. Die Plattform, die wir gemeinsam aufgebaut haben, ist das Rückgrat unserer Systeme geworden, aber wichtiger noch, die geteilte Disziplin und Kultur darum herum sind ein Teil davon geworden, wer wir als Ingenieure sind.

Wir haben bewiesen, dass große Neuentwicklungen erfolgreich sein können, dass eine pragmatische mehrsprachige Strategie kohärent bleiben kann und dass großartige Teams sich mit ihren Werkzeugen weiterentwickeln. Die Arbeit geht weiter – Verfeinerung, Skalierung und Willkommen neuer Ingenieure, die unsere Neugier und Standards teilen.

Wenn Sie einer von ihnen sind, kommen Sie und bauen Sie das nächste Kapitel mit uns.

Lesen Sie die Ursprungsgeschichte: Oxidizing Kraken: Improving Kraken Infrastructure Using Rust.

Quelle: Kraken Blog