소켓을 이용한 채팅 서비스를 구현하려는 계획을 세우고 있다.
소켓 서버가 하나라면, 또 실제 다수의 사용자가 없다면 매우 간단하다.
하지만 서비스가 커져 소켓 서버가 여러 개가 필요하고 사용자가 많아져 동시에 처리되어야할 메시지가 많아진다면 들어온 메시지들의 순서를 어떻게 보장할 수 있을까?
이번 프로젝트의 기술적 도전을 해당 주제로 잡고 나서 구현할 수 있는 방법을 탐색 중이다.
받은 키워드는 #메시지채번
#snowflake
#uuid
#autoincrement
이다.
채번은 메시지에만 국한된 용어는 아닌 듯 하다.
채번(採番)은 새로운 번호를 딴다는 의미라고 한다.
메시지 채번은 클라이언트가 전송한 메시지에 번호를 붙인다는 의미쯤으로 이해했다.
https://dataonair.or.kr/db-tech-reference/d-lounge/expert-column/?mod=document&uid=51981
메시지에 번호를 붙여 관리하려면 모든 메시지를 저장하는 구조가 추가로 필요하겠다고 생각했고, 메시지 큐(RabbitMQ, Redis)가 먼저 떠올랐다. 또 UUID나 Auto Increment말고 타임스탬프를 사용할 수도 있지 않을까? 하는 생각이 들었다.
채번이라는 키워드로 검색하는데 개발관련 자료가 많이 안나와서 GPT에게 영어로 어떤 용어일지 알려달라했더니 "Message Sequencing", "Message Numbering"를 알려줬다.
Message Seqeuncing에 대한 IBM문서를 하나 찾을 수 있었다.
https://www.ibm.com/docs/en/app-connect/11.0.0?topic=sequences-message-sequencing
공식 문서에 들어가 Key Concepts & Architecture를 읽어보았다.
트위터에서 만든 데이터 저장, 처리, 분석 솔루션을 빠르고 쉽게 제공하는 서비스라고 한다.
찾아보니 분산 시스템에서 UUID를 생성하는데 활용할 수 있다고 한다.
네트워크 상에서 고유성을 보장하는 ID를 만들기위한 표준 규약
데이터베이스에 Insert 할 때마다 PK의 숫자를 하나씩 증가시켜 자동으로 PK를 지정한다.
두 가지는 데이터베이스의 PK를 UUID로 할 것인가 Auto Increment로 할 것인가에 대한 이야기가 많이 나왔었어서 비교적 익숙했다.
둘 중 어느 방식으로든지 메시지에 key를 부여하면 메시지를 구분할 수는 있다. 하지만 순서를 보장하려면 메시지 큐가 필요할 것 같다.
메시지가 발생한 시점에 타임스탬프를 번호로 가진다면 어떨까? 생각해봤다.
그러면 순서를 보장할 수 있지않을까?
하지만 조금 더 생각해보니 정말도 동시에 메시지 이벤트가 발생해 똑같은 타임스탬프를 가진다면 이 경우는 처리할 수 없으니 그리 좋은 방법은 아닌 것 같다.
해결 방법에 대해서 찾아보며 의문점들이 생겼다.
클라이언트에서 메시지를 전송할 때 바로 메시지 큐에 요청을 보내진 않을 것이다.
그러면 메시지 큐에 데이터를 넣는 것은 어디에서 처리할 것인가?
소켓서버? 아니면 별도의 서버가 필요할까?
별도의 서버가 필요하다면 그 서버도 소켓 서버만큼 다수가 필요할까?
메시지 큐에 넣는 작업을 하는 서버가 하나라면 소켓서버를 하나로 처리하는 이유가 없지않나?
연결된 소켓정보는 어디에 저장되나? 메모리에 저장될 것 같은데, 다중 서버환경에서 소켓 정보들을 어떻게 공유하고 관리할 수 있지?
계속해서 해결방법을 찾아보면서 과정을 기록해보자!