4Developers 2015: REST w praktyce - tej dobrej i tej złej - Jakub Kubryński
4Developers 2015: Jaka piękna katastrofa w doskonałym świecie, rzecz o architekturze skazanej na...
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ę
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
0.5-1 nanosekund
Procesor -> L1 cache
7 nanosekund
Procesor -> L2 cache
100 nanosekund
Procesor -> RAM
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ą
Drugie poprawione prawo wyłączności i inercji systemów
rozproszonych „inaczej” w
świetle wszechogarniającej teorii
wszystkiego
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
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”
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
gdy producent produkuje więcej niż odbiorca
może przetworzyć
kolejki i bufory o nieograniczonym rozmiarze
(unbounded queues)
asynchroniczna komunikacja
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);
}
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