
Concurrency and Distribution in Reactive Programming vom Fachbereich Informatik der Technischen Universität Darmstadt zur Erlangung des akademischen Grades Doktor-Ingenieur (Dr.-Ing.) Dissertation von Joscha Drechsler Erstgutachterin: Prof. Dr.-Ing. Mira Mezini Zweitgutachter: Prof. Dr. Wolfgang De Meuter Darmstadt 2019 Drechsler, Joscha: Concurrency and Distribution in Reactive Programming Darmstadt, Technische Universität Darmstadt, Jahr der Veröffentlichung der Dissertation auf TUprints: 2019 URN: urn:nbn:de:tuda-tuprints-52284 Tag der mündlichen Prüfung: 11.02.2019 Veröffentlicht unter CC BY-SA 4.0 International https://creativecommons.org/licenses/ “Whoever said ‘the definition of insanity is do- ing the same thing over and over again, but expecting different results’ wasn’t de-bugging concurrency issues.” User Arpeggi42 on reddit.com. 1 Abstract Distributed Reactive Programming is a paradigm for implementing distributed interactive applications modularly and declaratively. Applications are defined as dynamic distributed dataflow graphs of reac- tive computations that depend upon each other, similar to formulae in spreadsheets. A runtime library propagates input changes through the dataflow graph, recomputing the results of affected dependent computations while adapting the dataflow graph topology to changing dependency relations on the fly. Reactive Programming has been shown to improve code quality, program comprehension and maintain- ability over modular interactive application designs based on callbacks. Part of what makes Reactive Programming easy to use is its synchronous change propagation semantics: Changes are propagated such that no computation can ever observe an only partially updated state of the dataflow graph, i.e., each input change together with all dependent recomputations appears to be instantaneous. Traditionally, in local single-threaded applications, synchronous semantics are achieved through glitch freedom consistency: a recomputation may be executed only after all its dependencies have been recom- puted. In distributed applications though, this established approach breaks in two ways. First, glitch freedom implies synchronous semantics only if change propagations execute in isolation. Distributed applications are inherently exposed to concurrency in that multiple threads may propagate different changes concurrently. Ensuring isolation between concurrent change propagations requires the integra- tion of additional algorithms for concurrency control. Second, applications’ dataflow graphs are spread across multiple hosts. Therefore, distributed reactive programming requires algorithms for both glitch freedom and concurrency control that are decentralized, i.e., function without access to shared memory. A comprehensive survey of related prior works shows, that none have managed to solve this issue so far. This dissertation introduces FrameSweep, the first algorithm to provide synchronous propagation se- mantics for concurrent change propagation over dynamic distributed dataflow graphs. FrameSweep pro- vides isolation and glitch freedom through a combination of fine-grained concurrency control algorithms for linearizability and serializability from databases with several aspects of change propagation algo- rithms from Reactive Programming and Automatic Incrementalization. The correctness of FrameSweep is formally proven through the application of multiversion concurrency control theory. FrameSweep decentralizes all its algorithmic components, and can therefore be integrated into any reactive program- ming library in a syntactically transparent manner: Applications can continue to use the same syntax for Reactive Programming as before, without requiring any adaptations of their code. FrameSweep therefore provides the exact same semantics as traditional local single-threaded Reactive Programming through the exact same syntax. As a result, FrameSweep proves by example that interactive applications can reap all benefits of Reactive Programming even if they are concurrent or distributed. A comprehensive empirical evaluation measures through benchmarks, how FrameSweep’s perfor- mance and scalability are affected by a multitude of factors, e.g., thread contention, dataflow topology, dataflow topology changes, or distribution topology. It shows that FrameSweep’s performance compares favorably to alternative scheduling approaches with weaker guarantees in local applications. An exist- ing Reactive Programming application is migrated to FrameSweep to empirically verify the claims of semantic and syntactic transparency. 3 Zusammenfassung Verteilte Reaktive Programmierung ist eine Programmiertechnik zur modularen und zeitgleich deklara- tiven Implementierung verteilter interaktiver Anwendungen. Diese werden als ein über mehrere Rechner verteilter dynamischer Datenfluss-Graph aus voneinander abhängenden Berechnungen definiert, ähnlich zu Formeln in Tabellenkalkulation. Eine Laufzeitbibliothek propagiert eingehende Änderungen durch diesen Datenfluss-Graphen, indem sie die Ergebnisse betroffener Berechnungen neu berechnet und zugleich die Topologie des Datenfluss-Graphen an möglicherweise geänderte Abhängigkeitsbeziehun- gen anpasst. Nutzerstudien haben ergeben, dass Reaktive Programmierung Code-Qualität sowie Ver- ständlichkeit und Wartbarkeit von Programmen verbessert im Vergleich zu modularen Designs inter- aktiver Anwendungen basierend auf dem Beobachter-Entwurfsmuster. Ein Teil dieser Verbesserungen basiert auf synchroner Semantik für die Propagation von Änderungen: keine Neuberechnung können einen nur teilweise aktualisierten Zustand des Datenfluss-Graphen beobachten. Dies führt dazu, dass sämtliche Neuberechnungen infolge einer eingehenden Änderung augenscheinlich instantan stattfinden. Klassischerweise wurde synchrone Semantik in lokalen und nicht nebenläufigen Anwendungen durch das Sicherstellen der Konsistenzeigenschaft “Glitch-Freiheit” erreicht: jede Neuberechnung darf nur aus- geführt werden, nachdem alle nötigen Neuberechnungen ihrer Abhängigkeiten zuvor abgeschlossen wur- den. In verteilten Anwendungen sind existierende Ansätze aufgrund zweierlei Gründe jedoch nicht mehr anwendbar. Zum einen impliziert Glitch-Freiheit synchrone Semantik nur solange Propagationen von Än- derungen isoliert voneinander ausgeführt werden. Verteilte Anwendungen sind unweigerlich nebenläu- fig, was bedeutet, dass mehrere Änderungen zeitgleich durch denselben Datenfluss-Graphen propagiert werden. Um mehrere nebenläufig Änderungspropagationen voneinander zu isolieren, müssen daher Algorithmen zur Einschränkung der Nebenläufigkeit in die Laufzeitbibliothek integriert werden. Zum anderen ist der Datenfluss-Graph in verteilten Anwendungen über mehrere Rechner verteilt, welche nur über Netzwerkverbindungen miteinander kommunizieren können. Es können daher, sowohl zum Einhalten von Glitch-Freiheit als auch zur Einschränken von Nebenläufigkeit, ausschließlich Algorith- men eingesetzt werden, die dezentralisiert sind, was bedeutet dass sie ohne Zugriff auf gemeinsamen Arbeitsspeicher funktionieren müssen. Eine umfangreiche Studie themenverwandter früherer Arbeiten zeigt, dass bisher keine Lösung für diese Problemstellung existiert. Die vorliegende Dissertation präsentiert FrameSweep, den ersten Algorithmus der synchrone Seman- tik für nebenläufige Propagation von Änderungen auf dynamischen und verteilten Datenfluss-Graphen sicherstellt. FrameSweep isoliert nebenläufige Propagationen und stellt ihre Glitch-Freiheit sicher, in- dem es mehrere Algorithmen aus dem Feld der Datenbanken für atomar erscheinende Transaktionen mit Aspekten von Algorithmen zur Änderungspropagation aus den Gebieten der Reaktiven Program- mierung und der Automatischen Inkrementalisierung kombiniert. Die Korrektheit von FrameSweep wird durch Anwendung von establierter Theorie zur Nebenläufigkeitskontrolle durch Multiversionen formal bewiesen. FrameSweep dezentralisiert all seine algorithmischen Bestandteile und kann dadurch syntaktisch transparent in jegliche Laufzeitbibliotheken für Reaktive Programmierung integriert werden, was bedeutet, dass existierende Programme FrameSweep ohne Anpassungen ihres Quelltexts verwenden können. FrameSweep implementiert somit auf Basis identischer Syntax identische Semantik wie klassis- che, lokale, nicht-nebenläufige Reaktive Programmierung. Dadurch ist FrameSweep ein beispielhafter Beweis, dass interaktive Anwendungen alle Vorteile Reaktiver Programmierung genießen können, selbst wenn sie nebenläufige oder verteilte Systeme sind. Eine umfangreiche empirische Evaluation misst durch Benchmarks, wie sich die Performanz und Skalierbarkeit von FrameSweep verhalten unter diversen Faktoren wie mehr oder weniger häufige Zugriffskonflikte zwischen nebenläufigen Prozessen, Topologie des Datenfluss-Graphen, Änderungen 5 dieser Topologie, oder Topologie der Verteilung des Datenfluss-Graphen über verschiedene nur durch Netzwerk verbundene Rechner. Die Evaluation zeigt, dass Vergleiche der Performanz lokaler Anwen- dungen gegen globalen wechselseitigen Ausschluss und transaktionalen Speicher vorteilhaft zugunsten von FrameSweep ausfallen. Durch Migration einer bestehenden, mittels Reaktiver Programmierung im- plementierten Anwendung zu FrameSweep werden darüber hinaus die Behauptungen zu unveränderter Syntax und Semantik empirisch verifiziert. 6 Zusammenfassung Contents 1 Introduction 11 1.1 Problem Statement............................................ 12 1.2 Contributions................................................ 14 1.3 Structure.................................................
Details
-
File Typepdf
-
Upload Time-
-
Content LanguagesEnglish
-
Upload UserAnonymous/Not logged-in
-
File Pages147 Page
-
File Size-