Closed mclub4 closed 4 months ago
Spring Cloud Gateway 라이브러리에 있는 lua script 복사해서 내 로컬에 내 Redis에 실행을 해봤더니...
redis-cli --eval my_script.lua
위 명령어로 테스트 해봤을때는 첫번째 줄에서 오류가 안났었습니다. 즉, Lua Script가 작동한다는 것입니다. 그래서 아무래도 redis 라이브러리가 제대로 내 redis를 가르키지 못하는 것 같다고 느꼈습니다.
그래서
@Bean
@Primary
public ReactiveRedisConnectionFactory reactiveRedisConnectionFactory() {
return new LettuceConnectionFactory("redis", 6379);
}
@Bean
@Primary
public ReactiveRedisTemplate<String, Object> reactiveRedisTemplate(ReactiveRedisConnectionFactory factory) {
RedisSerializationContext<String, Object> serializationContext = RedisSerializationContext
.<String, Object>newSerializationContext(new StringRedisSerializer())
.hashKey(new StringRedisSerializer())
.hashValue(new StringRedisSerializer())
.build();
return new ReactiveRedisTemplate<>(factory, serializationContext);
}
이런식으로 제 Redis를 확실히 맵핑을 시켰더니
잘 작동합니다!
추후 코드 정리해서 PR 올리도록 하겠습니다.
What is the bug?
Redis Rate Limiter를 이용하여 Api Rate Limiter를 구현하려고 하는데, Lua 스크립트를 읽지 못해서 오류가 나는 현상
Under what circumstances does the bug occur?
위와같이 authFilter를 통과하고, 그다음 api rate limiter를 구현하기 위해 limitFilter를 통과하도록 구성했습니다. limit filter는 아래와 같이 구성했습니다.
그런데 rateLimiter.isAllowed(routeId, key)를 하는 과정에서, Token Bucket Algorithm을 적용하여 Api Rate Limiter를 적용하는 구조인데, Race Condition을 방지하기 위해서 Lua 스크립트를 통해서 진행한다고 합니다.
하지만, 해당 경로로 요청을 보낼 시,
attempt to call field 'replicate_commands' (a nil value) 라는 오류가 발생하게 됩니다. Lua 스크립트를 Redis가 제대로 읽지 못하는 것으로 추정됩니다. 하지만 원인을 모르겠습니다.
Redis 버전때문인가 생각이 들어서 Redis 3.2, 4.2, 5.0, 7.2 버전으로 전부 굴려봤지만 항상 동일한 오류가 뜹니다... 아무리 검색해봐도 원인을 알 수 없습니다...
자세한 코드는 back-gateway에 있는 spring cloud gateway 코드 참조해주시면 됩니다.
Expected Result
정상적으로 Token Bucket Algorithm이 적용되어야 합니다.
Reference Materials (Optional)
[ 참고자료 ]
참고자료 1 참고자료 2 참고자료 3 참고자료 4