공개SW 개발자센터


- 공개SW개발자센터는 공개SW 리더로 성장할 개발자와 커뮤니티를 지원합니다 -

공개SW역량프라자에서는 오픈프론티어로 활동중인 개발자들이 진행하는 프로젝트를 소개합니다.


전통적인 웹 서비스는 브라우저가 웹 서버에 HTTP 요청을 보내고, 이에 대한 HTTP 응답을 받아 화면을 다시 디스플레이(Display)하는 방식으로 동작한다. 이러한 방식은 변화가 발생했을 때 화면을 다시 로딩해야 하므로 화면이 깜빡이는 문제가 있었다. 더욱 나은 사용자 경험을 위해, 원하는 부분만 다시 재구성 실시간으로 상호작용을 하는 웹서비스(이하, 실시간 웹 서비스)에 대한 니즈가 점차 증가하고 있고, 이러한 니즈를 만족시키기 위해 XPush를 개발하게 되었다.
이 글을 통하여 실시간 웹 커뮤니케이션 플랫폼인 XPush의 특징과 기술 요소, 추진현황, 적용 가능 분야에 관해 설명하도록 하겠다.

프로젝트명XPush
개요XPush는 채팅, 실시간 대시보드 등의 실시간 서비스를 빠르게 만들 수 있게 해주는 풀스택(FullStack) 실시간 커뮤니케이션 플랫폼이다.
특징

- 분산 처리가 가능한 플랫폼

- 무중단 서버 증설 지원

- 다양한 Client Library를 지원

- 빠른 설치와 실행

목표분산 처리가 가능한 메시징 서버와 Multi Platform에서 활용 가능한 안정적인 XPUSH library를 바탕으로 개발자들이 서버 구현 없이 실시간 웹 서비스를 구현할 수 있게 도움을 준다.
기대효과XPUSH를 통해 실시간 서비스의 제작 시간을 줄여 쉽게 관련 서비스를 구현할 수 있게 한다.
리퍼지토리

https://github.com/xpush
https://github.com/s5Platform



[목차]

  1. XPush 소개

  2. XPush의 구성요소

    2.1. 세션서버와 채널서버
    2.2. 주키퍼(Zookeeper)
    2.3. 레디스(Redis)
    2.4. 몽고DB(MongoDB)

  3. XPush의 기반기술

    3.1. 웹소켓(WebSocket)과 socket.io
    3.2. Node.Js

  4. XPush의 분산처리 알고리즘

  5. 프로젝트 주요 추진내용

    5.1. STALK-IM

    5.2. STALK.IO

    5.3. XPush 적용가

   6. XPush 적용가능 분야

    6.1. 실시간 대시보드

    6.2. 기업용 메신저

    6.3. 채팅상담과 대화형 커머스



1.  XPush 소개

XPush(eXtended Push)는 분산 서버 환경에서 데이터의 송수신을 실시간으로 처리하기 위하여 개발된 공개SW 플랫폼이다. MIT 라이선스(MIT License)로 누구라도 무상으로 취급 및 사용이 가능하다. npm을 이용하여 설치하여 사용할 수도 있고, git clone을 통해 소스를 다운로드 받아 설치하여 사용할 수도 있다.
XPush는 실시간 웹 서비스 구현에 필요한 메시지 통신 기능과 메시지 저장, 메시지 푸시 등의 주요 기능들을 지원한다. 이런 주요 기능들과 함께 급격히 증가하는 사용자를 고려한 분산 처리와 무중단 서버 확장 및 축소가 가능하도록 설계되어 있다. XPush를 활용하면 백엔드(Backend) 서버 개발에 대한 고민을 줄이고 서비스에 집중할 수 있으므로, 실시간 서비스를 개발에 드는 시간과 비용을 절약할 수 있다.


2. XPush의 구성요소
XPush는 자바스크립트 개발 플랫폼인 node.js 기반으로 개발되었으며, 부하분산 및 메시지 저장을 위해 다양한 공개SW들을 활용하고 있다. 사용하고 있는 공개SW들은 쉽게 변경을 하거나 추가/삭제할 수 있도록 모듈화를 시켜 확장이 용이하도록 설계되어 급변하는 애플리케이션의 상황에 효율적으로 대처할 수 있다.


1.XPUSH infra.png

                                                                   [그림 1] XPush의 인프라 구성도


2.1. 세션서버와 채널서버

