일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- formik
- Armeria
- 논블록킹 성능
- 개발 어렵당.ㅠ
- 월급루팡 일지
- UnsupportedOperationException
- OIDC
- jar 배포
- nodeSelector
- save/update
- RedirectService
- fake jwt
- nGinder
- jsonMarshaller
- 애자일 싫타
- intellij
- ㅉ때
- 플루터
- Loki 로그
- pinpoint
- LPOS
- 노드간 통신
- pinpoint 2.5.3
- Ingress Controller Fake
- reids
- 스프링Boot 개발환경
- hbase 저장공간 설정
- 핀포인트
- 더티체킹
- R2DBC Paging
- Today
- Total
대머리개발자
이벤트 서버의 성능 테스트 시작(2) 본문
길은 가면 뒤에 있다(?)
나도 누군가의 발자국을 따라 가고 싶다. 길은 티맵을 키면 된다^^ 있는길만 가자..젭알!
가다 보면 길이 있다(?) --> 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 에 있다.
우리내 시스템에서도 카프카를 써보고 싶지만
배보다 배꼽이 클듯하여...
카프카도 한 번 조져보고 싶은데.. 다음 기회에...
이제 백 만명이 몰려와도 끄덕 없을 것이다. 네이버 클라우드만 버텨준다면!!ㅋ...부디..
성능 테스트 고고싱 가즈아!!
'개발이야기 > 코틀린' 카테고리의 다른 글
아르메리아(Armeria) - ExceptionHandler (1) | 2024.01.03 |
---|---|
아르메리아 오류인듯...아닌듯. (1) | 2023.12.18 |
이벤트 서버의 성능 테스트 시작(1) (1) | 2023.11.20 |
이벤트 서버 개발 (0) | 2023.11.16 |
enum class 굳잡! (0) | 2023.10.25 |