랭킹 서비스를 설계하면서..

게임이 끝나면 발생하는 프로세스를 추적해보았습니다.

저희가 걱정한 부분은 게임 기록에 대한 손실이었습니다. 만약 유저 서버가 일시적으로 다운되거나 응답이 늦어질 경우 게임 기록이 손실될 위험이 있다고 판단하였습니다.

유저 입장에서 게임 기록이 손실되는 일은 있어서는 안된다고 생각했습니다. 따라서 저희는 메시지 큐를 도입하여 이 문제를 해결하고자 하였습니다.

메시지큐 중에서 RabbitMQ와 Kafka를 비교하고 고민하였습니다. 결론적으로 Kafka를 선택하였습니다. 가장 큰 이유로는 RaabitMQ는 큐에 저장되어 있던 메시지를 Consumer가 가져가게 되면 큐에서 해당 메시지를 삭제하기 때문에 RabbitMQ에서 데이터를 가져온 후, 유저 서버에 장애가 발생할 경우에는 데이터가 손실될 수 있기 때문입니다. 따라서 데이터를 재처리할 수 있는 Kafka를 사용하였습니다.

또한 Kafka는 클러스터를 통해 병렬처리를 지원하기 때문에 방대한 양의 데이터를 처리할 때 효과적인 점도 저희 서비스에 더 적합하다고 생각하였습니다.

저희 서비스에 Kafka를 도입하면서 얻은 이점입니다.

  1. 확장성 및 유연성 확보
  2. 비동기 처리
  3. 내결함성 및 데이터 보장

추가적으로 유저가 푼 문제도 손실되면 안되고, 유저 수가 늘어남에 따라 전송해야 하는 데이터가 늘어나기 때문에 Kafka를 통해 관리하도록 하였습니다.

Kafka를 도입하기 전, 게임이 끝나게 되면 유저 서버로 대량의 요청이 한번에 쏟아지게 됩니다.

kafka1.gif