아직 IT에 입문한지 얼마 되지 않았지만 (2022년 4월 15일 기준)
지금까지 미들웨어 엔지니어로 배우면서 나름 카카오톡은 어떻게 작동할까에 대한 기동 원리를 추측해보았다.
아마도 아직 용어만 간신히 아는 수준이라서, 많은 내용이 미흡하거나 틀렸을 듯 하지만 나중에 다시 돌이켜봤을때 내가 과연 성장했는가를 볼 수 있지 않을까?
============================================================================
카카오톡 동작 방식 예측
기본적인 형태는 3 tier일 것이다. (DB-MiddleWare-Client)
여기서 궁금증: 과연 client는 server에 매번 request를 날리고 있을까?
카카오톡 누적 가입자 수가 2020년 기준 1억명을 돌파했는데, 여기에 개인당 톡방이 10개씩만 있다고 해도, 매번 10억개의 톡방이 서버에 request를 날리며 대기하고 있는 상태는 아닐 것이다. (서버가 먼저 뻗을것이다)
그러면 어떠한 방법이 있을까?
P2P 방식이란 중앙 서버를 거치지 않고 클라이언트끼리 직접 소통하는 형식이다. 이상적으로는 그렇게 되면 서버에 과부하가 걸리지 않겠지만, 이것이 현실적으로 가능할 리가... (아마 특별한 경우에는 위 형식을 사용할 수도?)
그렇다면 Server를 통신하는 방법을 사용한다고 치면...
Async(비동기) 방식으로 통신할까?
일단 동기는 확실히 아닐거 같다. 상식적으로 모든 톡방이 메시지가 올때까지 대기하고 있다고 생각하면, 병목 현상이 일어나지 않을리가...
그렇다고 해도 Async 방식 또한 2가지가 걸린다.
결국 매번 서버에 통신하고 있는 것인가? 과부하 문제는?
메시지가 누락된다면? Async는 이를 보장해주지 않을텐데?
다음으로 생각해본 것은 바로 Web Socket 통신.
서버와 클라이언트 사이에 양방향으로 통신이 이루어지게 하며, 둘 사이 연결이 TCP/IP 방식으로 연결되고 일정 시간이 지나면 자동으로 HTTP 연결은 끊어진다.
하지만 결국 Web Socket 또한 서버가 연결하고 있다는것 자체가 과부하이자 비용이 드는 일 아닌가?
다음으로 알아본 것은 MOM (Message oriented Middleware)를 사용하는 것.
이는 Async 방식에 기초한 Middleware이다.
Message Broker를 이용하여 MOM을 구축하게 되는데,
Message Broker란 메시지 송신자와 수신자의 의해서 동작하며, 송신자가 message que에 데이터를 넣으면, 수신자가 이를 차례대로 이용하는 방식을 의미한다.
Kafka나 RabbitMQ가 여기에 해당된다.
RabbitMQ 기본 테스트를 해봤을 때, 1:1, 1:n 메시지 통신은 물론, 다양한 방법으로 수신자에게 메시지를 전달할 수 있다는 것을 알게 되었다.
Message Broker를 통해 Application들의 의존성을 줄이고, 수신자의 주소만 알면 메시지 전달이 가능하며, 수신 서버가 죽어도 메시지 전달에 문제가 없다는 장점들이 있다고 확인했다.
이러한 방법을 통해 MOM을 구축하여 카카오톡을 운영하지 않을까?
다만 MOM 방식은 자체만으로는 불안정성을 가진다는 글도 보았다.
따라서 RPC (Remote Procedure Call) 방식과 결합하여 위 문제를 보완하는 방법이 있다고 들었다.
아직 그 이상은 잘 이해하지 못하겠다...
그리고 MOM 관련 middleware만 사용하진 않을 것이다.
예시? coherence를 통해 장비 별로 캐쉬나 메모리 쉐어링이 가능하다는 점을 이용하는 방법도 있지 않을까?
JMS (Java Message Service)를 통해 Message queue를 생성하여 WebLogic과 Coherence 제품을 엮는 것을 통해서도 가능할까?
아직 공부를 더 해봐야겠지만, 뭐 일단은 생각해본건 여기까지이다...
'개인 공부' 카테고리의 다른 글
Hadoop (0) | 2023.06.01 |
---|---|
DeadLock (0) | 2023.05.25 |
공부 커리큘럼 (0) | 2022.07.01 |
미들웨어 엔지니어의 로드맵 (0) | 2022.01.21 |
공부하기 좋은 제품들 (0) | 2022.01.21 |