XPush는 크게 세션 서버(Session Server)와 채널 서버(Channel Server)로 나눌 수 있다.
세션 서버는 사용자 접속을 위한 인증과 사용자 관리 및 부하 분산을 위한 서버 할당을 처리한다. 주키퍼(Zookeeper)의 특정 노드를 지속적으로 모니터링 하고 있다가 상태가 변경될 경우, 동기화 작업을 거쳐 채널 서버를 할당하는 기능을 담당한다. 세션서버 자체의 부하 분산을 위해 HaProxy같은 로드 밸런서(Load Balancer)를 사용할 수 있다.
채널 서버는 실제로 데이터 송수신을 하기 위해 클라이언트(Client)가 연결을 유지하는 서버이다. 메시지 전송이나 모바일 푸시(Mobile Notification)와 같이 사용자 간 커뮤니케이션에 필요한 기능을 담당하고 실제 사용자가 접속을 유지하게 되는 서버이다. CPU core 하나당 하나의 채널 서버를 실행시킬 수 있다. 채널 서버의 개수에 따라 자동으로 분산 처리할 수 있도록 설계되어 있다.


2.2. 주키퍼(Zookeeper)

XPush는 분산 서버들의 실시간 코디네이션(Coordination)을 위하여 주키퍼(Zookeeper)를 사용하고 있다. 주키퍼는 메모리를 이용하기 때문에 데이터에 대한 엑세스가 빠르고, 또한 분산 락(Lock)이나 동기화에 대한 데이터의 안정성을 보장한다. 또한, 자체적인 장애 처리 기능을 제공하기 때문에 Apache Hbase와 같은 유명한 분산 솔루션에서 많이 활용되고 있다.
각각의 세션서버는 주키퍼의 특정 노드(node)의 변화를 지켜보고(watching) 있다. 채널 서버의 추가 혹은 삭제가 발생하게 되면. 세션 서버는 즉시 변경된 채널 서버의 목록을 동기화할 수 있다. 이러한 방법을 활용하여 현재 활성화된 채널 서버의 목록을 실시간으로 알 수 있으므로 서비스의 중단 없이 서버를 추가하거나 확장할 수 있게 되는 것이다.


2.3. 레디스(Redis)
XPush는 서버에 연결된 정보를 실시간 저장하고 기본데이터를 캐시(Cache)하기 위해 레디스(Redis)를 사용한다. 레디스는 메모리 기반의 Key/Value 저장소이다. 모든 데이터가 메모리 위에 있어 데이터에 대한 빠른 엑세스(Access)를 보장하기 때문에 관계형 DB를 조회한 결과를 임시저장(Cache)할 때나, 로그인한 사용자의 세션 정보를 저장하는 세션 스토리지(Session Storage)와 같은 용도로 많이 활용되고 있다.
이러한 레디스의 Publish/Subscribe 기능을 이용하여 모든 서버에 메시지를 동기화하도록 구현되어 있다. 하나의 채널 서버에서 메시지가 발생하면, 그 채널에 레디스에 메시지가 왔다는 것을 발행(publish)한다. 다른 채널 서버들은 구독(subscribe)을 통해 메시지가 도착했음을 알게 되고, 해당 메시지를 보내야 하는 대상 정보를 확인한 후에 메시지를 대상에게 전송하게 되는 것이다.
레디스는 분산 서버 환경을 지원하기 위해 클러스터(Cluster) 환경을 구성하는 방법을 제공하고 있다. XPush는 자체적인 샤딩(Sharding)기능을 통해 레디스 클러스터 환경에서도 최적의 성능을 낼 수 있도록 설계되어 있다. 쓰기는 마스터(Master) 노드를 이용해 명령어 수행하고, 읽기는 슬레이브(Slave) 노드를 통해 명령어를 수행하는 방법을 이용하여 레디스 클러스터 환경에서도 부하 분산을 할 수 있도록 설계되어 있다.


2.4. 몽고DB(MongoDB)
XPush는 주요 데이터를 저장하기 위해 몽고DB(MongoDB)를 사용할 수 있게 구현되어 있다. 몽고DB(MongoDB)는 문서(document) 기반의 NoSQL 스토리지로 데이터에 대한 스키마(schema)가 없기 때문에 비정형 데이터를 저장할 때 주로 활용되고 있다.
이러한 몽고DB를 활용하여 생성된 채널의 주요 정보나 사용자 정보, 발송된 Data를 저장하고 있다. XPush를 이용하는 서비스마다 사용자 정보나 채널 정보의 스키마가 다를 수 있지만, 몽고DB의 비정형 데이터를 지원하는 특징을 이용하여 다양한 서비스에 유연하게 대응할 수 있다.
몽고DB 역시 레디스와 마찬가지로 데이터를 분산 처리하기 위한 클러스터 환경을 구성할 수 있다. XPush는 몽고DB 클러스터 환경을 지원할 수 있도록 설계되어 있어, 이에 따라 대규모로 몽고DB를 활용해야 하는 서비스에서도 활용이 가능하다.


