defGruba ryba
19piorunówJest 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.

@def oooo będę to przerabiał niego, dzięki xd
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?
@wombatDaiquiri wystarczy, że z rana odpalą trollom nowy przekaz dnia z Nowogrodzkiej. Albo pojawią się nieprzychylne Partii sondaże :smiley:
@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 (?)
@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)