More Related Content Similar to NDC15_백정상_최종_모바일_앱의_실시간_운영을_위한_유저분석과_타게팅_기법 (20) NDC15_백정상_최종_모바일_앱의_실시간_운영을_위한_유저분석과_타게팅_기법14. 기획자 : “친구가 방문하면 푸시로 알려줘야 할 것 같아요”
나 : “저 지금 컨텐츠도 수정 중인데…”
기획자 : “당장 내일 퍼블리셔 만나야 하는데 푸시 없으면 안돼요 ㅠㅠ“
갑자기 다가와 상냥한 말투로
19. 발송 시각은 개발자가 수동으로 설정
발송 시점마다 매번
전체 유저에게 제대로 발송 되었는지
유저가 실제 메시지를 봤는지
“구글/애플이 하라는 대로 했어요“
“잘 날아갔을 거에요“
21. 보통 혼자 아니면 둘
게임은 재미있어야 돈을 번다
재미있게 만들기에도 빠듯한 개발기간
당연히 운영/관리툴은 날림으로
누군가가 나 대신 해줬으면 좋겠다
23. 운영 시스템 개발
“스테이지 100판이상 깬 유저에게만 푸시를 보내고 싶어요“
“그중 몇 명이나 푸시를 열어봤는지 알고 싶어요“
25. 마케터가 웹 페이지로
직접 푸시 이벤트를 등록하고
해당 푸시가 필요한 유저에게만
예약 된 시간에 발송하고
몇 명이나 푸시를 봤는지 알려줬으면
프론트
백엔드
타게팅 디비
푸시 센더
액티비티 트래커
26. 개발자의 도움 없이 마케터가 직접 푸시 이벤트 등록
타게팅 데이터 기반으로 유저 타게팅
ASP.net MVC + Bootstrap
잘 만들어진 생산성 높은 웹 프레임워크
프론트
27. 푸시 이벤트 등록/변경
유저 타게팅 정보 관리
Restful하게 프로토콜을 구현하긴 어렵다
내부 리소스를 사용자가 제어하게 두면 관리가 어려움
HTTP(POST) + JSON
node.js 로 빠르게 구현하자
백엔드
28. 여러 종류의 앱이
정의되지 않은 유저 타게팅 데이터를
빠르게 입력/검색해야 하는 데이터베이스
1앱 == 1 콜렉션
NoSQL이 답
이 시스템의 실시간을 책임진다
node.js와 궁합이 좋은 mongoDB로 빠르게 구현하자
타게팅 디비
29. 자주 변경되지 않는 정보
디바이스, 국가, 언어, 결제금액, 결제횟수
빈번하게 변경되는 정보
게임 데이터 : 스테이지, 레벨, 직업
마케팅 데이터 : 이벤트 참여,
수익화 : 결제, 오퍼월 리워드 지급
타게팅 정보
30. 자주 변경되지 않는 정보
분석 시스템에서 매일 갱신하자
빈번하게 변경되는 정보
앱에서 실시간으로 직접 받아 갱신
타게팅 정보 업데이트
31. npm에 푸시를 전송하는 기능은 충분히 많은 모듈이 존재
최적화를 통해 GCM은 1분당 30만건 정도 전송
APNS는 best effort로 전송됨
푸시센더
32. 푸시 반응 트래킹
푸시를 받고 24시간 안에 실행했다면 반응
대신 1시간 단위로 반응 수치를 보여주자
타게팅 데이터 트래킹
스테이지 클리어
유료 결제
오퍼월에서 리워드 지급
개발사에서 마음대로 커스텀 가능
액티비티 트래커
35. 초기 시스템 요약
총 개발기간 : 약 3개월
가장 필요한 기능 위주
타게팅 데이터 매니저
푸시 이벤트 예약/발송
발송유저 타게팅
푸시 총 반응 리포트
37. 클로즈 베타
일본에서 이미 히트한 모 게임
“출시 전에 푸시서비스 만들어야 하는데 잘 됐네요“
“테스트해야 했는데 잘 되었네요“
“원하는 것을 다 해드리겠습니다”
38. 연동 후 출시
출시 하자마자 인기무료 1위
그 뒤로 약 2주간 1위
출시 하자마자 바로 100만 이상의 유저유입
40. 인덱싱 이슈
WAS를 아무리 투입하고 스케일-업해도 계속 CPU 100퍼센트
아 이건 디비 이슈다
디비 상태를 보니 CPU 100퍼센트
mms를 보니 요청이 전부 디비 풀스캔
아 이건 인덱스 이슈다
몇몇 타게팅 데이터에 인덱스를 걸자 기적과 같이 서비스가 말짱해짐
42. 인덱싱 이슈 (cont.)
개발사에서 타게팅 데이터를 추가할 때 마다
서버에서 자동으로 해당 값을 인덱싱
8개의 타게팅 데이터 == 8개의 인덱스 추가
몽고디비 인덱스 64개 제한의 압박
43. 처음엔 DMP에서 프로필을 추출해 일괄 입력 했었음
mongodb는 insert가 느림
2.6 버전 락 구조상 전체 성능저하 이슈
유저가 수백만이 되자 일괄 입력이 성능상 불가능
유저 로그인 시점에 DMP에서 비동기 갱신하자
타게팅 데이터 갱신이슈
44. 기능 개선
매번 타게팅 하려니 귀찮다
실시간 유저그룹, 타게팅 정보 관리
매번 이벤트 등록하려니 귀찮다
요일, 시간별 이벤트 관리
경쟁사는 HTML이나 이미지로 이쁘게 푸시 보내던데
HTML, 이미지 푸시 지원
동일 그룹에 메시지를 다르게 보내서 성과를 측정하고 싶다
A/B 테스팅 추가
푸시를 받으면 특정 앱 페이지로 이동시키고 싶다
딥링킹 추가
48. write가 빠를 때 == 모든 데이터가 램에 올라와 있을 때
사용자가 늘어나자 캐시 미스 발생
콜렉션당 도큐먼트가 200만개가 넘어가면 성능에 영향
AWS ElasticCache 적용
동일한 유저그룹 요청일 경우 캐시에서 전송
몽고디비의 배신
49. 일괄입력, 일괄 업데이트 금지
일괄처리의 휴리스틱 최대치는 1000개
MapReduce나 Aggregate는 시기상조
Read는 Secondary preferred로
Lock 관리
51. 몽고디비 샤딩은 컬렉션 기반
오토 리밸런스는 재앙
앱 추가될 때 마다 컬렉션 생성하고 수작업으로 샤딩;;;
현실적으로 손이 많이 감
샤딩
52. 온라인 게임 서버 증설하는 방식
기존 리플리카 셋은 페더레이션 0번 이후 1씩 증가
새로운 페더레이션 멤버가 추가되면 수작업
앱별 페더레이션 맵퍼 구현
수동 페더레이션
54. 푸시 이벤트가 많이 처리되다 보니
푸시 API -> 푸시 센더로의 http 요청이 가끔 실패하는 경우가 있음
SQS를 통해 푸시 전송 요청 메시지 유실 방지
푸시 센더 병렬화가 간편해짐
푸시가 계속 발송중 상태에요
55. 대부분 고객사 자체적으로 푸시 서비스를 만들어 쓰는 상황
APNS는 큰 문제가 없으나
GCM은 register를 누가 먼저 어떻게 하느냐에 따라 푸시 발송불가
멀티푸시가 가능하도록 구현 및 가이드 제공
우리 자체 푸시도 써야 되는데
56. 꿀팁 : 푸시 이벤트 운영 노하우
리포트를 통해 성과 최적화
57. 전체 유저에게 지속적으로 보내면 반응이 하락
최근 1일 내 접속 유저에게만 보내면 반응이 상승
점심보단 저녁에 보내는 것이 효과적
동일한 메시지를
58. 주중보다 주말에 푸시를 더 많이 볼까?
어느 시간대에 푸시를 보내야 할까?
전체 데이터 중 일부를 샘플링하여 분석
요일/시간대별 반응
62. 전체적인 반응이 점심, 저녁시간에 집중되어 있음
금요일 18~19시는 최고조 불금!
월요일 점심, 저녁 시간은 의외
재미있는 결과
64. 개발기간 : 1년+
앱 : 200+
디바이스 : 31,400,000+
진행된 캠페인 : 9,100+
푸시 발송건수 : 540,000,000+
성과
65. 마케팅 캠페인 기능 추가
공지팝업 New!
마케팅 및 운영에 필요한 실시간 정보 제공
방금 접속한 유저의 성향 알림
최근 1시간동안의 매출정보
실시간 정보 기준 유저 타게팅
앞으로의 과제
66. 팔지 말고 돕자
고객이 불편하면 우리 잘못
애정이 있어서 쓴 소리도 하시는 것
고객이 필요한 기능은 우리의 다음 발걸음
느낀 점
Editor's Notes 일반적으로 생각하는 스타트업은 아이디어를 빠르게 실행시키는 곳이라 생각하고 그게 맞습니다 하지만 그거만으로도 야근을 밥먹듯이 해야하는 문제가 있죠 빠른 출시는 곧 빠른 대박 없는 시간 쪼개서 푸시서버 구현 없는 시간 쪼개서 푸시서버 구현 없는 시간 쪼개서 푸시서버 구현 없는 시간 쪼개서 푸시서버 구현 없는 시간 쪼개서 푸시서버 구현 없는 시간 쪼개서 푸시서버 구현 없는 시간 쪼개서 푸시서버 구현 없는 시간 쪼개서 푸시서버 구현 없는 시간 쪼개서 푸시서버 구현 없는 시간 쪼개서 푸시서버 구현 없는 시간 쪼개서 푸시서버 구현 없는 시간 쪼개서 푸시서버 구현 없는 시간 쪼개서 푸시서버 구현 없는 시간 쪼개서 푸시서버 구현 없는 시간 쪼개서 푸시서버 구현 없는 시간 쪼개서 푸시서버 구현 없는 시간 쪼개서 푸시서버 구현 없는 시간 쪼개서 푸시서버 구현 없는 시간 쪼개서 푸시서버 구현 없는 시간 쪼개서 푸시서버 구현 없는 시간 쪼개서 푸시서버 구현 없는 시간 쪼개서 푸시서버 구현 없는 시간 쪼개서 푸시서버 구현 없는 시간 쪼개서 푸시서버 구현 없는 시간 쪼개서 푸시서버 구현 없는 시간 쪼개서 푸시서버 구현 없는 시간 쪼개서 푸시서버 구현 없는 시간 쪼개서 푸시서버 구현 없는 시간 쪼개서 푸시서버 구현 없는 시간 쪼개서 푸시서버 구현 없는 시간 쪼개서 푸시서버 구현 없는 시간 쪼개서 푸시서버 구현 없는 시간 쪼개서 푸시서버 구현 없는 시간 쪼개서 푸시서버 구현 없는 시간 쪼개서 푸시서버 구현 없는 시간 쪼개서 푸시서버 구현 없는 시간 쪼개서 푸시서버 구현 없는 시간 쪼개서 푸시서버 구현 없는 시간 쪼개서 푸시서버 구현 없는 시간 쪼개서 푸시서버 구현 없는 시간 쪼개서 푸시서버 구현 없는 시간 쪼개서 푸시서버 구현