3. XPush의 기반기술

XPush는 실시간 웹서비스의 구현을 위해 WebSocket과 Node.js를 사용하고 있다.

3.1. 웹소켓(WebSocket)과 socket.io
웹소켓은 실시간 웹서비스를 가능하게 해주는 프로토콜이다. 웹소켓은 HTTP와 달리 첫 연결 후 지속해서 연결이 유지되기 때문에 불필요한 오버헤드가 적게 발생하며, 하나의 TCP Connection 위에서 양방향 통신이 가능하게 해준다. HTTP나 HTTPS 포트 위에서 동작하기 때문에 방화벽을 추가로 해제하지 않아도 되는 등의 보안상의 장점도 있다. 웹소켓의 표준은 W3C에서 관장하고, 프로토콜은 IETF(Internet Engineering Task Force)에서 관장하고 있다. 이러한 웹소켓을 지원하는 브라우저는 아래와 같다.


2.websocket.png

[그림 2]  웹소켓을 지원하는 브라우저(출처: http://caniuse.com/)


socket.io는 실시간 웹서비스를 더욱 쉽게 사용할 수 있게 해주는 자바스크립트(JavaScript)로 작성된 모듈이다. 브라우저에서 실시간 웹서비스를 구현하기 위해서는 웹소켓을 사용하는 것이 필요한데, Figure 2 에서 보는 것과 같이 웹소켓을 지원하지 않는 브라우저에서도 웹소켓을 사용할 수 있도록 기능을 구현한 모듈이 socket.io이다. socket.io의 주요 동작 방식은 아래와 같다.


- 브라우저가 웹소켓을 지원하면 웹소켓을 사용한다.
- 웹소켓을 지원하지 않는데, FlashPlugin이 설치되어 있으면 FlashSocket을 이용한다.
- 둘 다 아닌 경우 XHR Polling 방식으로 동작한다.


3.2. Node.Js
Node.js 는 Google이 만든 Chrome 브라우저에서 사용하는 자바스크립트엔진인 V8 기반으로 동작하는 서버 사이드 JavaScript 플랫폼(Platform)이다. 단일 스레드(Single-Thread)를 사용하며 Non-Blocking I/O 모델을 사용해 가볍고 효율적으로 동작하는 특징이 있다. 요청을 보낸 이후 응답을 기다리지 않고 다른 요청을 처리할 수 있는 비동기 특징 때문에 수많은 작업을 병렬처리가 가능하다. 이러한 특성 때문에 수많은 클라이언트가 즉시성의 응답을 필요로 하는 채팅이나 메신저, 실시간 대시보드 등의 서비스에 최적화되어 있다고 할 수 있다.


4.  XPush의 분산처리 알고리즘
XPush는 특정 서버로 사용자가 과도하게 집중되는 것을 방지하고자, 서버에 접속 중인 사용자의 수에 따라 동적으로 부하를 분산시킬 수 있는 알고리즘을 사용하고 있다.
- 접속자에 따른 서버의 부하 레벨을 구간별로 설정한다.
- 서버 부하 레벨이 증가하면 서버의 가중치를 감소시키고, 반대로 부하 레벨이 증가하면 서버의 가중치를 증가시킨다.
- 현재 서버의 가중치가 따라 가장 가중치가 높은 서버로 접속하도록 유도한다.
- 서버별 가중치에 따라 고르게 분산이 되기 때문에 특정 서버로 몰림 현상을 예방할 수 있다.


3.algo.png

[그림 3] XPush의 부하분산 알고리즘


채널 서버A와 채널 서버B 두 개의 서버를 이용하여 서비스 중이라는 가정을 해보겠다. 각 서버는 기본적으로 SCALE = 60, BUFFER = 10, MAX_LEVEL = 4, REPLICA_BASE_NUM =4 라는 옵션을 가지고 시작된다. 즉 시작 시의 A의 가중치는 4^4 인 256, B의 가중치 역시 256인 상태에서 시작하게 된다.
이때 하나의 채팅 방이 생기게 되면 채팅방에 대한 할당 로직이 수행되는데 첫 번째는 A로 할당되었다고 가정을 하겠다. 첫 번째 사용자 이후 해당 채팅방의 사용자가 70명 이하일 때까지는 기본 할당 로직이 적용된다. 하나의 채널은 하나의 서버만 사용한다는 기본 알고리즘에 따라 A서버로 계속 할당을 받게 된다.
이후에 사용자가 점점 증가해서 70명(SCALE+BUFFER)이 되었을 때, A의 가중치 레벨은 3으로 바뀌게 되고 A가중치는 4^3 인 16으로 바뀌게 된다. 이렇게 가중치가 변경되게 되면, 세션 서버는 채널 서버에 대해 서버 재할당 로직을 수행하게 된다. 재할당 로직을 수행 시 A의 가중치 16에 비해 계속 유지되고 있던 B의 가중치 256이 훨씬 큰 숫자이기 때문에, B로 할당받을 확률이 증가하게 되고, 실제로 B로 할당하게 되면서 A 서버로 사용자가 몰리는 현상을 방지하게 된다. B서버 또한 사용자가 몰릴 경우, 가중치 레벨이 변경되고 재할당 로직을 통해 고르게 분배할 수 있게 된다.


5. 프로젝트 주요 추진내용


XPush는 사용자 간 커뮤니케이션에 도움을 주는 플랫폼이다. 커뮤니케이션 플랫폼이 견고해지기 위한 첫 번째 조건은 사용자의 확보라 할 수 있다. 많은 사용자를 대상으로 안정적인 서비스가 되어야만 신뢰가 쌓이고, 쌓인 신뢰를 바탕으로 레퍼런스가 쌓이면서 플랫폼이 성장할 수 있게 되는 것이다. XPush는 플랫폼을 직접 설치하여 사용하는 방법 이외에도, XPush가 적용된 서비스를 통해 간접적으로 사용하게 하는 방법으로 개발자와 사용자의 확보에 노력하고 있다. XPush가 적용된 주요 사례로는 오픈 소스 기반의 메신저 플랫폼인 STALK.IM과 실시간 상담 서비스인 STALK.IO가 있다.


5.1. STALK-IM

STALK-IM은 XPush를 활용한 풀스택(FullStack) 오픈소스 메신저 플랫폼이다. STALK-IM를 활용하면 메신저 서비스를 쉽게 구현할 수다. STALK-IM은 메신저 개발에 필요한 유저관리, 데이터 관리, 메시지 전송, 이미지 전송 기능들을 API의 형태로 담당하는 STALK-SERVER와 메신저 화면을 실제로 구현한 STALK-MESSENGER로 구성되어 있다.


STALK-SERVER는 메신저 개발에 필요한 사용자 관리, 데이터 관리, 메시지 전송 등의 기능을 제공하는 Node.Js 기반의 백엔드 서버(BackEnd Server)이다. npm이나 docker를 이용하여 직접 설치하여 사용할 수도 있다. 유저 관리, 데이터 관리 등은 Parse Server를 활용하여 API 형태로 제공하고, XPush를 활용하여 부하분산을 고려한 메시지 전송이 가능하도록 구현되었다.


STALK-MESSENGER는 STALK-SERVER의 API를 사용하여 React-Native 기반으로 화면을 개발한 오픈소스 메신저이다. 기본으로 제공하는 컴포넌트를 활용하여 비교적 쉽게 화면을 구성하거나 스타일을 변경할 수 있다. React-Native를 활용하면 하나의 소스를 이용하여 Android나 IOS 앱을 제작할 수 있다는 장점이 있다. MIT 라이선스를 사용하며 모든 소스가 공개되어 있으므로 그대로 사용하거나, 소스를 수정하여 자체적인 메신저를 쉽게 개발할 수 있다.


- 유저관리: 회원가입, 로그인, 로그아웃, 프로필 수정, 프로필 이미지 등록

- 친구 관리: 사용자 조회, 친구추가, 친구 삭제

- 채널 관리: 채널 조회, 채널 삭제, 사용자 초대

- 메시지 관리: 메시지 조회, 메시지 전송, 이미지 전송




4.STALK-IM.png

[그림 4] STALK-IM의 구조



5.2. STALK.IO
STALK.IO는 블로그나 온라인 쇼핑몰을 방문한 사용자들에게 새로운 경험을 제공해 줄 수 있는 온라인 상담서비스이다. STALK.IO를 이용하면 언제 어디서나 실시간으로 상담이 가능한 환경을 구성할 수 있다. STALK.IO는 고객에게 제공되는 채팅 위젯과 운영자를 위한 어드민 페이지로 구성되어 있다.
STALK.IO 어드민은 로그인이 가능한 웹 페이지 형태로 구성되어 있으며 STALK.IO를 적용할 웹페이지 등록부터 방문자와의 채팅까지 기능 전반을 지원한다. 어드민의 주요 기능은 아래와 같다.

- 대시보드: 주간 접속자 현황, 일간 접속자 현황, 주간 응답률 조회
- 사이트 관리: 사이트 등록, 사이트 삭제, 사이트 수정
- 채팅 관리: 채팅 상대 확인, 메시지 전송, 이미지 전송, 채팅 가능 상태
- 메시지 관리: 기존 메시지 조회, 메시지 읽음 처리, 공지사항 메시지 발송


5.dashboard.png

[그림 5] STALK ADMIN의 대시보드


STALK.IO 위젯은 사이트에 접속한 고객에게 제공되는 채팅 위젯이다. STALK.IO에 등록한 사이트에 스크립트를 추가하면, 해당 페이지 우측하단에 버튼 형태로 노출되며, 실시간 채팅 상담을 진행할 수 있다. 상담원이 연결되어 있는 경우에는 실시간 채팅을 위한 채팅창이 활성화된다. 메시지를 보내 즉시 상담이 가능하다. 상담원이 접속해 있지 않은 경우에는 이메일을 보낼 수 있는 형태의 입력창이 활성화된다. 메일 주소와 함께 메시지를 남겨 놓으면 향후 운영자로부터 메일을 받을 수 있다. 주요기능은 아래와 같다.
- 채팅 상담: 메시지 전송, 이미지 전송이 가능하다.
- 공지사항 확인: 공지 메시지를 확인할 수 있다.
- 이메일 발송: 상담원이 부재중일 때 이메일을 발송할 수 있다.


6.widget.png

[그림 6] STALK을 이용한 상담 사례



6. XPush 적용 가능 분야


6.1. 실시간 대시보드
XPush는 실시간 데이6.터 전송 기능은 실시간 데이터를 즉시 보여줘야 하는 대시보드 형태의 서비스에서 활용이 가능하다. 공항에서 비행기 도착 정보를 알려줘야 하는 FIDS(Flight Information Display System) 나 주식 차트, 선박의 계기판, 실시간 주문 현황판, 실시간 환율 차트, 성능 모니터링 도구, 버스 도착 알리미 등 다양한 영역에서 활용할 수 있다.



[필자소개]

frontier-3-2-8-detail.png  정진영
• 주요경력(2014) 공개소프트웨어 개발자대회 대상
(2015) 우수 커뮤니티 활동
• 활동 커뮤니티XPUSH
• 전문분야JAVA, Nodejs ...


by 공개SW역량프라자에 의해 작성된 이 저작물은 크리에이티브 커먼즈 저작자표시-변경금지 4.0 국제 라이선스에 따라 이용할 수 있습니다.





List of Articles
번호 제목 글쓴이 날짜 조회 수
공지 오픈프론티어 개발 프로젝트 연재 OSS 2016-08-06 2305
» [3기 정진영 개발자] XPUSH (실시간 커뮤니케이션 플랫폼) file OSS_ 2017-02-20 1025
24 [3기 방진호 개발자] Blink (웹브라우저 크롬의 레이아웃 엔진) file OSS_ 2017-02-20 829
23 [3기 송태웅 개발자] Linux Kernel - perf(리눅스 서버의 버전별, 기능별 성능측정 분... file OSS_ 2017-02-08 2599
22 [2기 채수원 개발자] Yona (설치형 프로젝트 호스팅 SW) file OSS_ 2017-02-08 1089
21 [2기 김현종 개발자] UrQA (Android Crash Report 도구) file OSS_ 2017-02-07 857
20 [2기 임정민 개발자] 구름IDE (클라우드 통합 개발 환경) file OSS_ 2017-02-07 1072
19 [3기 김영근 개발자] Pandas (빠르고 유연한 데이터 처리를 위한 파이썬 라이브러리) file OSS 2016-12-22 1417
18 [3기 윤제상 개발자] Apache Zeppelin (빅데이터 처리툴 Spark의 실행과 데이터 시각... file OSS 2016-12-16 1999
17 [3기 신정규 개발자] 텍스트큐브/메모리큐브 (개인화에 집중한 설치형 블로그 서비스 ... file OSS 2016-12-16 967
16 [3기 김종광 개발자] IoT분야의 통신, DB, 데이터 분석을 지원하는 개발지원플랫폼 file OSS 2016-12-15 1079


사이트하단 로고, 하단메뉴, 트위터 바로가기

퀵메뉴모음
퀵메뉴열기
퀵메뉴닫기