작성자 없음
작성자 정보가 삭제된 글입니다.
작성
·
765
-1
안녕하세요 좋은 강의 감사드립니다.
이전까지 알아보았던 락들은 분산락이 아닌 것인가요?
만약 아닌 것이라면 다중 서버 환경에서 동시성 문제를 해결하기 위해서는 위의 방법들이 아닌 분산락을 사용하여야 하는 것인지 궁금합니다.
추가로 동시성 관련 질문이 하나 있습니다.
다중 서버 환경에서 게시판 등에서 조회수 기능을 동시성 문제 없이 해결하고 싶으며, 다음과 같이 구현하고자 합니다.
(조회수라 어느정도 누락되어도 상관 없다고 하실 수 있겠지만, 목표는 하나도 누락되지 않게 하는 것입니다!)
조회 요청이 들어오면 레디스에 조회수 증가분을 올린 이후, 특정 시간마다 배치처리를 통해 반영하고자 합니다.
이때 다음 두 의문점이 있습니다.
먼저 다중 서버 환경에서 레디스 증가분을 올리는 경우, 이 경우에도 동시성 문제가 발생할 수 있을 것 같습니다. 이를 해결하기 위해서는 이곳에도 분산락을 걸거나 increment()를 사용하여 동기적으로 처리해야 할 거 같은데 저의 생각이 맞는 것인지, 맞다면 다른 방법은 없는지 궁금합니다.
두번째는 레디스 조회수 증가분을 배치처리를 통해 반영시키는 경우, 해당 작업 사이에 조회수 증가가 되어버리면 해당 증가분은 누락될 것 같습니다. 이를 해결하기 위해서는 배치처리를 할 때 레디스에 Lock을 걸어야 할 것 같습니다. 그런데 그렇게 된다면, 배치처리가 진행되는 그 순간동안은 레디스가 블로킹되어 있기에 게시글 조회가 이루어지지 않을 것 같습니다. 이정도는 감수하고 사용하거나, 혹은 카프카 등을 활용하여 이벤트로 처리하는 방법도 있을 것 같은데, 이러한 방법이 모두 사용 가능한 것인지, 더 나은 방법은 없는지 궁금합니다.
너무 많은 질문을 하는 것 같아 죄송합니다.
좋은 강의 정말 감사합니다.
답변 1
4
신동훈님 안녕하세요.
이전까지 알아보았던 락들은 분산락이 아닌 것인가요?
이전까지 알아보았던 락들이 어떤것을 말씀하시는지 감이 안 잡히네요..
mysql 을 이용하는 방법들을 말씀하시는것이라면 분산락을 사용하는 방법중 하나라고 생각하시면 좋을 듯합니다.
다중 서버 환경에서 게시판 등에서 조회수 기능을 동시성 문제 없이 해결하고 싶으며, 다음과 같이 구현하고자 합니다.
redis 의 경우에는 연산을 싱글스레드로 동작하기때문에 동시성이 보장됩니다. 그렇기때문에 increment() 를 사용한 후 해당값을 배치를 통해 백업을 시켜주면 될 것같습니다.
레디스 증가분을 배치를 통해 반영시킬때 별도의 락은 필요없을 듯합니다.
그 이유는 1번 게시물의 조회수를 배치를 통해 반영시키는동안 조회수는 계속 올라갈것입니다.
예를들어 1번 게시물의 10:00 시점 조회수가 1000이고 이것을 배치를 통해 반영한다고 가정해보겠습니다. 추가로 배치는 1분이 걸린다고 가정해보겠습니다.
배치는 1번 게시물의 10:00 시점 조회수 (1000) 로 DB 에 갱신을 시작합니다.
10:00~10:01 동안 100번의 조회수가 추가되어 1100 번이 되었습니다.
10:01 분에 DB 에는 1000 이라는 조회수로 갱신이 되었습니다.
10:00~10:01 동안 추가된 조회수는 다음 배치때 DB 에 갱신시켜주면 됩니다.
그렇게되면 누락은 발생되지 않습니다.
말씀해주신대로 방법은 굉장히 많고 카프카를 통한 처리방식도 가능합니다만 정합성이 중요한 경우에만 사용할듯합니다.