경매 상품의 경우 상품 가격이 계속해서 변하기 때문에 실시간 가격을 받기 위한 기능이 필요하다.
효율적인 Server Push 방법으로 SSE와 Websocket이 있는데 둘의 가장 큰 차이는 단방향/양방향 통신이라는 점이다.
우리 서비스에서 클라이언트는 서버에 연결을 요청 할때 말고는 보낼 데이터가 없기 때문에 단방향 통신인 SSE를 선택했다.
그리고 SSE는 HTTP 프로토콜을 기반으로 하기 때문에 연결이 끊어졌을 때 자동으로 서버에 재연결을 해줘서 별도의 코드를 작성하지 않아도 된다는 장점이 있다. 반면 Websocket은 직접 코드를 작성해야 한다.
만약 하나의 channel에 너무 많은 pub이 생기면 어떻게 될까? 지금 구조는 Redis에서 SpringBoot로 바로 데이터를 보내기 때문에 문제가 발생할 수 있다.
그럴 때 다음과 같은 구조로 변경한다면 SpringBoot에 부하를 줄여줄 수 있있다.
① Redis에 [ key : 상품id_서버 IP/ value : 서버 IP ] 를 저장한다
② SQS로 업데이트된 입찰 금액을 보낸다
③ 배치 기간을 두고 SQS에서 Lambda를 트리거한다.
Lambda에서 상품별로 최종 가격만 필터링한다.
④ Redis에서 필터링된 상품id를 이용해 서버 IP를 가져온다
⑤ 서버 IP에 업데이트된 입찰 금액을 보낸다.
위와 같은 과정을 거치면 마지막으로 업데이트된 가격만 필터링할 수 있어서
서버에 부하를 줄일 수 있다.