4Developers 2015: Jaka piękna katastrofa w doskonałym świecie, rzecz o architekturze skazanej na...

54
Słowem wstępu Nie jest moją intencją urazić kogokolwiek na tej sali Humor i żarty nie były testowane na zwierzętach Żadne też mniejszości nie zostały Celowo pominięte Wszelkie próby cenzury są daremne I tak powiem co myślę

Transcript of 4Developers 2015: Jaka piękna katastrofa w doskonałym świecie, rzecz o architekturze skazanej na...

Słowem wstępu

Nie jest moją intencją urazić kogokolwiek na tej sali

Humor i żarty nie były testowane na zwierzętach

Żadne też mniejszości nie zostałyCelowo pominięte

Wszelkie próby cenzury są daremneI tak powiem co myślę

Jaka piękna katastrofa w doskonałym świecie

rzecz o architekturze skazanej na klęskę

czyli

Dzień z życia świra

Kim jestem?Podróżnik wiedziony na manowce

przez technologie

Wyznawca kościoła JVM

Archeolog kodu odziedziczonego

Symentis.pl @j_palka

Programowanie rozproszone

To sztuka rozwiązywania tego samego problemu, który możesz

Rozwiązać na jednym komputerze,Przy użyciu wielu komputerów

System rozproszony

Gdzie awaria komputera o którego istnieniu nie wiedziałeś

Czyni twój program bezużytecznym Ktoś, kiedyś, w Internetach

prędkość światła

1 nanosekunda=

30 cm

0.5-1 nanosekund

Procesor -> L1 cache

7 nanosekund

Procesor -> L2 cache

100 nanosekund

Procesor -> RAM

Wszystkiemu winne?

Organizacje

Ludzie

Oprogramowanie (ale nie moje:) )

Sprzęt

Pierwsze I ostatnie przykazanie

w teorii zupełnej i kompletnejsystemów

kompletnie rozproszonychI

zupełnie spieprzonych

„fail fast”

upadnijdopóki ty to kontrolujesz

w przeciwnym wypadkuto

upadek przejmie kontrolęnad Tobą

Co ryzykujesz?

utratę danychspójność danych

opóźnienia„efekt domina”

Stabilnysystem

Stabilnie, ale jakoś inaczej

Z teorii dynamiki systemów

inflow|

capacity|

outflow

inflow > outflow

capacity != const

delay = Tout-Tin

Drugie poprawione prawo wyłączności i inercji systemów

rozproszonych „inaczej” w

świetle wszechogarniającej teorii

wszystkiego

„tragedy of commons”

nie dziel się

procesorempamięcią

operacjami I/O

„chmury”wirtualizacja

kontenery

współczesna wersja socjalizmu

wszystkim po równo

procesy wsadowekopie zapasowe

automatyczne skalowanie

zachłanni kliencinieoptymalnie napisany kod

pijani sysadmini

system to układ naczyń połączonych

gdy jeden z systemów nie odpowiada

Propagacja opóźnienia

Propagacja błędu

… z zapomnianej ...Księgi Upadłych Systemów

supervisor

proces który jest odpowiedzialny za uruchamianie,

zatrzymywaniei monitorowanie innych procesów

Ale to już było

actor model(erlang, akka)

unix daemons(supervisord, eye, god)

circuit braker

„aka”

„g..no uderzyło w wentylator”

Remote Procedure Callaka

Rozpacz Programisty Czarna

CORBA, RMI, SOAP

grpc.io (to jest jakiś żart, tak?)

Mikrousługi = RPC^N

Prawdopodobieństwo rośnie Geometrycznie

Naturalnym stanem takich systemów Jest

„huston mamy problem”

Ktoś zapomniał wam powiedzieć?

class SimpleCircuitBraker {

final int threshold;final AtomicLong counter;

<T> T call(Supplier<T> call) {

if (counter.get() > threshold) {throw new CircuitBrakerOpen();

}

try {return call.get();

} catch (Exception e) {counter.incrementAndGet();throw e;

}}

boolean close() {return counter.getAndSet(0) != 0;

}

}

Jeśli potrzebujesz coś bardziej wymyślnego

Netflix/Hystrix

Latency and Fault Tolerance for Distributed Systems

import com.netflix.hystrix.HystrixCommand;import com.netflix.hystrix.HystrixCommandGroupKey;

public class HelloWorldCommand extends HystrixCommand<String> {

private final String name;

public HelloWorldCommand(String name) {super(HystrixCommandGroupKey.Factory.asKey("HelloGroup"));this.name = name;

}

@Overrideprotected String run() throws Exception {

return format("Hello %s", name);}

@Overrideprotected String getFallback() {

return format("World is crueal Mr. %s", name);}

}

public class HelloWorldCommandTest {

@Testpublic void test_synchronous() {

String result = new HelloWorldCommand("Jarek").execute();assertEquals("Hello Jarek", result);

Future<String> future = new HelloWorldCommand("Jarek").queue();

Observable<String> observable = new HelloWorldCommand("Jarek").observe();

}

circuitBreaker.enabled

circuitBreaker.requestVolumeThreshold

circuitBreaker.sleepWindowInMilliseconds

circuitBreaker.errorThresholdPercentage

Robotnicy, kolejki i SEDA

SEDA

Staged Event Driven Architecture

By Matt Welsh, Eric Brewer

ciśnienie zwrotne(backpressure)

gdy producent produkuje więcej niż odbiorca

może przetworzyć

kolejki i bufory o nieograniczonym rozmiarze

(unbounded queues)

asynchroniczna komunikacja

RxJava

Akka

Reactive Streams

public static Observable<Integer> hotStreamOfInts() {return Observable.create((Subscriber<? super Integer> s) -> {

int i = 0;while (!s.isUnsubscribed()) {

s.onNext(i++);try {

Thread.sleep((long) (Math.random() * 10));} catch (Exception e) {

}}

} ).subscribeOn(Schedulers.newThread());}

public static int doExpensiveWork(int i) {try {

Thread.sleep(100);} catch (InterruptedException e) {}return i;

}

public static void main(String[] args) {

hotStreamOfInts().onBackpressureDrop().observeOn(Schedulers.computation()).map(Main::doExpensiveWork).toBlocking().forEach(System.out::println);

}

Gwarantowana dostawa

Często kojarzony zEnterprise Integration Patterns

Apache Camel, Mule ESB, Spring Integration

odtworzyć wiadomości/rządaniaw kolejności

w jakiej zostały wysłane

github:sbtourist/Journal.IO

Journal journal = JournalBuilder.of(new File("/tmp")).open();

journal.write(new String("Hello world!!!").getBytes(), WriteType.SYNC);

Iterable<Location> redo = journal.redo();

for (Location location : redo) {System.out.println(new String(journal.read(location, ReadType.SYNC)));

}

Podsumowań czas

Nie panikujKtoś już w to wdepnął :)

supervisorcircuit braker

SEDAbackpressure

guaranteed delivery

O czym nie powiedziałem a chciałbym

(złapcie mnie w przerwie)

organizacjewyznawcy „....jowo ale stabilnie”

ludzieto nie mój problem,

mój kod? To niemożliwe

Let the eternal stream of byte codeFlows through your body