Hejto.pl
Dodaj post

Wpisz coś do wyszukania (minimum 2 znaki)

#systemdesign

Gruba ryba

w Hydepark

19piorunów

Jest to wpis testowy, więc nie bijcie

W pracy często spotykam się z brakiem zrozumienia problemu latencji w replikacji danych. Wyobraźmy sobie sytuację: mamy aplikacje hejto, która zapisuje piorun użytkownika w bazie, mamy 5 instancji MySQL w konfiguracji master-master. Przyjmijmy, że mamy tabelkę user_post_likes która ma pola user_id, post_id. Endopoint wygląda następująco:

Header: Authorization Bearer ...
POST /posts/{id}/like

Endpoint najpierw sprawdza czy użytkownik nie dodał już wpisu przez zapytanie do sql, jeśli nie to dodaje w tabelce wpis, wszystko dzieje się w transakcji, bo developer był sprytny.

Użytkownik szybko klika 2 razy pioruna: robią się 2 wpisy w tabelce, zdziwiony developer nie wie jak to się mogło stać, przecież użył transakcji.

Pierwszy request przez load balancer połaczył się z instnacją aplikacji połączonej do instancji A bazy danych, natomiast drugi do instancji B, gdzie dane nie zostały jeszcze zsynchronizowane.

Aby uniknąć takiej sytuacji używam redisa z dość krótkim trzymaniej danych i kluczem "addlike{id_post}.{id_usera}", jeśli znajdzie taki wpis, to nie dodaje jeszcze raz wpisu do bazy. Przed taką sytuacją uchroni też index unique, ale powoduje to zazwyczaj inne problemy.



Koneser0piorunów

@def oooo będę to przerabiał niego, dzięki xd

Gruba ryba1piorunów

@def

Przed taką sytuacją uchroni też index unique, ale powoduje to zazwyczaj inne problemy.

Tzn. jakie? Masz realnie produkcyjnie ruch taki że MySQL nie wyrabia z opierdoleniem lajków? Pracujesz w Facebooku?

Autorytet0piorunów

@wombatDaiquiri wystarczy, że z rana odpalą trollom nowy przekaz dnia z Nowogrodzkiej. Albo pojawią się nieprzychylne Partii sondaże :smiley:

Gruba ryba0piorunów

@cododiaska wątpię. Wydaje mi się że mówimy o dziesiątkach tysięcy operacji na sekundę. W Polsce jestem prawie pewien że żaden portal nie ma takiego ruchu. Albo mówimy o naprawdę masywnych tabelach bez indeksów (?)

Gruba ryba1piorunów

@wombatDaiquiri to nie byl realny przyklad, ale w codziennej pracy kam problem, gdzie na kolejkach przerzucamy duze ilosci rekordow, index unique powoduje wtedy wywalenie sie polaczenia z baza (kwestia ftameworka)

Pokaż więcej komentarzy (8)