Lutz Hühnken | @lutzhuehnken | Typesafe
Von „Enterprise“ zu „Reactive“
Slide 2
Slide 2 text
Von Enterprise zu Reactive
@lutzhuehnken
Reactive „for the rest of us“..
Big Data
Web Scale
HFT
Tomcat
Web MVC
RDBMS
Slide 3
Slide 3 text
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
Slide 4
Slide 4 text
Von Enterprise zu Reactive
@lutzhuehnken
Was ist Reactive?
Slide 5
Slide 5 text
Von Enterprise zu Reactive
@lutzhuehnken
Was ist Reactive?
Behauptet doch jeder von sich…
Slide 6
Slide 6 text
Von Enterprise zu Reactive
@lutzhuehnken
Was ist Reactive?
Alles Akka, oder was?
Slide 7
Slide 7 text
Von Enterprise zu Reactive
@lutzhuehnken
Mal anders: Fragen, die
wir immer wieder
hören
Slide 8
Slide 8 text
Von Enterprise zu Reactive
@lutzhuehnken
WAR?
Servlet Container?
Web Layer
Library X
(nutzt ThreadLocal)
?
Slide 9
Slide 9 text
Von Enterprise zu Reactive
@lutzhuehnken
Kann ich das
nutzen mit RDBMS/
JDBC?
Backend
Wie mache ich 2PC?
Slide 10
Slide 10 text
Von Enterprise zu Reactive
@lutzhuehnken
Thread per Request
Slide 11
Slide 11 text
Von Enterprise zu Reactive
@lutzhuehnken
n Threads per m Requests
Slide 12
Slide 12 text
Von Enterprise zu Reactive
@lutzhuehnken
n Threads per m Requests
Effekt: Kleinere Einheit der Nebenläufigkeit (Task level
concurrency)
Slide 13
Slide 13 text
Von Enterprise zu Reactive
@lutzhuehnken
Kleiner Exkurs: Gilt auch für Aktoren
(Überhaupt: Gemeinsamkeit (einiger) reaktiver Systeme)
Slide 14
Slide 14 text
Von Enterprise zu Reactive
@lutzhuehnken
n Threads per m Requests
Was heißt das für ThreadLocal?
Slide 15
Slide 15 text
Von Enterprise zu Reactive
@lutzhuehnken
n Threads per m Requests
Was heißt das für I/O?
Slide 16
Slide 16 text
Von Enterprise zu Reactive
@lutzhuehnken
n Threads per m Requests
In Tomcat / Servlet Container?
Slide 17
Slide 17 text
Von Enterprise zu Reactive
@lutzhuehnken
Konsequenzen (alpha)
• Servlet Container
• ThreadLocal
• Blocking I/O
werden zu Anti-Pattern. Vermeiden!
Slide 18
Slide 18 text
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
Slide 19
Slide 19 text
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
Slide 20
Slide 20 text
Von Enterprise zu Reactive
@lutzhuehnken
Konsequenzen (beta)
• auf Servlet Container und ThreadLocal
verzichten
• Blocking I/O vermeiden. Im Notfall:
Isolieren.
Slide 21
Slide 21 text
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
Slide 22
Slide 22 text
Von Enterprise zu Reactive
@lutzhuehnken
Slide 23
Slide 23 text
Von Enterprise zu Reactive
@lutzhuehnken
Vermeiden
this.entityManager.persist(greeting);
this.jmsTemplate.convertAndSend("greetings", greeting);
…
Warum nicht separater Abgleich (Reconciliation)?
In unserem kleinen Beispiel:
Slide 24
Slide 24 text
Von Enterprise zu Reactive
@lutzhuehnken
Trennen
Jeder 2 PC kann durch asynchrones Messaging
ausgedrückt werden!
Slide 25
Slide 25 text
Von Enterprise zu Reactive
@lutzhuehnken
2PC => Messaging
Kleine Einschränkung - Voraussetzungen:
•tentative operations
•at-least-once delivery
•idempotent messages
Item-B
Cancellation Tentative
Op
Item-A
Slide 26
Slide 26 text
Von Enterprise zu Reactive
@lutzhuehnken
Verwerten
Service A
(Reactive)
Service B
(Legacy)
Slide 27
Slide 27 text
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
Slide 28
Slide 28 text
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?
Slide 29
Slide 29 text
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)
Slide 30
Slide 30 text
Von Enterprise zu Reactive
@lutzhuehnken
Nicht von mir! Sondern von John Rose, Java VM Architect, JFokus, Stockholm, February 2015
Slide 31
Slide 31 text
Von Enterprise zu Reactive
@lutzhuehnken
• Prinzipien der Supervision & Isolation
• Let it crash!
Slide 32
Slide 32 text
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..?
Slide 33
Slide 33 text
Von Enterprise zu Reactive
@lutzhuehnken
Vielen Dank
lutz.huehnken@typesafe.com
Twitter: @lutzhuehnken
Kommt zum Typesafe-Stand!
(In der Nähe der Garderobe)
Geht zu den anderen „Reactive“ Vorträgen!