Zookeeper w akcji

programowanie równoległe

Jarosław Kostrz

Witam!

Jarosław Kostrz
Team Leader w Brand Fibres - VML

Plan

  • Krótkie wprowadzenie teoretyczne do programowania równoległego
  • Omówienie Zookeepera
  • Przykład kodu

Serwery mają co raz więcej wątków

 Warto je maksymalnie wykorzystać!

Problemy

  • wyścig/hazard
  • synchronizacja
  • zakleszczenie
  • zagłodzenie

Wyścig

Efekt oczekiwany

Efekt możliwy

Wątek 1 Wątek 2 Zmienna
0
odczyt 0
inkrementacja
0
zapis 1
odczyt 1
inkrementacja 1
zapis 2
Wątek 1 Wątek 2 Zmienna
0
odczyt 0
odczyt 0
inkrementacja 0
inkrementacja 0
zapis 1
zapis 1

Synchronizacja

  • Sekcja krytyczna - fragment kodu bądź zasób, który w danej chwili może być wykorzystywany przez co najwyżej jeden wątek
  • Bariera - służy do wstrzymywania przetwarzania wątków do momentu osiągnięcia przez wszystkie wątki tego samego miejsca w kodzie

Bariera

Wątek 1

Wątek 2

Wątek 3

Zakleszczenie

Jest to sytuacja w której Wątek 1 uzyskał zasób A i czeka aż Wątek 2 zwolni dostęp do zasobu B, podczas gdy Wątek 2 uzyskał zasób B i czeka aż Wątek 1 zwolni dostęp do zasobu A.

Wątek 1

Wątek 2

Zasób A

Zasób B

Zagłodzenie

Sytuacja w której danemu wątkowi cały czas odmawiany jest dostęp do zasobu, którego potrzebuje by wykonać swoje zadanie.

Jak radzić sobie z koordynacją pracy wielu procesów?

Zookeeper jest narzędziem pomagającym w poprawnej implementacji algorytmów pozwalających na koordynację równoległego i rozproszonego środowiska.

Zookeeper pomaga zaimplementować:

  • przechowywanie konfiguracji 
  • grupy procesów
  • bariery
  • semafory
  • kolejki
  • dwufazowe potwierdzenie (two-phased commit)
  • wybór lidera

Zookeeper - Model danych

  • hierarchia - jak w systemie plików
  • każdy element jest nazywany znode
  • każdy znode przechowuje dane i może mieć dzieci
  • każdy znode jest identyfikowany określoną ścieżką
  • możemy nasłychować na każdym znode
  • numer wersji danych jest inkrementowany z każdą zmianą

Jarosław Kostrz - PHPCon 2016

Zookeeper - Gwarantuje

  • sekwencyjność operacji
  • atomowość
  • spójność w całym klastrze
  • niezawodność
  • aktualność danych

Jarosław Kostrz - PHPCon 2016

Implementacja zamka

  1. Wywołujemy create( ) podając my_path/my_lock/lock-     z flagami sequence i ephemeral
  2. Wywołujemy getChildren( ) na znodzie na którym utworzyliśmy my_path/my_lock
  3. Jeśli ścieżka którą utworzyliśmy w kroku 1 ma najmniejszy numer to udało nam się założyć blokadę, możemy zakończyć protokół blokady.
  4. Jeśli nie to musimy poczekać i po chwili wrócić do punktu 2.

Protokół zakładania zamka

Kawałki kodu

Przykłady z życia wzięte:

  • przechowywanie sesji
  • zapisywanie koszyka w sklepie
  • użytkownicy online
  • synchronizacja konfiguracji
  • blokada artykułu w CMS

Przydatne linki

Dziękuję!

Jarosław Kostrz

Made with Slides.com