13 They discard the most essential and appealing properties of sequential computation: understandability, predictability, and determinism. Threads, as a model of computation, are wildly nondeterministic, and the job of the programmer becomes one of pruning that nondeterminism.
(ohne explizit Aktoren o.ä. zu verwenden) in einem anderen Concurrency-Modell. • ThreadLocal ist jetzt ein Anti-Pattern! Am besten vermeiden, oder es ist zusätzliche Arbeit nötig. • Noch zu klären: Was heißt das eigentlich für I/O? 20
But there’s one thing we can all agree on: At high levels of concurrency (thousands of connections) your server needs to go to asynchronous non-blocking. [..] any part of your server code blocks you’re going to need a thread. And at these levels of concurrency, you can’t go creating threads for every connection. From https://strongloop.com/strongblog/node-js-is-faster-than-java/
(Sub-Thread-Level) Concurrency • Ist jeder Thread für n Tasks zuständig • Das n kann ziemlich groß sein So einen Thread wollen wir sicher nicht für Blocking I/O verschwenden!
Reactive bringt Sub-Thread-Level Concurrency mit sich. Darauf einstellen. • Non-Blocking I/O verwenden. Wenn es wirklich gar nicht geht: Blocking I/O isolieren. 28
class GreetingService { @Inject private JmsTemplate jmsTemplate; @PersistenceContext private EntityManager entityManager; public void createGreeting(String name) { Greeting greeting = new Greeting(name); this.entityManager.persist(greeting); this.jmsTemplate.convertAndSend("greetings", greeting); … Aber wenn ich so etwas benötige?
34 In general, application developers simply do not implement large scalable applications assuming distributed transactions. When they attempt to use distributed transactions, the projects founder because the performance costs and fragility make them impractical. [..]
year, bigger and bigger • If it fits on your machines, multiply by 10, if that fits, multiply by 1000… • Strive to scale almost linearly (N log N for some big log). Assumptions (Don’t Have to Prove These… Just Plain Believe Them) Grown-Ups Don’t Use Distributed Transactions •The apps using distributed transactions become too fragile… • Let’s just consider local transactions. ! Multiple disjoint scopes of serializability Want Scale-Agnostic Apps • Two layers to the application: scale-agnostic and scale-aware • Consider scale-agnostic API Scale Agnostic Code Scale-Aware-Code Application Upper Layer Lower Layer Scale Agnostic API
Transaktionen („2PC“) sind eine häufige Quelle für Abbrüche und Contention. Sie können oft vermieden werden. Generell können lokale Transaktionen und at-least-once Delivery sie ersetzen. Das Saga-Pattern ist eine praktische Umsetzung von „all- or-nothing“ für verteilte Systeme.
Die Datenbanklandschaft ändert sind, wir bewegen uns in Richtung „event sourcing“ und „Immutability“. Das ist interessant für Reaktive Systeme! „All-or-nothing“ Probleme hängen zusammen mit dem Wunsch, eine globale Wahrheit zu kennen im „Jetzt“. Aber was ist jetzt? Ein Zeitpunkt - oder der Ergebnis einer Folge von Ereignissen? Empfehlung: „The Illusion of Present“ von Jonas Bonér.
Reactive bringt Sub-Thread-Level Concurrency mit sich. Darauf einstellen. • Non-Blocking I/O verwenden. Wenn es wirklich gar nicht geht: Blocking I/O isolieren. • Keine verteilten Transaktionen verwenden. Wenn es wirklich gar nicht anders geht: Isolieren. 42
46 Die Servlet API wurde für Thread-per-Request und synchrone I/O entwickelt. Wenn man Application Servers nicht als Container für mehrere Applikationen nutzt - was unterscheidet sie von einer Library? Erfordert Ops-Änderungen, aber Tools etablieren sich.
Reactive bringt Sub-Thread-Level Concurrency mit sich. Darauf einstellen. • Non-Blocking I/O verwenden. Wenn es wirklich gar nicht geht: Blocking I/O isolieren. • Keine verteilten Transaktionen verwenden. Wenn es wirklich gar nicht anders geht: Isolieren. • Keinen App-Server / Servlet-Container verwenden. 47
Threads die kleinste Concurrency-Einheit in deinem Code sind, oder • Du Blocking I/O verwendest (ohne klare Trennung), oder • Du 2-Phase-Commit verwendest, oder • Du einen Java EE Application Server / Servlet Container verwendest dann ist deine Applikation nicht Reactive.