2024. 2. 15. 21:10ㆍTIL
오늘은 카테고리 부분 일부 수정, 티켓 CRUD 가능한부분까지 코드작성, 이외엔 동시성 제어가 무엇인지 테스트코드는 어떻게 작성하는지에 대한 공부를 좀 하였다.
https://yeongchan1228.tistory.com/145
동시성 문제와 해결 방법들 - 1편 (Synchronized)
✔️ 문제 코드 @Entity class PostLike( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long = 0L, @Column(nullable = false) val postId: Long, likeCount: Long, ) { @Column(nullable = false) var likeCount: Long = likeCount private set f
yeongchan1228.tistory.com
공부하는데 참고가 많이 된 글이다.
여기선 좋아요 기능으로 테스트를 했는데
우리는 티켓팅을 기준으로 할것이다.
테스트코드 방법으로는 스레드를 여러개 사용하는 방법이있다.
여기서 또 스레드를 쓰는방법엔 코루틴등 여러가지 알아볼게 많다.
@Test
fun `멀티 스레드 환경에서 동시에 총 100개의 좋아요 증가 요청이 들어오면, 좋아요 수는 100이다`() {
// given
val postLike = postLikeRepository.save(PostLike(postId = 1L, likeCount = 0L))
val threadCount = 100
val executorService = Executors.newFixedThreadPool(20)
val countDownLatch = CountDownLatch(threadCount)
// when
repeat(threadCount) {
executorService.submit {
try {
postLikeService.increase(postLike.id)
} finally {
countDownLatch.countDown()
}
}
}
countDownLatch.await()
val findViewCount = postLikeRepository.getReferenceById(postLike.id)
출처: https://yeongchan1228.tistory.com/145 [Dev-Logs:티스토리]
100개의 좋아요를 동시에 눌렀을경우 좋아요는 100개가 증가해야하는게 맞지만 테스트결과는 그보다 훨씬 적은 21개가 나왔다고 한다.
이유는 경쟁조건 때문
멀티 스레드에 의한 경쟁 조건(Race Condition)이 발생하여 좋아요 수에 100이 저장되는 것이 아닌 21이 저장되었다.
공유 데이터(likeCount)에 스레드들이 동시에 접근해서 수정하기 때문에 순차적으로 좋아요가 증가되지 않는다. 즉, 스레드 1이 증가시킨 좋아요가 저장되기 전에 스레드 2가 좋아요를 조회하고 해당 값을 토대로 증가 로직을 실행하기 때문에 순차적인 증가가 이루어지지 않아 문제가 발생한다.
동시성이란, 어떠한 두 사건이 동시에 일어나는 것을 의미한다.
경쟁 조건(Race Condition)이란, 여러 프로세스 및 스레드가 동시에 공유 데이터에 접근하여 조작할 때, 접근 순서나 타이밍에 따라 예상했던 결과와 달라질 수 있는 상황을 의미한다.
그외에 아래에는 싱크로나이즈드 어노테이션을 알려주고있긴한데 데이터 정합성을 21에서 40몇으로 올려줄뿐 확실한 해결책이 되고있진 않았다.
현재 여기 글에선 정확한 해결방법을 알려주고있지는 않다. 이제 내일까지는 대부분의 CRUD를 작성 완료하고 나면 다음주 한주동안엔 이 동시성을 어떻게 제어하는지에대한 공부를 진행할 예정..
보니까 방법도 여러가지가 있던데 우리는 그중 레디스를 이용한 락킹을 사용해보지 않을까 싶다
'TIL' 카테고리의 다른 글
20240219 (월) 대용량 트래픽 프로젝트 - 동시성 제어 프로젝트 4일차 (0) | 2024.02.19 |
---|---|
20240216 (금) 대용량 트래픽 프로젝트 - 동시성 제어 프로젝트 3일차 (1) | 2024.02.16 |
20240214 (수) 대용량 트래픽 프로젝트 - 동시성 제어 프로젝트 1일차 (0) | 2024.02.14 |
20240213 (화) 개인 주특기 플러스 9일차 (0) | 2024.02.13 |
20240208 (목) 개인 주특기 플러스 8일차 (0) | 2024.02.08 |