37
모바일 메신저 아키텍쳐 2015.03.31 정효기([email protected])

모바일 메신저 아키텍쳐 소개

Embed Size (px)

Citation preview

Page 1: 모바일 메신저 아키텍쳐 소개

모바일 메신저 아키텍쳐

2015.03.31 정효기([email protected])

Page 2: 모바일 메신저 아키텍쳐 소개

Contents

• 모바일 메신저 서비스 현황

• XMPP 소개

• LINE, Kakao Talk 아키텍쳐 소개

• 메신저를 만든다면?

2

Page 3: 모바일 메신저 아키텍쳐 소개

모바일 메신저 점유율 (2014년 12월)

월간 사용자(백 만명)

Reference : http://www.statista.com/statistics/258749/most-popular-global-mobile-messenger-apps/

6 억

5 억

1.7 억

4.8 천만

3

Page 4: 모바일 메신저 아키텍쳐 소개

Instant Messaging 서비스 표준화 동향

• IETF’s Session Initiation Protocol (SIP)

• Henning Schulzrinne와 Mark Handley가 1996년 고안, 2000년 표준으로 채택

• IP network 상에서 음성, 화상 전화와 같은 multimedia 통신을 제어하기 위해 정의된 signaling protocol

• SIP for Instant Messaging and Presence Leveraging Extensions (SIMPLE)

• SIP를 기반으로 instant messaging, presence protocol 을 명세

• the open XML-based Extensible Messaging and Presence Protocol (XMPP)

• 1998년 Jeremie Miller에 의해 만들어져 2004년 IETF 표준이 됨

• Instant Messaging and Presence Protocol (IMPP)

• Application Exchange (APEX)

Reference : http://en.wikipedia.org/wiki/Comparison_of_instant_messaging_protocols4

Page 5: 모바일 메신저 아키텍쳐 소개

eXtensible Messaging and Presence Protocol (XMPP)

• XML에 기반한 실시간 메시지 지향 공개 표준 통신 프로토콜

• 두 네트워크 피어 간에 실시간으로 메시지를 주고 받고, 부재 여부를 파악하며, 구조화된 정보들 전달

• Google Talk, Facebook chat, WhatsApp, Windows Live Messenger 등에 이용

Reference : http://www.ibm.com/developerworks/library/x-xmppintro/, http://xmpp.org/

XML DocumentClient Server

Page 6: 모바일 메신저 아키텍쳐 소개

XMPP 프로토콜 특징특징 설명

Open free, open, public 프로토콜

Standard IETF(국제 인터넷 표준화 기구) 표준

Proven 수천 개의 서버, 수백만의 사용자 확보

Decentralized Email과 유사한 방식으로 확장

SecureSASL(Simple Authentication Security Layer), TLS(Transport Layer Security) 등 규격 지원

Extensible XML namespace에 의해 자신만의 프로토콜을 코어위에 확장

Flexible IM 위에 네트워크 관리, 콘텐츠 동기화, 협업 도구, 파일공유, 게임 등 확장 가능

Diverse 수많은 회사 또는 오픈소스 프로젝트에서 다양한 응용서비스들을 출시하고 있음

6

Page 7: 모바일 메신저 아키텍쳐 소개

XML 메시징 구분 (1/2)• 스트림 (Stream)

• 두 피어 간에 XML 요소를 주고 받기 위해 미리 주고 받는 XML 문서

• 포함 요소 : 서버 주소, 프로토콜 버전, 네임스페이스

• 스탠자 (Stranza)

• 열려진 XML 스트림 내에 포함되어 전달되는 XML 문서

• 3가지 타입 존재 : message, iq, presence

• 로스터 (Roster) : 친구 리스트

• JID(Jabber Identifier) 유일한 식별자들로 구성

• 예 : [email protected], [email protected]

7

Page 8: 모바일 메신저 아키텍쳐 소개

XML 메시징 구분 (2/2)<stream:stream to='example.com‘ xmlns='jabber:client‘ xmlns:stream='http://etherx.jabber.org/streams’ version='1.0'>

<message …..> …. </message> …………. <presence …> … </presence> …………. <iq … > … </iq>

</stream:stream>

<stream:stream from='example.com‘ id='someid‘ xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams‘ version='1.0'>

<message …..> …. </message> …………. <presence …> … </presence> …………. <iq … > … </iq>

</stream:stream>Client Server

8

Page 9: 모바일 메신저 아키텍쳐 소개

스탠자 종류 (1/3)• 메시지 (Message) : 메시지를 전송하기 위해 사용

• 구성 요소 : to, from, type, lang, body 등

• Presence : 온라인, 자리 비움 등의 상태 표시

• 구성 요소 : lang, show, status 등

• IQ (Info/Query) : 친구 리스트 받기 등의 정보 요청

• 종류 : get, set, result, error

