선착순 쿠폰 이벤트 개발기를 진행한 뒤 분산락에 대해서 알게 되어 스핀락보다 분산락이 더 효율적이라는 생각에 redis 클라이언트를 변경해보았다.
implementation 'org.redisson:redisson-spring-boot-starter:3.16.8'
@Bean
public RedissonConnectionFactory redissonConnectionFactory(RedissonClient redissonClient) {
return new RedissonConnectionFactory(redissonClient);
}
@Bean
public RedissonClient redissonClient() {
Config config = new Config();
config.useSingleServer()
.setAddress(
"redis://" + redisProperties.getHost() + ":" + redisProperties.getPort()
)
.setPassword(redisProperties.getPassword());
return Redisson.create(config);
}
public long register(CouponEventRegisterRequest couponEventRegisterRequest) {
return getScoredSortedSet(CouponProperties.getKey())
.addAndGetRank(System.currentTimeMillis(), couponEventRegisterRequest);
}
lettuce를 사용했을때
redisson를 사용했을때 tps 20% 증가, 전체 처리량 15%, 최고 tps 30%가량 늘어났다.
Redis는 Jedis, Lettuce, Redisson등 여러가지 Client가 있는데, Lettuce의 lock 방식은 spin lock이어서 요청이 많아질수록 레디스가 받는 부하가 늘어난다.
반면에 Redisson은 pub/sub 기능을 사용하여 일일이 요청을 보낼 필요 없이lock이 해제될 때까지 기다린 뒤, lock을 획득할 수 있다.
redisson은 lettuce에 비해 레퍼런스가 찾기 어려웠지만, 성능개선이 이루어져서 다행이다.
매번 12초에 병목이 생기는데 이유를 찾아보자
참고