Upgrade to Pro — share decks privately, control downloads, hide ads and more …

[PL] We all make distributed systems - RG Dev

mrzasa
January 26, 2017

[PL] We all make distributed systems - RG Dev

Growing complexity of web and mobile apps makes then distributed systems. That's why it's reasonable to apply some results of distributed system research to web and mobile apps.

Slides for a talk given on Rzeszów Developer Meetup: https://www.meetup.com/rg-dev/events/236341099/.
I show how CAP theorem can be used to understand and handle limitations in modern web and mobile applications.

mrzasa

January 26, 2017
Tweet

More Decks by mrzasa

Other Decks in Programming

Transcript

  1. WE ALL MAKE WE ALL MAKE WE ALL MAKE WE

    ALL MAKE WE ALL MAKE WE ALL MAKE WE ALL MAKE WE ALL MAKE WE ALL MAKE WE ALL MAKE WE ALL MAKE WE ALL MAKE WE ALL MAKE WE ALL MAKE WE ALL MAKE WE ALL MAKE DISTRIBUTED SYSTEMS DISTRIBUTED SYSTEMS DISTRIBUTED SYSTEMS DISTRIBUTED SYSTEMS DISTRIBUTED SYSTEMS DISTRIBUTED SYSTEMS MACIEJ RZĄSA @mjrzasa
  2. KIM JESTEM? Software Engineer główne zainteresowania Ruby writing software that

    matters samoorganizacja systemy rozproszone (okazjonalnie) dzielenie się wiedzą Rzeszów Ruby User Group ( ) Politechnika Rzeszowska rrug.pl
  3. O CZYM POWIEM? Why? - dlaczego warto się zająć systemami

    rozproszonymi What? - ograniczenia systemów rozproszonych How? - case study
  4. single-copy consistency nie to samo co w ACID zapisuję na

    androidzie, czytam na komputerze CONSISTENCY
  5. spójność i odporność na podziały zapewniona spójność nie ma offline,

    działa tylko jak jest sieć ew. ograniczone funkcje (read-only) proste pobranie danych po powrocie połączenia CP: ORDNUNG MUSS SEIN
  6. CASE STUDY jak na to trafiłem? dziedzina: recycling aplikacja mobilna

    dla agentów + webowy panel admina offline: skupowanie, rejestr płatności
  7. ARCHITEKTURA offline: AP, reszta: CP wymagana synchronizacja i rozwiązywanie konfliktów

    wyzwania rozmiar danych walidacje spójność (ACID) po stronie klienta identyfikacja edycja offline
  8. SYNC SYNC SYNC SYNC SYNC SYNC SYNC SYNC SYNC SYNC

    ALL THE DATA! ALL THE DATA! ALL THE DATA! ALL THE DATA! ALL THE DATA! ALL THE DATA! źródło: memegenerator.com
  9. SYNC - ONE WAY (CP) cenniki, publikowane ~1/tydzień, wiele o

    tej samej porze pierwsza wersja: wszystkie zmiany na raz większa ilość danych: timeouty, braki pamięci na androidzie rozwiązanie: paginacja!
  10. ONE WAY SYNC pobieranie danych do odczytu offline klient przechowuje

    timestamp klient może decydować o ilości przesyłanych danych
  11. SYNC - TWO WAY (AP) zapis paragonów (paragon, kupione przedmioty)

    skupowanie offline (!) każdy klient (android) tworzy swoje paragony i dodaje przedmioty paragony dostępne na serwerze i rozsyłane do innych klientów
  12. CLIENT SERVER SYNC - TWO WAY (AP) def sync() timestamp

    = get_timestamp() client_changes = choose_updated(timestamp) server_changes = send(client_changes, timestamp) # wait... store(server_changes) set_timestamp(Time.now()) end def sync(client_changes, timestamp) server_changes = choose_updated(timestamp) store(client_changes) send(server_changes) end
  13. EDYCJA PARAGONÓW anulowanie paragonów (zakupów) na serwerze zmienione paragony wysyłane

    do klientów FAIL! obie strony edytują paragon: serwer wygrywa rozwiązanie: synronizacja zmian statusu, a nie całych paragonów
  14. ONE DOES NOT SIMPLY ONE DOES NOT SIMPLY ONE DOES

    NOT SIMPLY ONE DOES NOT SIMPLY ONE DOES NOT SIMPLY ONE DOES NOT SIMPLY ONE DOES NOT SIMPLY ONE DOES NOT SIMPLY ONE DOES NOT SIMPLY ONE DOES NOT SIMPLY SYNC MUTABLE STATE SYNC MUTABLE STATE SYNC MUTABLE STATE SYNC MUTABLE STATE SYNC MUTABLE STATE SYNC MUTABLE STATE źródło: youtube.com
  15. RETRANSMISJA I IDENTYFIKACJA def sync(data) create_transaction(data) account.redeem(data.amount) end PUT /transactions

    { amount: 1000 } def sync(data) transaction = find_transaction(data.uuid) if transaction return end create_transaction(data) account.redeem(data.amount) end PUT /transactions { uuid: "2db1ec4c-...", amount: 1000 }
  16. WSPÓŁDZIELONE IDENTYFIKATORY AUTOINCREMENT z bazy danych nie wystarczy ;-) UUID

    (v4) bardzo niskie ryzyko kolizji może być generowany po stronie klienta pomocniczy identyfikator albo klucz główny e4043456-b29e-4d80-afaf-4d65246f1d36
  17. SKUTEK: IDEMPOTENTNOŚĆ If all you have is a timeout, everything

    looks like a partition synchronizacja może być powtarzana dowolną ilość razy pomocne przy błędach (sieci, serwera, klienta) zastosowanie: tworzenie danych po stronie klienta offline: notatki zakupy commity ;-)
  18. CZEGO SIĘ NAUCZYŁEM? paginacji przy pomocy timestampów i rozmiaru strony

    poprawnej synchronizacji dwustronnej dbania o bezpieczeństwo danych podczas błędów (idempotencja) GET /items? since=1234 page_size3
  19. PODSUMOWANIE naturalne ograniczenia z systemów rozproszonych w web/mobile są naturalne

    ;-) CAP: spójność - dostępność - odporność na podziały: nie możesz mieć wszystkiego synchronizuj to, co niezmienne i aplikuj od zmiennego (events vs entities) idempotency matters :) w jednej aplikacji można stosować zarówno podejście CP jak i AP sieć jest zawodna ikony w diagramach pochodzą ze strony: http:/ /www.flaticon.com
  20. MATERIAŁY ikony w diagramach pochodzą ze strony: : testy bezpieczeństwa

    (safety) systemów rozproszonych : o zawodności sieci http:/ /www.flaticon.com CAP 12 years later Jepsen Netwok is reliable