【문제 설명】 사용자가 앱을 사용할 때 페이지가 매우 정체되어 무작위로 클릭하게 됩니다. 인터페이스가 반복 제출을 하지 않기 때문에, 서비스 계층에서는 동일한 요청이 여러 개 발생하고, 한 스레드는 완료 삽입이 이루어지지 않고, 다른 스레드는 빈 상태입니다. 그래서 저도 하나 삽입했어요. 원래는 모두가 하나씩 가지고 있었지만, 영업사원이 세 개를 가지고 있어 비즈니스 논리 오류가 발생했습니다. 악성 제출 처리는 프론트엔드 부분에서 할 수 있으며, 백엔드 부분에 성숙한 솔루션도 있을 수 있습니다.
【해결책】1. 트랜잭션의 멻등성 문제를 해결하기 위해 고유성 제약 조건을 사용하고, 반복 커밋이 발생할 경우 데이터베이스 수준에서 고유성 제약 조건에 대한 예외가 투입되어 비즈니스 로직이 파괴되지 않도록 합니다. 여러 필드의 합성에 대한 고유성 제약도 허용됩니다.
하이퍼링크 로그인이 보입니다.
위 내용은 데이터베이스 수준에서 중복 방지 설정을 만들기 위한 것입니다.
2. 코드 수준에서 중복 방지 설정을 구현합니다. 데이터베이스의 고유성 제약이 데이터 삽입의 효율성에 영향을 준다는 말이 많은데, 각 삽입마다 데이터베이스 수준에서의 판단이 필요하기 때문입니다. 따라서 코드 수준에서 보면, 코드 수준에서는 먼저 선택하고 삽입하는 것이 일반적인 관행이지만, 동시성이 높은 상황에서는 반복적인 커밋이 발생할 수 있습니다. 논리 코드에 동기화를 추가할 수 있어서, 동시성이 높은 상황에서는 먼저 선택하고 그 다음 삽입이 적용됩니다. 하지만 효율이 높지 않아 병렬이 직렬이 됩니다. DCL 잠금장치 사용도 가능합니다. (복사 케이스 모드에서 단일 객체를 생성하는 방법이 매우 유사하다는 것을 발견하셨나요? 먼저 객체가 존재하는지 판단하고, 존재하지 않으면 생성하지 말라), 자연스러운 DCL 잠금 메커니즘이 더 효율적입니다.
#分布式锁 분산 잠금도 이 문제를 해결하기 위해 사용되며, 일반적으로 Redis와 Zookeeper에서 사용됩니다. 이 섹션에서는 Redis를 이용해 분산 잠금을 구현하는 방법을 설명합니다. Redis에는 setNx 명령어 연산이 있는데, 존재하지 않으면 세트 값이고 1이 반환됩니다. 만약 존재한다면 설정하지 않고 0을 반환합니다. Redis의 싱글 스레딩 기능을 활용하여, 고동시성 장면을 메시지 큐를 통해 시리얼로 변환합니다. 하지만 분산 잠금에는 함정이 있으니 주의가 필요합니다.
하이퍼링크 로그인이 보입니다. 3. MVCC 메커니즘?
3.1 MVCC 메커니즘이란 무엇인가요? MVCC는 다중 버전 동시성 제어 메커니즘입니다.
3.2 어떤 문제들이 해결될 수 있을까? 잠금 메커니즘은 동시 작업을 제어할 수 있지만, 시스템 오버헤드가 크며, MVCC는 대부분의 경우 행 레벨 락을 대체할 수 있어 시스템 오버헤드를 줄이고 성능을 향상시킬 수 있습니다.
하이퍼링크 로그인이 보입니다.
4. 메시지에는 멩등성 문제도 존재한다
예를 들어, 메시지를 반복적으로 소비하는 것을 어떻게 방지할 수 있을까요?
MQ의 메시지 미들웨어에서는 이러한 것들을 반드시 이해해야 합니다.
|