$FOGO fühlt sich an, als würde sie um die Idee geformt, dass Geschwindigkeit kein kosmetisches Versprechen sein sollte, denn wenn Blöcke wirklich schnell sind und die Laufzeit unabhängige Arbeiten gleichzeitig verarbeiten kann, dann wird die Anwendung zum eigentlichen Flaschenhals, und dieser Wandel ist der Punkt, an dem die SVM-Geschichte interessant wird, da die Laufzeit im Grunde jeder Entwickler dieselbe Frage stellt, in dem Moment, in dem echte Benutzer ankommen, nämlich ob ihre Transaktionen tatsächlich unabhängig sind oder ob sie versehentlich einen gemeinsamen Lock entworfen haben, den jeder berühren muss.
Parallele Ausführung klingt einfach, wenn sie als Transaktionen erklärt wird, die zusammenlaufen, aber das praktische Detail, das alles verändert, ist, dass es nur funktioniert, wenn zwei Transaktionen nicht um denselben Zustand kämpfen, und auf SVM ist der Zustand kein unsichtbarer Blob, den die Kette interpretiert, wie sie möchte, der Zustand ist explizit und konkret, und jede Transaktion muss erklären, was sie lesen und was sie schreiben wird, was bedeutet, dass die Kette mit Zuversicht Arbeiten planen kann, wenn diese Erklärungen sich nicht überschneiden, und es bedeutet auch, dass die Kette Sie nicht vor Ihrem eigenen Layout retten kann, wenn Sie alles zwingen, sich zu überschneiden.
Dies ist der Teil, den die meisten oberflächlichen Kommentare übersehen, denn die Leute sprechen, als ob die Leistung auf der Kettenebene liegt, aber auf Fogo wird die Leistung in dem Moment, in dem Sie beginnen, eine Anwendung zu modellieren, etwas, das Sie in die Art und Weise entwerfen, wie Konten und Daten getrennt sind, und das ist der Grund, weshalb zwei Apps auf derselben Kette sich unter Stress völlig unterschiedlich anfühlen können, wobei eine reibungslos bleibt, während die andere seltsam stecken bleibt, obwohl beide auf derselben schnellen Ausführungsumgebung sitzen.
Ich habe festgestellt, dass, wenn Entwickler aus Gewohnheiten der sequenziellen Ausführung kommen, sie einen Instinkt mitbringen, der sich sicher anfühlt, aber auf SVM teuer wird, nämlich den Instinkt, ein zentrales Zustandsobjekt zu behalten, das jede Aktion aktualisiert, denn es macht das Nachdenken über das System sauber, es macht Analysen einfach, und es lässt den Code wie eine einzige Quelle der Wahrheit erscheinen, aber auf einer SVM-Kette wird dasselbe Design zu einem stillen Drossel, denn jede Benutzeraktion versucht jetzt, an denselben Ort zu schreiben, sodass selbst wenn die Laufzeit bereit ist, parallel auszuführen, Ihre Anwendung eine einzige Spur geschaffen hat, die alles betreten muss.
Was sich auf Fogo ändert, ist, dass das Zustandslayout nicht mehr nur Speicherung ist, sondern zur Parallelitätsrichtlinie wird, denn jedes beschreibbare Konto wird zu einer Art Schloss, und wenn Sie zu viel hinter einem Schloss platzieren, verlangsamen Sie nicht nur ein kleines Element, sondern kollabieren die Parallelität für den gesamten Fluss, und die Kette muss nicht überlastet sein, damit Sie es spüren, denn Ihr eigenes Vertragsdesign erzeugt die Überlastung, indem es nicht verwandte Benutzer zwingt, im selben Schreibsatz zusammenzustoßen.
FOGO aus einem Grund, der nichts mit den Zahlen auf der Bestenliste zu tun hat, sondern alles damit, wie die Kette leise Druck auf die Entwickler ausübt, ihre Architektur zu verbessern, denn wenn Sie auf einer SVM-basierten L1 aufbauen, wählen Sie nicht nur eine schnellere Umgebung, Sie wählen ein Ausführungsmodell, das gutes Zustandsdesign belohnt und schlechtes Zustandsdesign gnadenlos offenbart.
Fogo fühlt sich so an, als würde es um die Idee geformt, dass Geschwindigkeit kein kosmetisches Versprechen sein sollte, denn wenn Blöcke wirklich schnell sind und die Laufzeit unabhängige Arbeiten gleichzeitig verarbeiten kann, dann wird die Anwendung zum eigentlichen Engpass, und dieser Wechsel ist der Punkt, an dem die SVM-Geschichte interessant wird, da die Laufzeit im Grunde jeder Entwickler im Moment, in dem echte Benutzer ankommen, die gleiche Frage stellt, nämlich ob ihre Transaktionen tatsächlich unabhängig sind oder ob sie versehentlich ein gemeinsames Schloss entworfen haben, das jeder berühren muss.
Parallele Ausführung klingt einfach, wenn sie als Transaktionen erklärt wird, die zusammenlaufen, aber das praktische Detail, das alles verändert, ist, dass es nur funktioniert, wenn zwei Transaktionen nicht um denselben Zustand kämpfen, und auf SVM ist der Zustand kein unsichtbarer Blob, den die Kette interpretiert, wie sie möchte, der Zustand ist explizit und konkret, und jede Transaktion muss erklären, was sie lesen und was sie schreiben wird, was bedeutet, dass die Kette mit Zuversicht Arbeiten planen kann, wenn diese Erklärungen sich nicht überschneiden, und es bedeutet auch, dass die Kette Sie nicht vor Ihrem eigenen Layout retten kann, wenn Sie alles zwingen, sich zu überschneiden.
Dies ist der Teil, den die meisten oberflächlichen Kommentare übersehen, denn die Leute sprechen, als ob die Leistung auf der Kettenebene liegt, aber auf Fogo wird die Leistung in dem Moment, in dem Sie beginnen, eine Anwendung zu modellieren, etwas, das Sie in die Art und Weise entwerfen, wie Konten und Daten getrennt sind, und das ist der Grund, weshalb zwei Apps auf derselben Kette sich unter Stress völlig unterschiedlich anfühlen können, wobei eine reibungslos bleibt, während die andere seltsam stecken bleibt, obwohl beide auf derselben schnellen Ausführungsumgebung sitzen.
Ich habe festgestellt, dass, wenn Entwickler aus Gewohnheiten der sequenziellen Ausführung kommen, sie einen Instinkt mitbringen, der sich sicher anfühlt, aber auf SVM teuer wird, nämlich den Instinkt, ein zentrales Zustandsobjekt zu behalten, das jede Aktion aktualisiert, denn es macht das Nachdenken über das System sauber, es macht Analysen einfach, und es lässt den Code wie eine einzige Quelle der Wahrheit erscheinen, aber auf einer SVM-Kette wird dasselbe Design zu einem stillen Drossel, denn jede Benutzeraktion versucht jetzt, an denselben Ort zu schreiben, sodass selbst wenn die Laufzeit bereit ist, parallel auszuführen, Ihre Anwendung eine einzige Spur geschaffen hat, die alles betreten muss...
Was sich auf Fogo Official ändert, ist, dass das Zustandslayout nicht mehr nur Speicherung ist, sondern zur Parallelitätsrichtlinie wird, denn jedes beschreibbare Konto wird zu einer Art Schloss, und wenn Sie zu viel hinter einem Schloss platzieren, verlangsamen Sie nicht nur ein kleines Element, sondern kollabieren die Parallelität für den gesamten Fluss, und die Kette muss nicht überlastet sein, damit Sie es spüren, denn Ihr eigenes Vertragsdesign erzeugt die Überlastung, indem es nicht verwandte Benutzer zwingt, im selben Schreibsatz zusammenzustoßen.
Die nützlichste Art, darüber nachzudenken, ist, jeden beschreibbaren Teil des Zustands als eine Entscheidung darüber zu betrachten, wer gleichzeitig fortfahren darf, und das Designziel wird, unnötige Kollisionen zu reduzieren, was nicht bedeutet, dass der gemeinsame Zustand vollständig entfernt wird, denn einige gemeinsame Zustände sind wesentlich, sondern es bedeutet, diszipliniert zu sein, was geteilt werden muss und was nur zur Bequemlichkeit geteilt wurde, denn Bequemlichkeit ist der Ort, an dem die parallele Ausführung leise stirbt.
Auf Fogo sind die Muster, die Anwendungen schnell erscheinen lassen, selten kompliziert, aber sie sind streng, denn sie erfordern von einem Entwickler, den Benutzerzustand aggressiv zu trennen, den marktspezifischen Zustand zu isolieren, anstatt alles durch ein globales Protokollobjekt zu drücken, und das Schreiben in gemeinsame Konten zu stoppen, die hauptsächlich zum Tracking und zur Sichtbarkeit dienen, da diese abgeleiteten Metriken existieren können, ohne Teil des kritischen Schreibpfades für jede Transaktion zu werden.
Wenn ich mir erfolgreiche, parallelfreundliche Designs anschaue, neigen sie dazu, Benutzeraktionen größtenteils lokal zu behandeln, wo ein Benutzer seinen eigenen Zustand und einen engen Teil des gemeinsamen Zustands berührt, der wirklich notwendig ist, und der gemeinsame Teil ist so strukturiert, dass er nicht dazu zwingt, dass nicht verwandte Benutzer miteinander konkurrieren, weshalb die Trennung pro Benutzer nicht nur ein netter organisatorischer Trick ist, sondern eine Durchsatzstrategie, und die Trennung pro Markt nicht nur eine saubere Architekturwahl ist, sondern der Unterschied zwischen einem aktiven Markt, der alles nach unten zieht, und mehreren Märkten, die unabhängig fließen.
Die versteckte Falle ist, dass Entwickler oft gemeinsamen Zustand schreiben, weil sie sofortige globale Wahrheit wollen, wie globale Gebühren, globale Volumenzähler, globale Aktivitätsverfolger, globale Bestenlisten oder globale Protokollmetriken, und das Problem ist nicht, dass diese Metriken schlecht sind, das Problem ist, dass Sie, wenn Sie sie in derselben Transaktion wie jede Benutzeraktion aktualisieren, einen gemeinsamen Schreibvorgang in jeden Pfad injizieren, sodass jeder Pfad jetzt in Konflikt gerät, und plötzlich haben Sie eine sequenzielle Anwendung innerhalb einer parallelen Laufzeit aufgebaut, und es spielt keine Rolle, wie schnell Fogo ist, denn Ihr eigenes Design zwingt die Kette dazu, unabhängige Arbeiten als abhängige Arbeiten zu behandeln.
Was die parallele Ausführung ändert, ist in einem sehr praktischen Sinne, dass Entwickler gedrängt werden, den Korrektheitszustand vom Berichtsstatus zu trennen, und sie werden gedrängt, den Berichtsstatus in einem anderen Rhythmus zu aktualisieren oder ihn in fragmentierte Segmente zu schreiben oder ihn aus Ereignispfaden abzuleiten, denn sobald Sie aufhören, jede Transaktion zum Schreiben desselben Berichts-Kontos zu zwingen, kann die Laufzeit endlich echte parallele Arbeiten planen, und die Anwendung beginnt sich so anzufühlen, als gehöre sie zu einer SVM-Kette, anstatt nur auf einer zu laufen.
Dies wird in handelsorientierten Anwendungen noch deutlicher, wo die Haltung von Fogo die Diskussion fundiert erscheinen lässt, denn Handel konzentriert Aktivitäten, und Konzentration erzeugt Konkurrenz, und Konkurrenz ist der Feind der parallelen Ausführung, sodass, wenn ein Handelssystem um einen zentralen Orderbuchzustand herum gestaltet wird, der für jede Interaktion verändert werden muss, die Kette diese Interaktionen serialisieren wird, egal wie schnell die Blöcke sind, und das Benutzererlebnis wird genau dann abnehmen, wenn es am wichtigsten ist, weshalb Entwickler gezwungen sind, in härtere, aber bessere Designs zu wechseln, in denen die heißesten Komponenten minimiert werden, der Zustand partitioniert wird, die Abwicklungswege verengt werden und die Teile, die nicht bei jeder Aktion verändert werden müssen, aus dem kritischen Pfad entfernt werden.
Die gleiche Logik zeigt sich in Echtzeitanwendungen, von denen die Leute annehmen, dass sie auf einer schnellen Kette einfach sein werden, wie interaktive Systeme, die häufig aktualisiert werden, denn der naive Ansatz besteht darin, einen einzigen Weltzustand aufrechtzuerhalten und ihn ständig zu verändern, aber auf @Fogo Official wird das zu einem garantierten Kollisionspunkt, da jeder Teilnehmer versucht, dasselbe beschreibbare Objekt zu berühren, sodass der bessere Ansatz darin besteht, den Zustand pro Teilnehmer zu isolieren, gemeinsame Zonen zu lokalisieren, anstatt sie zu globalisieren, und globale Aggregationen als etwas zu behandeln, das auf kontrolliertere Weise aktualisiert wird, denn in dem Moment, in dem Sie aufhören, jede Aktion in dasselbe gemeinsame Objekt schreiben zu lassen, kann die Laufzeit beginnen, viele Aktionen zusammen auszuführen, und das ist der Punkt, an dem die wahrgenommene Geschwindigkeit real wird.
In der Logik des Hochfrequenzstils, die oft als Maßstab für latenzarme Ketten dient, macht die parallele Ausführung Designfehler unmöglich zu verbergen, denn wenn viele Akteure schnell Aktionen einreichen, wird jeder gemeinsam beschreibbare Zustand zu einem Schlachtfeld, und anstatt ein System zu schaffen, in dem viele Flüsse unabhängig vorankommen, bauen Sie ein System, in dem jeder um dasselbe Schloss kämpft, und das Ergebnis ist nicht nur eine langsamere App, es ist eine andere Marktdynamik, denn die Reihenfolge wird von der Kontention und nicht von der Strategie dominiert, weshalb die besten Designs dazu tendieren, Schreibvorgänge zu isolieren, gemeinsame Mutationen zu reduzieren und die umstrittenen Komponenten als eng und gezielt statt breit und zufällig zu behandeln.
Datenintensive Anwendungen zeigen das gleiche Muster auf ruhigere Weise, denn die meisten Datenkonsumenten müssen nur lesen, und das Lesen ist nicht das Problem, aber wenn Konsumflüsse beginnen, gemeinsame Daten zur Bequemlichkeit zu schreiben, wie das Stempeln von Werten in globale Konten oder das Aktualisieren von gemeinsamen Caches, vergiften sie die Parallelität ohne echten Gewinn, und der bessere Ansatz besteht darin, Konsumenten gemeinsame Daten lesen zu lassen und nur ihre eigenen Entscheidungen zu schreiben, denn sobald Sie gemeinsame Schreibvorgänge auf dedizierte Aktualisierungsflüsse beschränken, schützen Sie die Parallelität für alle anderen.
Der Kompromiss, den Fogo den Entwicklern implizit abverlangt, ist, dass eine parallelfreundliche Architektur nicht kostenlos ist, denn sobald Sie den Zustand shard und Konten trennen, verwalten Sie mehr Komponenten, denken über mehr Kanten nach, und bauen Systeme, bei denen Parallelität real und nicht theoretisch ist, was bedeutet, dass das Testen strenger sein muss, die Upgrade-Pfade vorsichtiger sein müssen, und die Beobachtbarkeit besser sein muss, aber die Belohnung ist, dass die Anwendung in der Weise skalieren kann, wie es eine SVM-Laufzeit unterstützt, wo unabhängige Aktionen wirklich zusammen vorankommen, anstatt hinter einem globalen Engpass zu warten.
Der Fehler, der den größten Teil des parallelen Vorteils zerstört, ist kein fortgeschrittener Fehler, es ist ein einfacher, nämlich einen einzigen gemeinsam beschreibbaren Account zu erstellen, den jede Transaktion berührt, und auf einer Kette wie Fogo ist dieser Fehler besonders kostspielig, denn je schneller die Kette wird, desto sichtbarer ist es, dass Ihr eigenes Design der Begrenzungsfaktor ist, und diese Sichtbarkeit ist kein Versagen der Kette, sondern die Kette, die offenbart, was die Architektur wirklich ist.