안녕하세요..
예를 들면 회원수 100만명인 앱이 있습니다.
이 앱에서 푸시 알림을 제공하려고 합니다.
카카오톡처럼 메시지 전송량이 엄청 많은 것은 아니고 하루에 몇건씩 공지 알림이나 뭐 그런 용도인데요
이때 푸시 서버를 어떻게 구성해야 할지 궁금하네요..
푸시 서버에 C2DM 하고 MQTT 가 대표적인 것으로 아는데
C2DM 은 신뢰성이 약간 부족하고, 구글 계정이 있어야 하고.. 몇가지 제약사항이 있습니다.
대신 MQTT 는 서버의 신뢰성이 좋고, 구글과 상관없어서 좋은데 서버를 직접 구성해야 하더라구요..
푸시하는 메시지의 신뢰성이 중요해서 MQTT 로 한다고 했을 때
한 서버당 동시접속 인원을 고려해서 서버는 몇대나 필요할 까요?
C2DM 으로 구현할 때는 서버에서 phone 으로 메시지를 보낼때 구글 서버로 보내면 되기 때문에
동시접속이라는 개념이 별 의미가 없는 것 같은데 MQTT 로 구현한다고 했을 때는
phone 하고 mqtt 서버하고 소켓이 끊어지지 않도록 연결만 맺고 있다고 알고 있습니다.
제가 알기로는 보통 한 서버에서 5만명 정도 처리한다고 하는데 가끔 있는 푸시를 위해서 데이터 전송없는 소켓을
항상 열고 있어야 하는 것인지..
한 서버에서 소켓 5만개 열수 있다면 100만명이면 서버 20대가 필요하다는 얘기가 되는데요..
제가 이해하고 있는게 맞나요?
질문의 핵심
회원 100만명인 앱의 mqtt 푸시 서버 개수

포트야 그렇다 쳐도
보통 서버가 클라이언트를 처리할 때 1클라이언트 접속시 1스레드를 띄우지 않나요?
5만 스레드가 가능할까요?
MQTT 서버가 어떤 구조일지 모르겠네요...
제가 이야기 한대로 되어 있는 구조라면 스레드 개수에서 절망이네요.
5만 커넥션을 위해서는 클라이언트별로 스레드가 생성되는 구조면 안될 듯 한데...
MQTT 서버 오픈소스로 되어있는 mosquitto라는 프로젝트가 있는데요...
이것은 그냥 싱글 스레드였습니다. ㅡㅡㅋ (지금은 바뀌었나 모르겠네요.)
1클라 1스레드로 짜면 1000개도 버겁습니다.
말씀하신 푸시 서비스를 위해 서버가 컨넥션을 모두 가지고 있는 것은 무척 낭비가 심해 보이는데요.
대용량 서버인 경우, 예를 들어 게임서버들은 컨넥션마다 쓰레드를 가지고 있지 않고, 쓰레드풀 처리를 합니다.
컨넥션 마다 쓰레드를 만들기에는 그 수가 너무 많아서 시스템에 부하가 많이 생기니까요.
이런 서버를 구축하면 좋긴 한데.. 글쎼요.. 푸시만을 보내기 위해 이런 서버를 만들기는 좀..
이미 이런 서버들을 만들어서 제공해주는 업체들이 몇몇 있습니다.
푸시클라우드 http://www.pushcloud.co.kr/
푸시캣 http://www.pushcat.net
항상 열고 있어야 하는게 맞구요... 왜냐면 언제 메시지가 올지도 모르니까요...
이것때문에 일정 이상 아무 메시지 없는 소캣이나 세션을 만료하는 추가 로직을 어떻게든 넣으셔야 할겁니다.
(세션이 계속 살아있으면 그쪽으로 가는 데이터가 남아서 이를 처리하려고 서버가 어떻게든 돌거든요...)
원래 이론적으로 65535개가 되는데(OS 세팅으로 늘릴수 있다고 하는데 기본적으로 fd 숫자가 저렇게 되어있는것으로 압니다.)
기본적으로 서버가 필요로 하는 갯수도 있으므로 이것보다 적습니다.
대략 5만개가 이론적인 MAX라고 볼 수 있으나,
5만개의 소켓에서 메시지를 마구 보낸다면 서버가 버틸 수 있을지 알수는 없습니다.
게임서버같은 경우는
짜기 나름이긴 한데 3만정도면 잘 붙는것이다라고 들은적이 있습니다만 그냥 듣기만 한거라 잘 모르겠습니다.
근데 실제로 서비스 해보면 다운로드가 5만 정도면 실제 붙어있는 사람은 30%정도더라구요....
무슨수를 써서라도 붙어있도록 클라이언트 프로그래밍을 해도.... 원천적으로 안되는 케이스(네트웍 차단 등)도 있고,
알수 없는 이유에 의해서 못붙는 케이스도 있고...