Slide 1

Slide 1 text

HTTP Clients bohaterowie systemów rozproszonych Adam Dubiel

Slide 2

Slide 2 text

16 mln użytkowników 350 mikrousług 400 mikrousług 502 mikrousługi 500+ inżynierów

Slide 3

Slide 3 text

Skylab team lead Andamio: JVM service starter Hermes pubsub

Slide 4

Slide 4 text

Klienci HTTP których znamy

Slide 5

Slide 5 text

Klienci HTTP których znamy RestTemplate restTemplate = new RestTemplate(); Client client = ClientBuilder.newBuilder().build(); AsyncRestTemplate asyncRestTemplate = new AsyncRestTemplate(); Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.github.com/") .build();

Slide 6

Slide 6 text

Klienci HTTP o których dyskutujemy restTemplate.getForEntity("https://github.com", Map.class); jerseyClient.target("https://github.com").request().get();

Slide 7

Slide 7 text

Klienci dyskutujemy HTTP których o async.getForEntity("https://allegro.pl",Map.class).addCallback( { ResponseEntity result -> /* success! */ }, { Throwable ex -> /* failure :( */ } ) jersey.target("https://allegro.pl").request().async().get();

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

We need to go deeper RestTemplate.getForEntity -> RestTemplate.doExecute -> HttpAccessor.createRequest -> ClientHttpRequestFactory.createRequest -> SimpleClientHttpRequestFactory -> URL.openConnection -> HttpURLConnection

Slide 11

Slide 11 text

We need to go deeper Client.get -> JerseyInvocation.invoke -> ClientRuntime.invoke -> Connector.apply -> HttpUrlConnector._apply -> DefaultConnectionFactory.getConnection -> URL.openConnection() -> HttpURLConnection

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

Async na pewno daje nam super moc! a może i nie..

Slide 15

Slide 15 text

Async all the things AsyncRestTemplate.getForEntity -> AsyncRestTemplate.doExecute -> AsyncHttpAccessor.createAsyncRequest -> AsyncClientHttpRequestFactory.createAsyncRequest -> ... -> ... -> HttpURLConnection

Slide 16

Slide 16 text

Async all the things Client.async.get -> JerseyInvocation.submit -> ClientRuntime.submit -> Connector.apply -> ... -> ... -> ... -> HttpURLConnection

Slide 17

Slide 17 text

Przestańmy dyskutować o syntax sugar Wrócimy do tego jak rozwiążemy poważne problemy

Slide 18

Slide 18 text

API vs Implementation RestTemplate Jersey AsyncRestTemplate Retrofit HttpURLConnection Apache Client Apache NIO (Async) Client OkHttp

Slide 19

Slide 19 text

API vs Implementation RestTemplate Jersey AsyncRestTemplate Retrofit HttpURLConnection Apache Client Apache NIO (Async) Client OkHttp

Slide 20

Slide 20 text

Jak wybrać implementacje?

Slide 21

Slide 21 text

Wróćmy do korzeni The network is reliable. Latency is zero. Bandwidth is infinite. The network is secure. Topology doesn't change. There is one administrator. Transport cost is zero. The network is homogeneous.

Slide 22

Slide 22 text

Fallacies of distributed computing The network is reliable. Latency is zero. Bandwidth is infinite. The network is secure. Topology doesn't change. There is one administrator. Transport cost is zero. The network is homogeneous.

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

Latency is zero Czy opóźnienia są zerowe? To kiedy muszę czekać? A mogę nie czekać na połączenia? Ke? Nie Przy zestawianiu połączenia i każdym requescie Użyj puli połączeń

Slide 25

Slide 25 text

Pule połączeń

Slide 26

Slide 26 text

Koszt połączenia HTTP TCP jesteś tu ale nie zapominaj o tym!

Slide 27

Slide 27 text

Koszt połączenia conn request / response conn request / response conn request / response conn request / response

Slide 28

Slide 28 text

Koszt połączenia vs sieć jest stabilna conn request / response

Slide 29

Slide 29 text

