1. RedisTemplate을 이용한 분산 캐시 ( 키-값 저장소 ) 로 '방 별 인원 수'와 사용자별 입장 방 ID를 관리하여
여러 서버 인스턴스가 동일한 상태를 공유함
* 분산 캐시 ( Distributed Cache )
- RedisTemplate<String, String>.opsForValue() :
- roomId : 123 -> 현재 인원수
- userId : 456 -> 사용자가 들어가 있는 방 ID
// 방 인원 증가
roomPeopleCacheTemplate.opsForValue().increment("roomId:" + roomId);
// 사용자별 방 정보 저장
alreadyInGameUserCacheTemplate.opsForValue().set("userId:" + userId, roomId);
- roomPeopleCacheTemplate : 각 방마다 현재 인원수 관리,
- alreadyInGameUserCacheTemplate : 각 유저마다의 roomId 관리
- 여러 노드가 같은 Redis를 참조하므로, 동시성 환경에서 모든 노드가 동일한 방 인원 상태와 사용자 입장 상태를 조회/갱신 가능
2. Redis Pub/Sub ( RedisEventPublisher 의 convertAndSend ) 를 통해 '방 생성' 및 '인원 변경' 이벤트를
발행하고, 모든 인스턴스가 해당 채녈을 구독하도록 하여 실시간 소켓을 적용함
* 분산 메세징 ( Distributed Messaging )
- RedisEventPublisher.convertAndSend(channel, payload) :
- 방 생성/방 인원 변경 이벤트를 Redis Pub/Sub 채널로 발행
- 웹소켓 메시지 전송, 대기방 리스트 갱신을 실시간으로 처리함
// 최초 방 생성 직후 호출
redisEventPublisher.publishCreatEvent("create-room-channel", roomResponse);
// 유저 입장·퇴장 후 호출
redisEventPublisher.publishChangeCurrentPeople(
"change-roomList-channel",
new ChangeCurrentPeopleResponse(roomId, currentCount, System.currentTimeMillis())
);
- publishRoomCreatedEvent : 최초 방 생성 pub/sub 진행,
- publishChangeCurrentOccupancies : 방 생성 후 pub/sub 진행
- 각 서버 인스턴스에서 구독하여, WebSocket ( 실시간 소켓 통신 ) 알림 전송 등 후속 처리를 동시 수행
- 사진에 레디스 역할을 조금 더 구체적으로 작성해 보았다.
* 분산 락
'Project > SpringBoot' 카테고리의 다른 글
STOMP 구독 해제 (0) | 2025.05.13 |
---|---|
자바의 동시성 처리 방법 (3) | 2025.05.05 |
Java의 동시성 문제를 해결가능한 3가지 방법 (0) | 2025.02.12 |
NginX를 적용한 로드밸런싱 적용 및 웹 소켓 로드 밸런싱 (0) | 2025.01.31 |
AWS 프로젝트 배포과정 (0) | 2025.01.31 |