Redis에서 presence(현재 접속중인 인원)을 관리하는 방법과, 에러 시 처리방법 #41
Replies: 3 comments 3 replies
-
|
저도 저거 한번 확인한 적이 있었는데, 결국에 제대로 구현하려면 1, 2번 다 필요할 것 같아요. 그리고 지금 프론트엔드 딴에서는 이미 하트비트를 계속 쏘고 있더라고요. 기본값인지 에이전트가 직접 구현한 건지는 모르겠는데, 저희도 하트비트를 클라이언트한테 쏘게 만들어서 둘 중 하나가 하트비트를 받지 못하면 Redis에서 세션을 제거하는 로직이 필요할 것 같아요 |
Beta Was this translation helpful? Give feedback.
-
|
Redis에서 Set으로 세션 관리가 되는 부분은 어떻게 제거해야 하는지 물어봤는데, Redis Keyspace Notification을 이용한다고 해요. 이것에 대한 클로드 코드 답변입니다!
|
Beta Was this translation helpful? Give feedback.
-
|
TTL 설정
TTL은 누가 갱신할 것인가
근데 이벤트 기반의 문제는, 서버가 꺼져서 이벤트가 유실되면 복구할 방법이 없다는 점입니다. 최종 설계
ping이 멈추고 TTL이 만료된 시점에 마침 서버가 꺼져서 이벤트가 유실된다 하더라도, 스케줄러가 돌면서 잡아서 처리해주는 구조입니다. 서버가 이벤트를 유실하는 케이스 자체가 흔하지 않고, 어디까지나 백업용 안전장치이기 때문에 너무 자주 돌릴 필요는 없다고 봅니다. 5분이나 10분 주기 정도면 충분하다고 판단해서 그 선에서 잡으려고 합니다. |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
개발 상황
Redis에서는 현재 접속중인 인원을 관리하고 있습니다.
Redis의 메인메모리(RAM)에 현재 접속중인 멤버 정보를 관리합니다.
Redis은 key, value형식의 nosql이며, value의 경우 다양한 자료구조를 사용할 수 있습니다.
key : room:{roomId}:connected_users
value : SET["userid",...]
set으로 현재 접속 인원을 관리합니다.
key : room:{roomId}:sessions:{userId}
value : SET [ "sess-abc", "sess-def" ]
set으로 유저별로의 세션관리를 합니다.
문제상황
Redis에서 오류가 발생했을 시, presence 처리가 되지 않았다고 했을때, client의 접속 상황과 동기화하는 로직이 없습니다. 즉, removePresenceSafe에서 Redis 예외 발생 시, presence가 삭제되지 않고 영구적으로 남습니다.
해결방안
1. retry
try-catch문 안에서 만약 redis상에 presence(현재 활동 멤버) 갱신이 실패된다면, redis 갱신을 retry를 하는 방법.
이 방법의 경우, 단순한 네트워크 단절은 해결되지만, Redis 서버 자체 장애시에는 문제점을 해결할 수 없습니다.
2. TTL+heartbeat
유저별 presence 키에 TTL을 설정한다.
클라이언트가 주기적으로 heartbeat를 전송해서 TTL을 갱신한다.(Sliding TTL)
heartbeat 중단시 해당 세션은 자동 만료된다.
이 방법의 경우, 클라이언트에서 Redis에게 heartbeat를 주기적으로 호출해야되고, Redis의 입장에서는 트래픽이 증가해 부담이 될 수 있음.
논의 사항
현재 mvp 단계에서 급한 부분은 아닌 것 같습니다. Redis에서 오류가 발생한다는 가정하에 생기는 문제점을 해결하는 방법에 대해 논의한 것이라서요. 하지만, 이슈는 일어날 수 있고, 어떤 해결방식으로 처리해야하는지 논의할 필요는 있을 거 같아 올려봅니다.
Beta Was this translation helpful? Give feedback.
All reactions