Koszt połączenia conn request / response request / response request / response request / response

Slide 30

Slide 30 text

https://shkspr.mobi/blog/wp-content/uploads/2016/05/A-pet-cat-typing-on-a-computer-keyboard.jpg

Slide 31

Slide 31 text

Połączenia w puli połączeń available available leased leased

Slide 32

Slide 32 text

Połączenia w puli połączeń leased leased leased leased pending

Slide 33

Slide 33 text

Fallacies of distributed computing The network is reliable. Latency is zero. Bandwidth is infinite. The network is secure. Topology doesn't change. There is one administrator. Transport cost is zero. The network is homogeneous.

Slide 34

Slide 34 text

Network is reliable Czy zależności działają zawsze? Skąd mogę wiedzieć, że nie działają? Ke? Nie Ustawiaj timeouty

Slide 35

Slide 35 text

Timeouts

Slide 36

Slide 36 text

Connection timeout conn request / response hmm działało szybciej.. skoczyć po piwo? dobra, jeszcze chwila i idę o! działa

Slide 37

Slide 37 text

Connection timeout ograniczenie czasu potrzebnego na nawiązanie połączenia default zależy od systemu (mierzone w dziesiątkach sekund) zdrowy default: 200ms (ale zmierz, zanim to ustawisz!)

Slide 38

Slide 38 text

Socket/read timeout conn request / response request response response o, dane lecą ej, dajcie resztę! a gdzie reszta?

Slide 39

Slide 39 text

Socket read/timeout czas pomiędzy odebraniem kolejnych paczek danych default zależy od systemu (mierzone w sekundach) docelowe ustawienie zależy od czasu odpowiedzi poszczególnych zależności

Slide 40

Slide 40 text

Timeouts == fail fast

Slide 41

Slide 41 text

http://cdn.viralscape.com/wp-content/uploads/2014/09/Computer-Cat.jpg

Slide 42

Slide 42 text

Thread model

Slide 43

Slide 43 text

IO thread model Remote Server My Thread 1 conn response

Slide 44

Slide 44 text

NIO thread model Remote Server My Thread 1 OS IO Thread nie blokuj wątku IO!

Slide 45

Slide 45 text

IO vs NIO HttpURLConnection Apache HTTP Client OkHttp Apache Async HTTP Client Netty based Undertow based

Slide 46

Slide 46 text

Wybierając implementację, pytaj czy mam jakąś pulę połączeń i jaki jest jej rozmiar? jakie mam timeouty? jaki jest model wątków?

Slide 47

Slide 47 text

Porozmawiajmy o API Skoro poważne rzeczy mamy za sobą

Slide 48

Slide 48 text

Szefa oszukasz, scrum mastera oszukasz, ale wątków nie oszukasz

Slide 49

Slide 49 text

Jeśli mój kod nie blokuje, to gdzie czekam na odpowiedź?

Slide 50

Slide 50 text

Co chowają przed nami API? MyThread AsyncRestTemplate Remote Server MAGIA...

Slide 51

Slide 51 text

MAGIA... Co chowają przed nami API? MyThread AsyncRestTemplate Remote Server Thread 1 Thread 2 Thread 3 Thread N

Slide 52

Slide 52 text

Wybierając API, pytaj na jakim wątku działa mój kod? jak duża jest pula wątków? jak mogę ją kontrolować?

Slide 53

Slide 53 text

Wybierając klienta HTTP, pytaj czy mam jakąś pulę połączeń i jaki jest jej rozmiar? jakie mam timeouty? jaki jest model wątków? na jakim wątku działa mój kod? jak duża jest pula wątków? jak mogę ją kontrolować?

Slide 54

Slide 54 text

github.com/adamdubiel @dubieladam allegro.pl/praca

Slide 55

Slide 55 text

Wybierając klienta HTTP, pytaj czy mam jakąś pulę połączeń i jaki jest jej rozmiar? jakie mam timeouty? jaki jest model wątków? na jakim wątku działa mój kod? jak duża jest pula wątków? jak mogę ją kontrolować?