현재 우아한테크코스에서 팀 프로젝트인 커피빵 서비스에 Redis Stream을 도입기를 작성하고자 합니다.
커피빵 서비스는 웹소켓을 사용한 실시간 게임 서비스입니다. 레벨4에 들어가서 사용자가 많아지면 어떻게 처리할 것인가에 대해 고민을 하였고, 수평 확장이라는 선택 아래에서 다음과 같은 구조로 설계되었습니다.
현재 커피빵 서비스는 여러 대의 인스턴스를 활용해서 수평 확장을 하였습니다. ALB를 활용해서 사용자들을 적절하게 분배하게 됩니다.
하나의 방에 생성됐을 때 방장(방을 생성한 사람)이 연결된 인스턴스에 사용자들이 입장(접근)하는 것이 아닌 서로 각기 다른 인스턴스에서 사용자가 연결됩니다 . 하나의 인스턴스에 몰리는 것을 방지하고자 다음과 같은 방법을 사용하였습니다.
서로 다른 인스턴스에 연결되었기에 서로의 상태를 알 수 없습니다. 이러한 상태 불일치를 해소하기 위해 Redis Pub/Sub을 활용했습니다.
https://tech.buysell-technologies.com/entry/adventcalendar2021-12-11
각 인스턴스들이 Redis를 구독(Subscribe)하고 있고, 상태 변경이 필요하다면 이벤트를 발행(Publish)해서 구독된 인스턴스들이 모두 상태 변경을 해서 데이터 일관성 문제를 해소하였습니다.
하지만 Redis Pub/Sub에도 문제점이 존재합니다.
Redis Pub/Sub 은 기본적으로 fire-and-forget 방식입니다. Redis는 메시지를 구독자들에게 전달 후에는 삭제합니다. 따라서 메시지가 유실될 수 있습니다.