💣 Problem
부하테스트를 진행하는 도중 es에서 조회수 업데이트 과정에서 버전충돌이 발생했습니다. ES에서는, 누군가가 동시에 같은 문서를 수정할 수 있다는 가능성을 염두에 두고 다음과 같은 메커니즘을 사용합니다.
- 클라이언트가 문서를 가져옴
- 문서를 수정하려고 할 때 이전 정보와 일치해야만 업데이트 가능
- 하지만, 이미 다른 트랜잭션에서 업데이트 해버리고 버전 충돌과 함께 서버 응답 500 발생
다음과 같은 조회수 업데이트 문제는 에러가 발생하지는 않았지만 JPA의 엔티티에서도 발생하고 있었습니다. 또한, 별도의 코드를 작성하지 않아서 조회수 이외에도 검색 데이터에 대한 업데이트가 반영되지 않고 있었습니다.
🪜 Solution
문제를 정리하면 다음과 같습니다.
- 유저 검색 데이터, 단일작품-전시회 검색 데이터 조회수를 포함한 모든 데이터가 검색에 한해서 업데이트 반영되지 않는 문제 발생
- RDBMS 엔티티에서 잘못된 조회수 업데이트 발생
- 비관적 락이 없는 일반 SELECT로 읽어오고 조회수 업데이트 하면서 실제 조회수보다 작은 수로 업데이트 되는 경우 발생
- ES에서 버전 기반 업데이트에서 충돌 발생하고 500 응답
- 조회수 이외에 검색 데이터 업데이트도 반영되지 않고 있음
- 단일작품 타이틀, 이미지 등
- 게시글 작가의 닉네임, 프로필 이미지, 자기소개 등
문제해결을 위한 방식은 다음과 같습니다.