위 영상을 보고 정리한 내용
일평균 초당 50만
평균 연결 세션 수 4천만
최고 트래픽 (국제 행사 등) 초당 600만
위 프로젝트 이후로 부터 위에 언급한 대용량 트래픽을 감당할 수 있게되었음
메시징 시스템 (루비 -> C++, Java)
모바일 환경에서 빠르게 통신하기 힘든 HTTP -> 패킷사이즈 경량화, 빠르게 통신 가능한 자체프로토콜 개발
헤더 오버헤드: HTTP는 헤더를 포함한 메타데이터를 사용하여 요청과 응답을 전송합니다. 모바일 환경에서는 헤더 오버헤드가 상대적으로 큰 비중을 차지할 수 있어, 데이터 양이 적은 작은 요청이나 응답도 불필요한 헤더 정보가 포함되어 전송되어 효율이 떨어질 수 있습니다.
연결 설정 비용: HTTP는 요청마다 새로운 연결을 설정하고 해제하는 방식으로 동작합니다. 모바일 환경에서는 이러한 연결 설정과 해제 비용이 높을 수 있어, 짧은 시간 동안 여러 번의 요청과 응답이 이루어지는 경우에는 비효율적일 수 있습니다.
순차적 요청/응답: HTTP는 요청과 응답이 순차적으로 이루어지는 방식으로 동작합니다. 모바일 환경에서는 요청과 응답이 번갈아가며 이루어지는 경우에는 통신 속도가 저하될 수 있습니다. 예를 들어, 하나의 요청에 대한 응답이 늦어지면 이후의 요청들도 늦어질 수 있어 전체적인 통신 시간이 증가할 수 있습니다.
대기 시간: 모바일 환경에서는 이동통신망의 무선 환경이나 신호 강도에 따라 대기 시간이 늘어날 수 있습니다. HTTP 통신에서는 대기 시간이 증가하면 전체적인 응답 시간이 늦어지게 됩니다.
대역폭 제한: 모바일 환경에서는 대역폭이 제한적일 수 있습니다. HTTP는 요청과 응답의 데이터 양이 많을 수 있어, 대역폭이 제한된 환경에서는 통신 속도가 저하될 수 있습니다.
Config Server : 연결 설정등을 받아옴
Relay Server : 메시지 수신, 발신을 위한 Full Mesh 구조의 서버
Upload Cache : 사진, 동영상 저장
Business Server : 메시지 저장, 채팅방 관리
** 메시지 릴레이 ( 메시지 전송과정 중간에 메시지를 전달하거나 중계하는 역할을 수행하는 노드 )
클라이언트와 직접 통신하는 앞단 서버들은 대량의 트래픽을 관리하기 위해 C++
비즈니스 로직, DB와 통신하는 비즈니스 서버는 JAVA
2011년 이후로 10년간 문제없이 운영해온 메시징 서버
앞으로도 문제가 없을까?
커스텀 엔진과 양산 엔진의 차이
커스텀 엔진 : 한땀 한땀 정성들여 구현 -> 뛰어난 성능 but 유지보수에 어려움
양산형 엔진 : 범용성을 위해 규격화된 모듈구조, 호환성이 좋다. -> 비교적 낮은 성능 but 유지보수, 확장 용이
개선된 서버는 커스텀 엔진과 같았다.
직접 개발한 프로토콜
외부 라이브러리 사용 최소화
제약이 생기기 시작
코드의 규모에 비해 적은 단위테스트, 파이썬 스크립트를 통해 원격으로 통합테스트를 하지만 개인이 테스트하기엔 스테이징에 어려움이 많아 복잡했다.
실수를 유발하기 쉬운 구조의 배포시스템
Spring Java 개발자는 많지만 C++인재가 부족해서 트러블슈팅에 어려움을 겪었고 점점 심해지는 상황
배포시스템을 개선하거나 단위테스트를 추가해서 진입장벽을 낮출수는 있다. 하지만 현재 코드의 근본적인 구조는 해결불가, 개편하는건 처음부터 다시만드는 꼴
동일 비즈니스 서버들과 함께가는 것이 좋겠다. -> 비스니스 서버 기술 스택을 따라가기로 결정
메세지 릴레이와 클라이언트를 관리하는 서버들
Full Mesh
대당 약 50만 세션
최대 100k tps
원활한 릴레이를 위해 빠른 처리시간 요구
코틀린 : 기존 프로젝트 대비 간결, 가독성 높은 코드, 생산성 높은 코드
쓰레드풀 비동기 릴레이 -> 코루틴 활용
타 클라이언트와 full-mesh 상대 서버에서는 해당 모듈이 신규 모듈인지 아닌지 모르는 블랙박스 형태로 -> 한 대씩 순차적으로 적용하며 장애 위험도 낮춤
기존 서버 대비 성능이 잘 나올까?
CPU 사용량은 (새롭게 세션 오브젝트가 생성될때) JVM 이 높지만 실서버 자원애 비해 낮아 이정도 성능차이는 상관 없다고 판단.
프로토콜 처리속도, 메시지 릴레이 시간은 내부 로직 개편으로 성능 개선
stop the world G1GC, ZGC간 차이가 있음
C++ 서버에서 차지하고있는 메모리르 기준으로 JVM의 힙사이즈를 적용
각 GC별 프로토콜 처리속도의 최대값
프로토콜 처리속도 변동 빈도가 ZGC보다 G1GC가 더 높은걸 확인
-> 이 결과가 Maximum pause gc time과 유관할것이라고 예측
계층 분리를 통해 릴레이 서버들간 릴레이 프로토콜을 안정적으로 개선 가능 -> 패킷사이즈 제한과 같은 커스텀 프로토콜로 인한 제약이 많았고 내부 통신 프로토콜들을 전부 변환하기에는 장애 위험성이 너무 높았다. -> 사람 많은 방의 릴레이나 멀티 디바이스 확장을 유연하게 적용할 예정
미디어 캐시 개선 고민중