33
Lutz Hühnken | @lutzhuehnken | Typesafe Von „Enterprise“ zu „Reactive“

Von "Enterprise" zu "Reactive" (JAX 2015)

Embed Size (px)

Citation preview

Lutz Hühnken | @lutzhuehnken | Typesafe

Von „Enterprise“ zu „Reactive“

Von Enterprise zu Reactive@lutzhuehnken

Reactive „for the rest of us“..

Big DataWeb Scale

HFT

TomcatWeb MVCRDBMS

Von Enterprise zu Reactive@lutzhuehnken

Was ist Enterprise?

Im Sinne dieses Vortrags:

• Alles, was auf Java EE basiert

• Insbesondere Servlet API basierte Webapps, z.B. auf Tomcat

Von Enterprise zu Reactive@lutzhuehnken

Was ist Reactive?

Von Enterprise zu Reactive@lutzhuehnken

Was ist Reactive?

Behauptet doch jeder von sich…

Von Enterprise zu Reactive@lutzhuehnken

Was ist Reactive?

Alles Akka, oder was?

Von Enterprise zu Reactive@lutzhuehnken

Mal anders: Fragen, die wir immer wieder

hören

Von Enterprise zu Reactive@lutzhuehnken

WAR? Servlet Container?

Web Layer

Library X (nutzt ThreadLocal)

?

Von Enterprise zu Reactive@lutzhuehnken

Kann ich das nutzen mit RDBMS/

JDBC?

Backend

Wie mache ich 2PC?

Von Enterprise zu Reactive@lutzhuehnken

Thread per Request

Von Enterprise zu Reactive@lutzhuehnken

n Threads per m Requests

Von Enterprise zu Reactive@lutzhuehnken

n Threads per m Requests

Effekt: Kleinere Einheit der Nebenläufigkeit (Task level concurrency)

Von Enterprise zu Reactive@lutzhuehnken

Kleiner Exkurs: Gilt auch für Aktoren

(Überhaupt: Gemeinsamkeit (einiger) reaktiver Systeme)

Von Enterprise zu Reactive@lutzhuehnken

n Threads per m Requests

Was heißt das für ThreadLocal?

Von Enterprise zu Reactive@lutzhuehnken

n Threads per m Requests

Was heißt das für I/O?

Von Enterprise zu Reactive@lutzhuehnken

n Threads per m Requests

In Tomcat / Servlet Container?

Von Enterprise zu Reactive@lutzhuehnken

Konsequenzen (alpha)

• Servlet Container

• ThreadLocal

• Blocking I/O

werden zu Anti-Pattern. Vermeiden!

Von Enterprise zu Reactive@lutzhuehnken

Jetzt habe ich aber so etwas..try { stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(query); while (rs.next()) { String coffeeName = rs.getString("COF_NAME"); int supplierID = rs.getInt("SUP_ID"); float price = rs.getFloat("PRICE"); int sales = rs.getInt("SALES"); int total = rs.getInt("TOTAL"); System.out.println(coffeeName + "\t" + supplierID + "\t" + price + "\t" + sales +

Blocking I/O, Sorgenkind JDBC

Von Enterprise zu Reactive@lutzhuehnken

Isolieren!

Bei vert.x „Worker Verticle“ Bei Play/Akka: Volle Kontrolle über Dispatcher

Nicht nur für JDBC, generell für „blocking“ code

Von Enterprise zu Reactive@lutzhuehnken

Konsequenzen (beta)

• auf Servlet Container und ThreadLocal verzichten

• Blocking I/O vermeiden. Im Notfall: Isolieren.

Von Enterprise zu Reactive@lutzhuehnken

Jetzt habe ich aber so etwas.. @Transactional public static 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); …

Verteilte Transaktion

Von Enterprise zu Reactive@lutzhuehnken

Von Enterprise zu Reactive@lutzhuehnken

Vermeiden

this.entityManager.persist(greeting); this.jmsTemplate.convertAndSend("greetings", greeting); …

Warum nicht separater Abgleich (Reconciliation)?

In unserem kleinen Beispiel:

Von Enterprise zu Reactive@lutzhuehnken

TrennenJeder 2 PC kann durch asynchrones Messaging

ausgedrückt werden!

Von Enterprise zu Reactive@lutzhuehnken

2PC => MessagingKleine Einschränkung - Voraussetzungen:

•tentative operations•at-least-once delivery•idempotent messages

Item-B Cancellation Tentative Op

Item-A

Von Enterprise zu Reactive@lutzhuehnken

Verwerten

Service A (Reactive)

Service B (Legacy)

Von Enterprise zu Reactive@lutzhuehnken

Konsequenzen (1.0)

• auf Servlet Container und ThreadLocal verzichten

• Blocking I/O vermeiden. Im Notfall: Isolieren.

• Distributed Tx: Vermeiden, trennen, verwerten

Von Enterprise zu Reactive@lutzhuehnken

Warum das Ganze?

• Wir haben gesehen: Ich kann auch meine „normale“ Geschäftsanwendung reactive machen, und dabei Kompromisse eingehen.

• Was bringt mir das?

Von Enterprise zu Reactive@lutzhuehnken

• Heißt nicht nur „web scale“.

• Effizient sein. Moderne Hardware nutzen (Many Core, NUMA)

• Von Innovation profitieren (s. Brian Goetz gestern)

Von Enterprise zu Reactive@lutzhuehnken

Nicht von mir! Sondern von John Rose, Java VM Architect, JFokus, Stockholm, February 2015

Von Enterprise zu Reactive@lutzhuehnken

• Prinzipien der Supervision & Isolation

• Let it crash!

Von Enterprise zu Reactive@lutzhuehnken

• Spaß!!

• Ernsthaft. All das ist nicht entwickelt worden, um unser Leben komplizierter zu machen. Sondern einfacher!

• Wie würdest du es mit Menschen lösen..?

Von Enterprise zu Reactive@lutzhuehnken

Vielen Dank

[email protected]

Twitter: @lutzhuehnken

Kommt zum Typesafe-Stand!(In der Nähe der Garderobe)

Geht zu den anderen „Reactive“ Vorträgen!