대머리개발자

이벤트 서버의 성능 테스트 시작(2) 본문

개발이야기/코틀린

이벤트 서버의 성능 테스트 시작(2)

대머리개발자 2023. 11. 22. 10:59
728x90

길은 가면 뒤에 있다(?)

나도 누군가의 발자국을 따라 가고 싶다. 길은 티맵을 키면 된다^^ 있는길만 가자..젭알!

 

가다 보면 길이 있다(?)  --> while( true ) {

                                               삽질 

                                               얻어 걸려 ? break 

                                           } 

 

일단 해결을 본 코드...삽질 포함 반나절을 고민해서 20줄 짜리 코드 하나 두둥;;

    fun join(eventId: Long): Mono<Int> {
        val eventKey = "event:${eventId}"
        val eventUserKey = "user:${RequestContext.getUserId()}"
        val rLock = RedisConfig.getLock("$eventKey:lock")
        
        val nano = System.nanoTime()
        val monoLock = rLock.lock(nano)
        return monoLock.then(
                    Mono.zip(
                        RedisConfig.joinNumber(eventKey),
                        RedisConfig.joinLimit("$eventKey:limit"),
                    )
                    .filter { tuple -> tuple.t1 < tuple.t2 }
                    .flatMap { RedisConfig.setJoin(eventKey, eventUserKey) }
                    .filter { isOk -> isOk }
                    .flatMap { rLock.unlock(nano).then( Mono.just( 1)) }
                    .switchIfEmpty( Mono.defer { rLock.unlock(nano).then(Mono.just(-1)) })  // 참여자 수 체크 && 중복 체크
        )
    }

 

# 시행착오를 돌아 보자!!

1. tryLock으로 진행 시 아래 오류가 너무 많이 발생했다.

>> lock에 대한 ID를 지정하고 해당 하는 ID를 unlock하는 형태로 진행

>> 결국 다시 tryLock으로  락이 안 풀려 서버가 반응을 못한다 ㅠ 적절하게 인자값 조절스

java.lang.IllegalMonitorStateException: attempt to unlock lock, not locked by current thread by node id: 8eabecae-5e96-4a7d-a8d1-f6baa7a48637 thread-id: 458476205343000
	at org.redisson.RedissonBaseLock.lambda$unlockAsync$3(RedissonBaseLock.java:332) ~[redisson-3.19.3.jar:3.19.3]
	at java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934) ~[na:na]
	at java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911) ~[na:na]
	at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) ~[na:na]
	at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2147) ~[na:na]
	at org.redisson.command.CommandBatchService.lambda$executeAsync$7(CommandBatchService.java:322) ~[redisson-3.19.3.jar:3.19.3]
	at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863) ~[na:na]
	at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:841) ~[na:na]
	at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) ~[na:na]
	at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2147) ~[na:na]
	at org.redisson.command.RedisCommonBatchExecutor.handleResult(RedisCommonBatchExecutor.java:163) ~[redisson-3.19.3.jar:3.19.3]

 

2. 스프링에서 제공해주는 레디스 라이브러리를 쓰다가 Redisson 교체하면서 이슈 발생

기존 레거시 코드들이 있기 때문에 병행(같이)해서 쓰려고 했는데

reactiveRedisOperations을 통해서 주입한 값을 redissonReactiveClient을 통해서 꺼내려고 하니 예외 발생스!!

뭐가 잘 못된줄 모르니 ㅋㅋ 엄한데 가서 삽질 하고 리액티브 욕을 했다. 아우!!

 

시원하게  flushall 날리고 정상 ok

implementation 'org.springframework.boot:spring-boot-starter-data-redis-reactive'
-->
implementation 'org.redisson:redisson-spring-boot-starter:3.19.3'

 

 

3. 리액티브 스타일 코드가 정말 익숙해지지가 않는다.

https://d2.naver.com/helloworld/2771091

이것만 알 면 finish가 될 듯.. 정리한 친구랑 친구하고 싶다... 역시 네이버 썽님! ㅎ

 

4. 레디스를 이용한 락을 하기 전에 시도 해본 것들

 - Thread.sleep를 먹여 주면 60컷 근사치는 간다..

 - 리액티브 자체에서 제공해주는 delayelement()는 씨알도...

 - ReentrantLock 이 친구를 이용한 tryLock도 실상 sleep랑 동일한 효과 

 그냥 한 시도는 아니다. --> 리액티브를 조금 이해 하면 왜 try 해봤는지 알 수 있을듯하다. 힌트는 pub - sub 에 있다.

 

우리내 시스템에서도 카프카를 써보고 싶지만

배보다 배꼽이 클듯하여...

카프카도 한 번 조져보고 싶은데.. 다음 기회에... 

 

이제 백 만명이 몰려와도 끄덕 없을 것이다. 네이버 클라우드만 버텨준다면!!ㅋ...부디..

성능 테스트 고고싱 가즈아!!

728x90