-
Notifications
You must be signed in to change notification settings - Fork 0
[Fix/redis-connection] 레디스 커넥션 문제 해결 #84
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
|
[Socket Exception]
이 과정을 반복하다가 웹소켓 연결까지 모두 죽어버렸습니다. 네트워크 패킷 흐름을 확인해봤을때도 레디스 에러가 발생한 후 커넥션이 죽으며 IO가 줄어드는 모습을 확인했습니다.
기존의 로직에서는 레디스에 2번 요청을 주고 count가 최신이라면 위치를 업데이트했는데요. 두 가지 문제점이 있습니다.
레디스 내에서 동작하는 루아스크립트를 실행하도록 변경하여 compare and swap의 원자성을 보장하도록 했습니다. 하지만 해결되지 않음...
이게 프로세스 자체가 IO를 많이하면 다른 소켓에도 영향을 준다는 것인지는 아직도 이해가 잘 되지 않습니다. 그런데 우선 프로세스 전체의 IO를 줄여보는 방향으로 삽질을 했습니다.. -기존의 로직에서는 사용자의 위치 업데이트를 수신하면 바로 모든 사용자에게 broadcast하는 구조였습니다. 이러면 N명의 사용자가 동시에 웹소켓 연결을 맺고 달리기를 진행할때
문제는 해결했지만.
따라서 러닝이 종료되도 스레드가 쌓이고 있습니다. 러닝이 종료되면 스케줄러를 제거하는 방향으로 개발할 수 있지만, 클라이언트의 문제로 러닝 종료 이벤트를 수신하지
리액터 패턴 처럼, 만약 time-out인 세션이라면 다음 루프에 미리 삭제될 리스트에 넣어놓고 패스하고 나머지는 브로드캐스트하는 방식으로 짜보는게 어떨까요? 그냥 의사코드입니다 ㅎㅎ |
jeeheaG
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
아니 많은 일들이 있으셨군요,, 고생하셨습니다.
저도 redis NOAUTH 에러나고 보니까 패스워드 안쓰고 있길래 뭐지 했었는데 누락된 거였군여
위치 broadcast 로직은 이렇게 수정하셨다는 것으로 이해했습니다.
- 기존 로직 : 현재 위치 redis 에 업데이트 + ws broadcast 까지 했었는데
- 수정 로직 :
- 현재 위치 redis 에 업데이트
- 스케줄러로 등록되어있는 ws broadcast 로직 (러닝 시작 시 등록, 종료 시 제거)
이걸로 커넥션 에러가 개선된 것도 신기한데
이걸 분리해볼 생각은 어떤 시점에 하신건지 궁금하네요..
말씀해주신 것처럼 스레드 누수에 대한 방안은
TTL 설정과 마지막 업데이트 시각을 기준으로 하거나
또는 Run 엔티티에 현재 상태 컬럼을 추가한 후 종료상태인 Run의 스케쥴러를 제거하여 리소스 회수하도록 하면
누수에 어느정도 방어가 될 것 같습니다.
고민도 삽질도 많이 하셨던 게 느껴지는 내용 공유해주셔서 감사합니다.
고생많으셨습니다!!



연관된 이슈를 적어주세요 📌
#77
작업한 내용을 설명해주세요 ✔️
트러블 슈팅
부하테스트 시, 과도한 네트워크 IO로 lettuce가 죽어버리는 문제가 발생했습니다.

레디스 직렬화에러가 발생하여 새로운 RedisTemplate 객체를 빈으로 등록했습니다. 다만 RedisTemplate을 런타임에 2개 가지고있는 것이 염려되어 <String,String> 도 일괄적으로 처리할 수 있는지 확인해보고 개선하겠습니다.
리뷰어에게 하고 싶은 말을 적어주세요
확인하기
System.out을 제거했나요?