티스토리 뷰

Tech

[Street Coding Fighter] Kafka를 도입한 이유

신입사원 성장기 2024. 9. 2. 00:02

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

 

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

 

  • 게임이 종료될 때마다 게임 서비스(멀티 모드, 배틀 모드)에서 참여한 모든 유저에 대한 게임 결과를 유저 서버에 전송한다.
  • 유저 서버가 게임 결과를 받아서 경험치를 업데이트 한다.
  • 유저 서버에서 게임 결과를 통해 경험치를 업데이트하고, 랭킹 서버로 업데이트한 경험치를 보낸다.

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

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

 

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

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

 

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

 

1.확장성 및 유연성 확보

  • 게임의 유저 수가 많아질수록, 게임 종료 시 유저 서버로 전송해야 하는 데이터의 양도 기하급수적으로 늘어날 수 있습니다. Kafka를 통해 대용량 데이터를 안정적으로 처리할 수 있음.
  • 만약 다른 서비스에서도 게임 결과 데이터를 처리해야 한다면, Kafka를 통해 데이터를 스트리밍하여 여러 서비스가 동시에 처리할 수 있음.

2. 비동기 처리

  • Kafka를 사용하여 게임 결과를 유저 서버에 비동기적으로 전송하여 게임 서비스는 Kafka /result 토픽에 결과를 게시하고 즉시 다음 작업으로 넘어갈 수 있음. (게임 서비스와 유저 서비스 간의 병목을 줄임)

3. 내결함성 및 데이터 보장

  • 게임 종료 시 유저 서버가 일시적으로 다운되거나 응답이 느려지더라도, Kafka는 데이터를 안전하게 보관하며 유저 서버가 다시 활성화될 때까지 데이터를 유지.
  • 게임 결과를 처리하는 과정에서 오류가 발생하거나, 추가적인 데이터 분석 또는 통계 작업이 필요한 경우, Kafka에 저장된 데이터를 재처리 할 수 있음.

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

 

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

Kafka를 도입하기 전, 게임이 끝날 경우 프로세스

 

Kafka를 도입한 후 프로세스입니다.

Kafka 도입 후, 브로커를 통한 Pub/Sub 방식으로 동작

 

'Tech' 카테고리의 다른 글

[Street Coding Fighter] MSA로 설계한 이유  (2) 2024.09.01
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday