55
개발하기 바쁜데 푸시와 메시지큐는 있는거 쓸래요 2015-10-27 Youngjae KIM, Azure MVP

[Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

Embed Size (px)

Citation preview

Page 1: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

개발하기 바쁜데 푸시와 메시지큐는 있는거 쓸래요

2015-10-27

Youngjae KIM, Azure MVP

Page 2: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

저는요

• 김영재 • Azure MVP (2014~)

• ㈜바풀, 바로풀기 서비스 개발총괄 • (전) 카이스트 디지털미디어연구소 연구원

• (전) 영국 Ubisense UK 기술컨설턴트

• (전) 일본 국립전자통신연구소 스마트홈 미들웨어 연구원

• 바로풀기 소개 • 소셜서비스 스타트업 (23억원 투자유치, 12명 직원)

• 중고등학생 학습 서비스 MAU 1위

Page 3: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

먹고 자고 코딩하는거 좋아하는 개발자

Page 4: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

이 세션의 대상은

• 이득 • 다른 솔루션 유저

• 처음 관련된 시나리오의 제품을 만드시는 분

• 어쩌다 들어오신 분

• 손해 • 이미 오늘 소개할 Azure 서비스를 사용 중인분

• 어떤 기술 앞에서도 시큰둥한 분

• 절대로 클라우드를 도입할 가능성도 생각도 없으신 분

Page 5: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

???

Page 6: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

들어가는 이야기

Page 7: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

프로그래머란?

• 컴퓨터가 문제를 해결하도록 시스템을 만드는 사람

• 저 수준의 데이터를 고 수준으로 바꾸는 사람

Page 8: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

흔한 인터넷 서비스 시나리오

유저가 앱으로

무엇인가를 하면 백그라운드 작업 후에 잠시 후 푸시가 오고

Page 9: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

프로그래머가 할 일은

• 무엇인가를 정의

• 작업에서 의미를 추출

• 푸시로 다음 데이터 흐름을 유도

유저가 앱으로

무엇인가를 하면 백그라운드 작업 후에 잠시 후 푸시가 오고

Page 10: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

판단

• 돈 내고 쓰는 솔루션 vs. 서버를 직접 관리하는 자신감

• 더 빨리 런칭할 수 있는가

• 더 안정적으로 관리할 수 있는가

• 더 확장에 대비할 수 있는가

• 클라우드 사고방식. 동의 못하면 의미 없음 • 퍼포먼스는 확장성과 돈으로 커버 가능

• 그 대신 시간과 운영 편의를 얻는다

Page 11: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

Azure 3년 써보니…

• 2년간 행복함

• 좋은 이유는 좋을 수 밖에 없도록 만들었기 때문

Page 12: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

오늘 다룰 내용

• Azure가 제공하는 Message Queue

• Push Notification Hub 사용법

• 이들을 이용한 WebJob 데모

Page 13: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

흔한 인터넷 서비스 시나리오

유저가 앱으로

무엇인가를 하면 백그라운드 작업 후에 잠시 후 푸시가 오고

Page 14: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

흔한 구조

REST API Background

Worker

Push Notification

Server

Message Queue (MQ)

Page 15: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

Azure 대응 #1

Web Role Worker Role Notification Hub

Service Bus

Page 16: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

Azure 대응 #2

WebSites WebJobs Notification Hub

Storage Queue

Page 17: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

소개할 Azure 구성요소

• Azure Queue

• Azure Service Bus

• Azure WebJobs

• Azure Push Notification Hub

Page 18: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

1. Message Queue

Page 19: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

MQ의 조건

• 중요도순 • 안정성

• 퍼포먼스 (초당 처리량)

• 확장성

• API 편의성

• 보안: 주로 내부 통신용으로 사용

Page 20: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

Comparison

Azure Rabbit MQ

안정성 ++ ++

퍼포먼스 ++ +++

확장성 +++ +

API +++ ++

AWS SQS와의 비교? - 두 클라우드는 무엇을 선택하든 성능, 가격, 안정성이 비슷합니다. 가격은 Azure가 좀 더 저렴 (후발주자니까?!)

가격 비교 - 100 msg/sec 이상은 RabbitMQ + Large VM * 3개 운영이 더 저렴 ($535 수준) [참고링크] - 시간비용까지 생각하면 200 msg/sec 정도를 기준으로 삼아도 될 듯

Page 21: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

“큐(queue)로 이벤트 처리하고 싶어요“

Azure Queue로 쉽고 빠르게 만들기 Service Bus로 발전적으로 만들기

동작원리 - Storage의 응용판

장점 - 대용량 대응 - Azure WebApp의 WebJob의 쉬운 바인딩 단점 - 큐 기능에만 충실할 뿐

동작원리 - Service Bus에 기록하면 Subscribe로 작동

장점 - 더욱 풍부한 메시징 API, AMQP - 다양한 유형의 브로커 처리 (topic, relay, …) 단점 - 저렴하다고 할 순 없음.

두 기술의 차이 상세 설명 • 스펙 비교: https://azure.microsoft.com/ko-kr/documentation/articles/service-bus-azure-and-service-bus-queues-compared-contrasted/ • 코드 비교: http://msdn.microsoft.com/en-us/magazine/jj159884.aspx

Page 22: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

1.1 Azure Queue (Storage)

Page 23: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

특징

• Blob기반 Database인 Azure Storage를 이용한 Queue • 그래서 가지는 특징은

• 대용량 큐 저장 가능 • 빠르게 넣고 뺄 수 있음 (latency < 10ms) • 저렴한 가격 • 메시지 단위 Lock

• 그래서 발생한 단점은 • 순서 처리를 보장 안함 • 트랜잭션 안됨 • 폴링으로만 처리 • AMQP 같은 고상한건 지원 안함

• 임의로 만든 점 • 최대 7일 저장 (TTL)

Page 24: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

Azure Queue 사용 예시

어딘가에서 입력

Azure Storage

Queue

Blob

Table

Web App

WebJob

Queue는 입력받으면 WebJob에서 자동으로 실행, 결과는 Azure Table 등에 담을 수 있음.

트리거

Page 25: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

솔직히…

• 문서화가 너무 잘되어있어서 딱히 설명할 것이 없네요! • API 사용법: https://azure.Microsoft.com/en-

us/documentation/articles/storage-dotnet-how-to-use-queues/

• 바로 데모 프로그램을 실행해봅시다

Page 26: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

Azure Queue 활용 예시

• Azure WebJob과 연동 • 콘솔프로그램을 만든 후 github에 올리면 자동

으로 Pull Compile Deploy 동작.

• 브라우저에서 테스트 및 로그 확인 가능.

• 자동 스케일링 지원.

• 트리거, 계속, 스케줄링 등 실행유형 지정.

• 참고사항 • 간단한 작업에 좋음

• 대표적인 예시: 이미지 압축

• 속도가 빠르진 않음

• 관련 문서 • WebJob 시작하기

• WebJob 관련 자료 모음

Page 27: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

곁다리 지식: Azure WebJobs의 주요 특징

• 병렬적 처리: 16개(기본값)의 큐를 벌크로 받아와서 처리

• 멀티스레드로 동작: 병렬 같은 병렬 아닌 동작

• 그러므로 주의사항은! • 같은 메시지가 두 번 처리될 수도 있음. 즉, 같은 메시지에 대해 다른 결과가 나오도록 하면 안됨

• Azure WebApp의 인스턴스 수에 제약이 됨

• 간단해서 쓰는거지 좋아서 쓰는거 아니다! • 이미지 리사이즈 등에 사용

Page 28: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

난데없이 퀴즈퀴즈!

• 다음 중 Azure Queue Storage가 제공하는 기능이 아닌 것은? 1. 80GB 이상의 메시지 저장

2. 5일 이상의 TTL

3. AMQP v1.0

4. WebJob 바인딩

Page 29: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

1.2 Service Bus

Page 30: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

Service Bus 개요

• Push Notification Hub도 Service Bus 중 Topic의 응용.

• 구성 • Queue

• Topic

• Relay

• Notification Hub

Page 31: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

Service Bus 간단 개념잡기

• Queue • 일명 ‘선입선출(FIFO)’ 방식의 데이터 처리를 위한 대기열. • 주로 이벤트 처리에 활용. • OS의 핵심 요소 중 하나.

• Topic • Queue의 확장판으로 분기해주는 switch가 더해짐. • 일명 Publisher-Subscriber 방식이라고도 함. • 분산시스템의 핵심 요소 중 하나.

• Relay • WCF를 활용한 서비스 제공 모델. • WCF 기반으로 서비스가 구축된 엔터프라이즈 환경에 적합. • 참고: WCF는 REST 기반 웹API 기능 외에, 동기화, 양방향성, 세션처리, 보안 등에 여지가

많음.

Page 32: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

Service Bus Queue

단순한 구조인만큼 코드도 간단함.

http://azure.microsoft.com/en-us/documentation/articles/service-bus-dotnet-how-to-use-queues/

Page 33: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

Service Bus Topic

중요 개념: 가상의 큐가 각 토픽마다 할당된 것과 마찬가지. http://azure.microsoft.com/en-us/documentation/articles/service-bus-dotnet-how-to-use-topics-subscriptions/?fb=ko-kr

Page 34: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

코드 들여다보기

• 바로풀기가 사용 중인 Service Bus Queue

Page 35: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

2. Azure Notification Hub

Page 36: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

그래서 많이 보이는 글

Page 37: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

Azure Push Notification Hub

• Azure ServiceBus에 Token DB와 push endpoint를 추가한 형태

• 퍼포먼스는 ServiceBus에 종속적 • 입력은 초당 2000건

• 하지만 출력은 모른다!?

• 일종의 푸시 미들웨어 • 다양한 토큰규격, 핸드쉐이크 형태를 일원화하고 통합ID로 관리

• 한 유저의 멀티디바이스에 대응하기 편리

Page 38: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

사용 형태

Device 1 Register Gateway

Push Notification

Hub

Request Push

Notification Hub

Device 1

Device 2

Device 3

1. 기기 등록

2. 전송

reg_id

handle

Page 39: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

API Overview

• 등록 형태: 단말 별로 템플릿을 등록하여 처리

Page 40: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

API Overview

• 전송은 단말 무관하게 코드 한 줄.

Page 41: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

Notification Hub 작동 원리 (기본)

어딘가에서 입력

사용자 단말로 전송 Google GCM

Apple APNS

Windows WNS

푸시 플랫폼 별 토큰을 이용하여 전송

Azure Topic 처리기

전송 결과 취득 불량 전송 건에 대한 피드백 처리

Page 42: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

Notification Hub 작동 원리 (상세)

어딘가에서 입력

사용자 단말로 전송 Google GCM

Apple APNS

Windows WNS

푸시 플랫폼 별 토큰을 이용하여 전송

Azure Topic 처리기

전송 결과 취득 불량 전송 건에 대한 피드백 처리

토픽1+채널+내용

토픽2+채널+내용 토픽1 +내용

채널 + 토픽1 등록

Topic & Channel Key-Values

1

2

4

5

6 3

Page 43: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

푸시 태그를 잘 생각해서 써야 한다

• 태크는 Key이며, Key-Value 로 이루어진 값을 대상에게 전송합니다. • Service Bus 토픽이 곧 Push Notification 태그

• 기본 활용: 한 ID의 단말에 보내고 싶다 • 태그명: userId • 예시: userId=Youngjae • 참고: userId=Youngjae로 등록된 모든 단말에 전송 (내 모든 단말)

• Microsoft를 “좋아요” 한 사람들에게 보내고 싶다. • 태그명: like • 예시: like=Microsoft

• Microsoft를 “좋아요” 한 한국어 유저들에게 보내고 싶다. • 태그명1: like, 태그명2: locale • 예시: like=Microsoft && locale=“ko-KR”

Page 44: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

실제로는?

1. 태그에만 맡기기에는 서비스가 보다 세밀하게 타겟팅 하길 원함 2. 서비스가 워낙 변화무쌍하게 바뀌어서 푸시 DB를 갱신하는 것은 비효율적 3. 태그DB와 로직DB를 모두 관리해야 함

잘 안쓰임! 그냥 ID/전체 보내는 방식으로 커버 최소한의 카테고리를 태깅: locale, userId, gender

Page 45: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

템플릿

• 템플릿은 클라이언트에서 $(name)과 같이 변수껍데기를 등록하면 보낼 때 name=“youngjae” 식으로 내용을 채워서 받을 수 있음.

• 사용 시나리오 • 한국어 유저의 폰 등록 Template = “$(Korean)”

• 서버 전송 Korean=“안녕”, English=“hello”

• 클라이언트는 푸시를 받을 때 “안녕“만 취득함.

• 토픽과 적절히 섞어 쓰면 맞춤 푸시를 보낼 수 있음. • 태그는 수신 대상을 규정

• 템플릿은 해당 범위에 세부적인 맞춤 정보를 제공

• 적용시 중요: 서비스에서 기획이 명확하게 잡혀있어야 효과가 좋음. • 안그러면 땜빵 템플릿이 넘칠 수도 있음.

Page 46: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

실용적인 팁

• 항상 태그에 “userId:아이디“를 기본으로 적용하면 좋음. • 해당 ID에 맞추어 모든 기기로 전송됨.

• 어차피 보낼 때 태그가 없으면 모두에게 보냄 (broadcast) 장점이지만 대재앙이 될 수 있으니 서버에서 깐깐하게 처리할 것.

• 동일한 이름의 template은 덮어쓰기됨. • 별도의 업데이트 처리 불필요.

• 푸시는 SMS가 아니므로 시간차가 있을 수 있음. • Free 버전일 경우 간헐적으로 몰아서 처리됨 (경험상 약 1~2분)

Page 47: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

또 난데없이 퀴즈퀴즈!

• 다음 중 Azure Notification Hub가 제공하는 기능이 아닌 것은? 1. REST API

2. MMS 전송

3. 예약된 푸시 전송

4. Amazon 디바이스 푸시

Page 48: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

실제 적용 사례

Page 49: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

바로풀기에 처음 사용했던 Azure 구성 (Apr. 2014)

Virtual Machine

WebApp

Mobile Service

Storage

Traffic Manager

Legend

MS-SQL DB

API EndPoint (Performance)

Spring F/W +CentOS

(Large VM)

Spring F/W +CentOS

(Small VM)

Storage Table

Storage Queue

Storage Blob

Web Frontend

WorkerRole

Push

ElasticSearch

EhCache

Backup DB Azure SQL

User

MongoDB

General

Backup

Page 50: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

바로풀기에 현재 사용하는 Azure 구성 (Oct. 2015)

Virtual Machine

WebApp

Push Notification

Storage

Traffic Manager

Legend

MS-SQL DB

API EndPoint (Performance)

REST

Storage Table

Service Bus

Storage Blob

Worker Role Push

Orient DB

Backup DB

Azure SQL

User

General

Backup Azure SQL

dJango (Web)

WebJobs

Page 51: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

솔직히 써보자면…

• Service Bus는 안정성은 기대보다 높습니다 • Azure에서도 가장 안정성에 공들이는 부분. • 2년간 Zero downtime • https://azure.Microsoft.com/en-us/support/legal/sla/service-bus/v1_0/ • 그래도 이중화는 하세요

• Storage 좋습니다 • Azure 서비스 중 제일 좋아합니다

• WebJob은 작년에 이어 아직도 추천하지 않습니다 • WebRole이 Deploy가 느리다는 단점 외엔 더 믿을만합니다 • NewRelic이 지원 안됨!

• 작년보다 PaaS를 더 신뢰합니다 • WebSites 추천합니다. 특히 닷넷서버와 결합시 제로스트레스! 궁극의 PaaS! • 사용경험에 직접적인 Frontend는 Traffic Manager를 이용한 이중화 필수입니다

Page 52: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

Azure 꿀팁 몇가지

• “Service Bus를 쉽게 관리하는 툴 없나요?” • Service Bus Explorer를 써보세요. 설명서, 다운로드

• 다운로드 받은 후 2.1.zip 파일을 압축 풀고 ServiceBusExplorer.exe를 실행하세요.

• “Azure Storage를 탐색기처럼 관리하는 툴 없나요?” • Azure Storage Explorer를 써보세요.

• 더 전문적인 것 (유료): Azure Management Studio

Page 53: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

Notification Hub 소스

• 꼭 한 단계씩 차근차근 해주세요. • http://azure.microsoft.com/en-us/documentation/articles/notification-

hubs-android-get-started/?fb=ko-kr

• 메시지 보내는 서버 소스 • http://blogs.msdn.com/b/azuremobile/archive/2014/04/08/push-

notifications-using-notification-hub-and-net-backend.aspx

• 좋은 예시 • https://github.com/sabbour/breakingnews

• 안드로이드 프로그래머는 아래 링크 참조. • http://www.slideshare.net/agrocholski/google-devfest-mn-notification-hubs

Page 55: [Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)

http://aka.ms/td2015_again

TechDays Korea 2015에서 놓치신 세션은 Microsoft 기술 동영상 커뮤니티 Channel 9에서

추후에 다시 보실 수 있습니다.