Zespół, w którym pracował Jarek, odnosił sukcesy w kwestii mikroserwisów na długo przed tym, zanim wokół nich rozpętała się istna burza. W czasie swojej prelekcji przedstawił rozwiązania, które ów zespół zastosował podczas pracy w pewnym banku, wśród których znalazły się m.in. duże maszyny serwerowe, ciekawe rozwiązania komunikacyjne i sposoby przechowywania danych. Jego wystąpienie to także overview tego, co w projekcie było fajne, a co było błędem (i jak wypadałoby to zrobić lepiej).
[QE 2018] Paul Gerrard – Automating Assurance: Tools, Collaboration and DevOps
[FDD 2016] Jarosław Porwoł - Koncert na 144 rdzenie i czterech dyrygentów
1. Koncert na 144 rdzenie i czterech dyrygentów
- mikroserwisy w aplikacjach obliczeniowych
Jarosław Porwoł
@pako1337
2. Jarosław Porwoł (@pako1337)
Czego się dowiesz
Co zrobiliśmy w projekcie bankowym
Dlaczego mikroserwisy
Co poszło dobrze
Co mogło pójść lepiej
Koncert na 144 rdzenie i czterech dyrygentów
3. Jarosław Porwoł (@pako1337)
O mnie
Programuję od roku 2000
Płacą mi za to od roku 2009
Różne projekty (web, desktop, mobilne – iOS, bank)
Koncert na 144 rdzenie i czterech dyrygentów
4. Jarosław Porwoł (@pako1337)
Co zrobiliśmy
Obliczanie ryzyka inwestycyjnego dla banku
Setki tysięcy aktywnych transakcji
Dziesiątki współczynników i raportów
Kilku użytkowników
Koncert na 144 rdzenie i czterech dyrygentów
5. Jarosław Porwoł (@pako1337)
Jaki był problem
Duże źródła danych
Różne raporty, od kilku sekund, to kilkudziesięciu
minut
Różne ścieżki wykonania (różne konfiguracje, potrzeby
użytkownika)
Koncert na 144 rdzenie i czterech dyrygentów
7. Jarosław Porwoł (@pako1337)
Klient prosi o nową funkcjonalność
Osobne aplikacje – osobne procesy developmentu ✔
Lekkie środowisko developerskie – uruchamiaj tylko to,
co potrzebujesz ✔
Proste uruchomienie ✔
Koncert na 144 rdzenie i czterech dyrygentów
8. Jarosław Porwoł (@pako1337)
Klient wysyła żądanie
Skalowalność rozwiązania ✔
System kolejkowy jako komunikacja ✔
Dobre środowisko produkcyjne (6 * 24 rdzenie, ~30GB
RAMu), + środowisko awaryjne, na wszelki wypadek ✔
Koncert na 144 rdzenie i czterech dyrygentów
9. Jarosław Porwoł (@pako1337)
Serwis raportów gromadzi dane
Parallel.ForEach nie pomoże ze wszystkim X
Inne rdzenie są zajęte innymi żądaniami – nie zagłódź
serwisu!
Koncert na 144 rdzenie i czterech dyrygentów
10. Jarosław Porwoł (@pako1337)
Serwis raportów gromadzi dane
Parallel.ForEach(tradeSet, ts => {
var marketData = GetMarketData(ts);
marketData.Wait();
});
// max degree of parallelism -> 24 (24 cores)
Koncert na 144 rdzenie i czterech dyrygentów
11. Jarosław Porwoł (@pako1337)
Serwis raportów gromadzi dane
var marketDataSet = new List<MarketData>();
foreach (var ts in tradeSet)
{
var marketData = GetMarketData(ts);
marketDataSet.Add(marketData);
});
Task.WaitAll(marketDataSet);
Koncert na 144 rdzenie i czterech dyrygentów
12. Jarosław Porwoł (@pako1337)
Serwis raportów wysyła żądania
Długie żądania między serwisami X
Unikaj żądań blokujących
Wszystko asynchroniczne
Koncert na 144 rdzenie i czterech dyrygentów
15. Jarosław Porwoł (@pako1337)
Serwis raportów wysyła żądania
Synchronizacja serwisów
Sagi – śledź wyniki wysłanych żądań
Kontynuuj zadanie gdy wszystkie wysłane żądania
zakończone
Koncert na 144 rdzenie i czterech dyrygentów
16. Jarosław Porwoł (@pako1337)
Serwis raportów gromadzi dane
Odwołania do zewnętrznych – kilka(naście) sekund
Cache danych - kilkadziesiąt(set) milisekund ✔
Koncert na 144 rdzenie i czterech dyrygentów
Raporty
Serwis
zewnętrzny
Raporty Cache
17. Jarosław Porwoł (@pako1337)
Klient się rozmyślił
Anulowanie żądań X
Śledź żądania (correlation id)
Wyślij cancelation token
Przed obsługą żądania – sprawdź czy nie zostało anulowane
Koncert na 144 rdzenie i czterech dyrygentów
18. Jarosław Porwoł (@pako1337)
Serwis natrafił na błąd
Watchdog ✔
Szybka reakcja na problemy z serwisami
Restart serwisu w razie problemów
Gwarantuje odpowiednią ilość różnych serwisów
Koncert na 144 rdzenie i czterech dyrygentów
19. Jarosław Porwoł (@pako1337)
Klient wysłał skomplikowane zapytanie
Auto-skalowanie X
Dostosuj ilość serwisów do potrzeb dynamicznie
Load balancing X
Rozdzielaj żądania między maszynami
Koncert na 144 rdzenie i czterech dyrygentów
21. Jarosław Porwoł (@pako1337)
Co poszło źle
Agreguj logi z jednego żądania ✔
Correlation ID
ID Procesu, wątku
Koncert na 144 rdzenie i czterech dyrygentów
22. Jarosław Porwoł (@pako1337)
Co poszło źle
Logi dostępne z jednego miejsca X
Splunk
Elasticsearch, LogStash, Kibana
Inne?
Koncert na 144 rdzenie i czterech dyrygentów
24. Jarosław Porwoł (@pako1337)
Podsumowanie
Wszystkie wymagania spełnione
Stabilny, stosunkowo wydajny system
Stosunkowo łatwy w developmencie i obsłudze
Trudne śledzenie błędów i debugowanie
Błędy w kodzie/architekturze obniżają przepustowość
Koncert na 144 rdzenie i czterech dyrygentów
25. Jarosław Porwoł (@pako1337)
Koncert na 144 rdzenie i czterech dyrygentów
- mikroserwisy w aplikacjach obliczeniowych
jporwol@future-processing.com
Editor's Notes
Avoid mistake of small parallelization - send all requests at once, be careful with parallel sending- you may wait for some requests to complete before you can send next batch
Be careful with parallel computing - remember other cores are busy with other requrests being processed
Cache as much as you can, in high load systems you will spend a lot of time getting data from database etc.
Different requests – different data. But if trades not changed – why load new ones. If market not changed – why load new one?
Have some way to cancel requests from user interface - it is better to cancel computing than to spend time waiting for results that are wrong/no longer needed
If there are bunch of requests for specific service, it would be nice to have some way to respond to that with more processing power
Killing services that are not doing anything at the moment for performance gains in other services would be good
Debugging in distributed environemtn where one action creates multiple concurrent requests is very hard
Your application has to have logging with info like: what failed, on what machine, at what time.
If those logs are available only on that machine – it is gonna be hard to work with. You need to aggregate logs from different machines into one system
Your application has to have logging with info like: what failed, on what machine, at what time.
If those logs are available only on that machine – it is gonna be hard to work with. You need to aggregate logs from different machines into one system
Your application has to have logging with info like: what failed, on what machine, at what time.
If those logs are available only on that machine – it is gonna be hard to work with. You need to aggregate logs from different machines into one system