9

Page 10: 모바일 메신저 아키텍쳐 소개

스탠자 종류 (2/3)

메시지 스탠자

Presence 스탠자

Reference : http://btsweet.blogspot.kr/2014/09/google-talk-xmpp-2.html10

Page 11: 모바일 메신저 아키텍쳐 소개

스탠자 종류 (3/3)

Reference : http://btsweet.blogspot.kr/2014/09/google-talk-xmpp-2.html

“get” 타입의 IQ 스탠자

“result” 타입의 IQ 스탠자

11

Page 12: 모바일 메신저 아키텍쳐 소개

Single Server

XML

Client

XMPPServerXMLClient

Client

Client Client

Client

Client

XML

XML XML

XML XML

Host.com

12

Page 13: 모바일 메신저 아키텍쳐 소개

Multiple Servers

XML

XML

XML XML

XML

Client

XMPP App

Client

XMPPServer

XMPPServer

XMPPServer

XMPPServer

Client

XML

XML

XML

Client

XML

Client

Client

InternetXML

XML

XML

XML

Client

13

Page 14: 모바일 메신저 아키텍쳐 소개

LINE, Kakao Talk 등은?

• 표준 프로토콜(XMPP) 가 아닌 자체 프로토콜 사용

• 대부분 자료를 공개하지 않음

• 어디서 자료를 얻을 수 있을까?

• 해당 서비스 홈페이지 또는 기술 블로그

• Reverse Engineering : 패킷 분석 등을 통한 사용 프로토콜 분석

14

Page 15: 모바일 메신저 아키텍쳐 소개

LINE• 메시지 전송 : SPDY, Apache Thrift

• 서버 : nginx

• 데이터베이스 : Redis -> HBase

Reference : http://developers.linecorp.com/blog/?p=142015

Page 16: 모바일 메신저 아키텍쳐 소개

기존 HTTP 프로토콜 문제• 하나의 커넥션에서 한 번에 하나만의 요청을 처리

• 요청에 대한 응답이 순차적

• 매 요청마다 동일한 Header를 중복으로 전송 : 압축하지 않음

Reference : http://www.slideshare.net/oddpoet/spdy-1323145916

Page 17: 모바일 메신저 아키텍쳐 소개

SPDY 특징• Multiplexing : 하나의 커넥션 안에서 다수의 독립적인

스트림을 동시에 처리

• Server Push : 클라이언트 요청 없이 서버에서 콘텐츠를 직접 push 가능

• HTTP 헤더 압축

17

Page 18: 모바일 메신저 아키텍쳐 소개

Apache Thrift (1/2)• 페이스북이 개발한 규모 가변적인(scalable) 이종 언어 서비스 개발을

위한 소프트웨어 프레임워크

• 데이터 교환을 쉽게 하기 위한 목적 : XML, JSON, Protocol Buffers 등과 유사

• 최소의 부하로 이기종 언어간 Serialization 지원

• Thrift 도구를 통해 다양한 언어의 코드 자동 생성

• C++, Java, C#, PHP, Python

• Ruby, Erlang, Perl, Haskell, Cocoa, Smalltalk, Ocaml 등

18

Page 19: 모바일 메신저 아키텍쳐 소개

Apache Thrift (2/2)

19

Page 20: 모바일 메신저 아키텍쳐 소개

메시지 크기 (Bytes) 비교

20

Page 21: 모바일 메신저 아키텍쳐 소개

CPU 부하 (%) 비교

21

Page 22: 모바일 메신저 아키텍쳐 소개

nginx

• 트래픽이 많은 웹사이트를 위해 네트워크 확장성을 주목적으로 설계한 경량 HTTP 서버

• 아파치 웹 서버를 대체할 대안으로 급부상 중

• 비동기 이벤트 기반 구조 (아파치는 스레드/프로세스 기반)

• 사용하는 곳

• Facebook, NetFlix, WordPress, GitHub, Zynga, Sourceforge 등

• 한국에서는 네이버 첫 페이지, 카카오톡 공지사항 서버

Reference : http://nginx.org/en/docs/22

Page 23: 모바일 메신저 아키텍쳐 소개

Web Server 점유율 (2014년)

아파치 39%, IIS 29%, nginx 15%

Reference : http://news.netcraft.com/archives/2014/05/07/may-2014-web-server-survey.html23

Page 24: 모바일 메신저 아키텍쳐 소개

이벤트 기반 구조 (1/2)

Reference : http://www.iij.ad.jp/en/company/development/tech/mighttpd/24

Page 25: 모바일 메신저 아키텍쳐 소개

이벤트 기반 구조 (2/2)• 아파치 웹 서버

• 스레드/프로세스 기반 구조

• 클라이언트의 요청이 들어오면 스레드를 생성

