【Opis problemu】 Gdy użytkownicy korzystają z aplikacji, strona jest bardzo zablokowana i klikają losowo, ponieważ interfejs nie wykonuje powtarzających się zgłoszeń, pojawia się kilka identycznych żądań; na warstwie usługowej jeden wątek nie wstawia się kompletny, a drugi sprawdza "pusty". Więc też włożyłem jeden. Początkowo każdy miał jeden, ale sprzedawca miał trzy, co skutkowało błędami logiki biznesowej. W przypadku przetwarzania złośliwych zgłoszeń można to zrobić w części front-endowej, a w części back-endowej mogą być dostępne dojrzałe rozwiązania.
【Rozwiązanie】1. Użycie ograniczeń jednoznaczności do rozwiązania problemu idempotencji transakcji, ustalenie ograniczeń unikalności, a jeśli wystąpi scenariusz powtarzających się commitów, wyjątki od ograniczeń jednoznaczności zostaną wprowadzone na poziomie bazy danych, a logika biznesowa nie zostanie zniszczona. Dopuszczalne są również ograniczenia jednoznaczności dotyczące składania wielu pól.
Logowanie do linku jest widoczne.
Powyższe ma na celu wprowadzenie ustawień antyduplikacyjnych na poziomie bazy danych.
2. Realizuj ustawienia antyduplikacyjne na poziomie kodu. Często mówi się, że ograniczenie jednoznaczności bazy danych wpływa na efektywność wprowadzania danych, ponieważ każde wstawianie wymaga oceny na poziomie bazy danych. Dlatego, patrząc na poziom kodu, powszechną praktyką na poziomie kodu jest najpierw zaznaczenie, a następnie wstawienie, ale jeśli wystąpi duży scenariusz współbieżności, nadal będą powtarzać się zatwierdzenia. Możesz dodać synchronizację do kodu logicznego, tak aby w scenariuszach o dużej równobieżności najpierw zaznaczyć zaznaczenie, a potem wstawić w życie. Jednak efektywność nie jest wysoka i równoległość staje się szeregowa. Można zastosować mechanizm zamka DCL. (Czy zauważyłeś, że metoda tworzenia pojedynczego obiektu w trybie kopiowania jest bardzo podobna – najpierw oceń, czy obiekt istnieje, jeśli nie istnieje, stwórz go, w przeciwnym razie nie tworz go), naturalny mechanizm blokady DCL jest bardziej wydajny.
#分布式锁 Do rozwiązania problemu można również stosować rozproszone zamki, powszechnie stosowane przez Redis i Zookeeper. Ta sekcja wyjaśnia, jak implementować rozproszone blokady za pomocą Redis. W Redis istnieje operacja setNx, jeśli nie istnieje, jest to wartość ustalona i zwracana jest 1. Jeśli istnieje, nie jest ustawiony i zwraca 0. Wykorzystując funkcję jednowątkowej Redis, scena o wysokiej równocześności jest zamieniana w szeregowy przez kolejkę wiadomości. Jednak w rozproszonych zamkach są pewne pułapki, więc musisz uważać.
Logowanie do linku jest widoczne. 3. Mechanizm MVCC?
3.1 Czym jest mechanizm MVCC? MVCC to mechanizm kontroli współbieżności wielowersyjnej.
3.2 Jakie problemy można rozwiązać? Mechanizm blokujący może kontrolować operacje równoległe, ale jego narzut jest duży, a MVCC może w większości przypadków zastąpić zamki na poziomie rzędów, co może zmniejszyć narzut systemu i poprawić wydajność.
Logowanie do linku jest widoczne.
4. Istnieje także problem idempotencji w komunikatach
Na przykład, jak zapobiec powtarzającemu się konsumowaniu wiadomości?
W middleware wiadomości w MQ muszą one być zrozumiane i zrozumiane.
|