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 "add_like_{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.
#systemdesign #programowanie