• 사용자가 많으면 많은 스레드 생성 : 메모리 및 CPU 낭비, Context-Switching Overhead 발생

• nginx

• 비동기(async) 이벤트(ioctl, send, recv, epoll) 기반 구조

• 다수의 연결을 효과적으로 처리

• 대부분의 코어 모듈이 Apache보다 적은 리소스로 더 빠르게 동작

Reference : http://opentutorials.org/module/384/346225

Page 26: 모바일 메신저 아키텍쳐 소개

Redis

• "REmote DIctionary System"의 약자로 메모리 기반의 Key/Value Store

• 빠른 처리(read/write) 속도와 검증된 소프트웨어 안정성 제공

• 다양한 데이터 구조 저장 : String, hash, lists, sets, sorted set, bitmap 등

• 사용하는 곳 : 트위터, 핀터레스트, 인스타그램, 텀블러 등

Reference : http://redis.io/26

Page 27: 모바일 메신저 아키텍쳐 소개

HBase• 기존 Redis NoSQL 의 한계

• 많은 Memory 공간을 필요, 분산 저장 시스템이 아님

• 다양한 NoSQL 비교 : HBase, Cassandra, MongoDB

• Benchmark 도구 : YCSB(Yahoo! Cloud Serving Benchmark), 자체 Benchmark 도구 이용

• 요구사항 : 각 시나리오에 따른 시간 제약, read/write O(1), random reads O(n) 등

Reference : http://developers.linecorp.com/blog/?p=142027

Page 28: 모바일 메신저 아키텍쳐 소개

Kakao Talk• 메시지 전송 : HTTP 기반 json 전송 -> LOCO Protocol

• 서버 : 루비온레일즈 -> C++

• 데이터베이스 : MySQL, MariaDB, TokuDB, 멤캐시드, 카산드라

Reference : http://blog.kakao.com/311

2011년 4월 ‘겁나빠른황소’ 프로젝트

28

Page 29: 모바일 메신저 아키텍쳐 소개

LOCO Procotol (1/2)

• 3가지 타입의 패킷

• LocoSecureHandShakePacket : 서버와 통신을 위해 세션을 여는 패킷(LOGIN 커맨드 패킷)

• LocoSecureNormalPacket : LOGIN 커맨드 패킷을 AES encrypt 한 후 서버와 통신(세션 유지)

• LocoPacket : 암호화가 적용되지 않는 패킷

Reference : https://www.bpak.org/blog/2012/12/29

Page 30: 모바일 메신저 아키텍쳐 소개

LOCO Procotol (2/2)

• 패킷 아이디 : 패킷 구분

• 상태 코드 : 커맨드/패킷 상태 코드

• Method : 메시지 전달, 대화 상대 추가, 차단, 채팅방 리스트 등

• Body Type, 길이, 내용

Reference : https://www.bpak.org/blog/2012/12/30

Page 31: 모바일 메신저 아키텍쳐 소개

DB 구성도 (1/2)•RDBMS

•MySQL : 출시 초기 사용한 데이터베이스

•TokuDB : 로그를 쌓는데 활용

•NoSQL

•MariaDB

•MySQL과 동일한 코드 기반, 사용 방법과 구조가 동일,

•MySQL과 99.99%의 바이너리 호환성을 제공

•초당쿼리처리 속도 2~10% 빠름

•쿼리 최적화, 서브쿼리 지원, 조인 작업 시 색인 사용률 등에서 성능 향상 효과

•memcached : 데이터 요청을 캐시에서 직접 서비스, 데이터베이스에 연결된 디스크 스토리지에 대한 접근을 줄임

•Cassandra : 분석 데이터베이스로 활용

31Reference : http://www.oss.kr/oss_repository10/517682

Page 32: 모바일 메신저 아키텍쳐 소개

DB 구성도 (2/2)

32Reference : http://www.oss.kr/oss_repository10/517682

Page 33: 모바일 메신저 아키텍쳐 소개

메신저를 만든다면?

33

Page 34: 모바일 메신저 아키텍쳐 소개

메신저 서버/클라이언트 구현 (1/3)

• XMPP 기반 서버/클라이언트

• 서버 : Openfire, MySQL, JDK

• 클라이언트 : Spark(PC client), Smack(Java library), aSmack(Smack on Android) 등

Reference : http://www.igniterealtime.org/34

Page 35: 모바일 메신저 아키텍쳐 소개

메신저 서버/클라이언트 구현 (2/3)

References : http://www.igniterealtime.org/,http://nekomimi.tistory.com/660

PC 클라이언트 안드로이드 클라이언트

35

Page 36: 모바일 메신저 아키텍쳐 소개

메신저 서버/클라이언트 구현 (3/3)

Reference : http://www.oss.kr/index.php?document_srl=100642&category=69425&mid=oss_repository1436

Page 37: 모바일 메신저 아키텍쳐 소개