[커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?
DESCRIPTION
커빙의 Django, Celery, Azure Cloud, SNS 연동, 컨텐츠 수집 기술을 한눈에 볼 수 있도록 소개한 자료 입니다. 커빙을 처음 개발하면서 많은 어려움이 있었고, 또 많은 분들의 도움으로 좋은 결과를 얻을 수 있었습니다. 조금 더 깊은 내용을 다뤘으면 하는 아쉬움이 있지만, 다른 분들에게 조금이나마 도움이 되었으면 좋겠네요!TRANSCRIPT
STACK UP YOUR SOCIAL LIFE
주식회사 내일비 / 최상호 / CTO [email protected]
2013/08/26
TECH STORY커빙은 어떻게 소셜 컨텐츠를 모아올까요?
커빙?추억을 기록하는 서비스!
온/오프라인에 산재되어 있는 사용자의 소셜 콘텐츠들을 수집하여 사용자만의 하나의 스토리를 만들 수 있는 서비스
Copyright © 2012-2013 NaleBe, All Rights Reserved.
프롤로그
2012년 3월..기획/디자인/마케팅 4명, 개발자 2명이 커빙 기획/개발 시작
신입사원만 3년째 + 진짜 신입 개발자뭘 어떻게 시작해야 하지?
맨-붕-
Copyright © 2012-2013 NaleBe, All Rights Reserved.
준비운동영감 얻기
Tumblr, 99designs, Flickr, Pinterest 아키텍쳐
이것만은 꼭!빠른 개발
수월한 문제해결가능한 적은 언어와 기술기반
Python with Django and Celery on the Cloud그리고 [모험]과 [도전]-!
http://highscalability.com/blog/2012/2/13/tumblr-architecture-15-billion-page-views-a-month-and-harder.htmlhttp://99designs.com/tech-blog/blog/2012/01/30/infrastructure-at-99designs/
http://highscalability.com/flickr-architecturehttp://highscalability.com/blog/2012/2/16/a-short-on-the-pinterest-stack-for-handling-3-million-users.html
Copyright © 2012-2013 NaleBe, All Rights Reserved.
개발 스토리
Copyright © 2012-2013 NaleBe, All Rights Reserved.
2012년
3월프로젝트 시작
6월MS/KOTRA Smart Growth 1기 사업 선정클로즈 베타 시작
7월슈퍼 앱 코리아 최우수상-문화부 장관상 수상
9월1차 오픈베타 시작, 안드로이드 앱 출시GMIC SV G-Startup "runners-up(2nd prize)", "Platinum(특별상)" 수상
10월실전창업리그-슈퍼스타V 최우수상 및 특별상(엔젤투자상) 수상
11월대규모 업데이트
12월Microsoft와 Bizspark Plus 파트너쉽 체결 (국내 최초 MS 본사 협약)
2013년
2월MS/KOTRA Smart Growth 2기 사업 선정
3월Agile/Scrum 프로세스 도입
4월2차 오픈베타 시작
7월대규모 업데이트싸이월드 수집 시작윈도우 8 앱 출시
전반적인 구조
Copyright © 2012-2013 NaleBe, All Rights Reserved.
Azure Load Balancer
RESTful + Json
Azure Virtual Network
Application Server
Task Worker
Azure Storages
Cache
Task Broker/Result Backend
Database
[Blob Storage]
- PostgresSQL- File System은 Azure Blob Storage에 연결- Replication을 통한 데이터 이중화 및 트래픽 분산
::
- NoSQL의 한 종류- 대용량의 Structured data 서비스- Notification 및 User Activity 저장소로 활용
- Python-Celery Worker- Common, Aggregation 그룹- Celery Routing Method를 이용하여 분산 환경에서 비동기 Task 수행
::
::
- Python-Django- Front-end와의 직접적인 커뮤니케이션- RESTful API 제공 - Redis: in-memory storage
- Redis: in-memory storage
[Table Storage]
- Static Files, Image 등 binary 데이터 스토리지- VM Filesystem
Management/Monitoring
[statsd/Graphite]
[Ganglia][Django Admin]
[Sentry]
[Flower]
장고(DJANGO) 와 친구들
Copyright © 2012-2013 NaleBe, All Rights Reserved.
+ 50+ 모듈- celery- social-auth- tastypie- requests- sorl-thumbnail
..... many more
- south- fabric- supervisor- gunicorn- rosetta
- 파이썬 기반 경량 웹 프레임워크- 다양한 확장 모듈- MVT (Model - View - Template) 패턴 기반- ORM (Object Relational Mapper) 기반의 쉽고 빠른 데이터 구성 및 접근- 훌륭한 성공사례 (Pinterest, Instagram, Disqus 등)
- Stack Overflow와 Quora의 수많은 사용자와 질의응답
안정적인 기술, 빠른 개발, 손쉬운 배포 => 생산성 증가
=
소셜 서비스와 연결하기
Copyright © 2012-2013 NaleBe, All Rights Reserved.
Django Social Auth
url(r'^login/(?P<backend>[^/]+)/$')
url(r'^disconnect/(?P<backend>[^/]+)/$')
Service Backends
Authentication Pipeline
Django Social Auth View
oAuth 1.0 oAuth 2.0 OpenID
oAuth 2.0 oAuth 1.0 oAuth 2.0(SK Planet 제공)
is ready!
DefaultDefault
CustomDefault
Server-sideAuthentication - Monkey patch 방식으로 기존 소스 수정 없이 커스터마이즈 할 수 있음.
- oAuth 1/2, OpenID 방식의 서비스는 비교적 쉽게 추가 가능.
Exception Middleware
몽키패치 (MONKEY PATCH)
Copyright © 2012-2013 NaleBe, All Rights Reserved.
런타임 환경에서 기존 코드의 변경 없이 기능 변경 및 확장하는 방법Python, Ruby와 같은 동적인 언어에서 지원. 특히 3rd-party 모듈의 Customize 및 패치에 유용
Case 1. Sorl thumbnail에서 GIF 이미지 Resizing 허용
from sorl.thumbnail import basebase.EXTENSIONS.update({'GIF': 'gif'})
Case 2. Django-debug-toolbar bug patch
import threadfrom debug_toolbar.middleware import DebugToolbarMiddleware
def monkey_process_view(self, request, view_func, view_args, view_kwargs): __traceback_hide__ = True toolbar = self.__class__.debug_toolbars.get(thread.get_ident()) if not toolbar: return result = None for panel in toolbar.panels: response = panel.process_view(request, view_func, view_args, view_kwargs) if response: result = response return result
DebugToolbarMiddleware.process_view = monkey_process_view
http://blog.naver.com/PostView.nhn?blogId=ez_&logNo=140164112218https://github.com/django-debug-toolbar/django-debug-toolbar/commit/c9d3f34757e6a926dab9b37f33df36c1755ee05c
[wikipedia]
셀러리(CELERY) 개요
Copyright © 2012-2013 NaleBe, All Rights Reserved.
Python으로 구현된 메시지 기반의 단순하고 유연하며 신뢰할 수 있는 비동기, 분산 Task/Job Queue 시스템
[homepage]
Broker Worker 1
Worker N
...
Message Message
Pulling
Task1 Task
2
Task3
Task1 Task
4
Task5
Router Job/TaskQueue
Message- Task/Job에 대한 정보, 속성, 결과 등 (name, uuid, args, etc, uuid, result, etc,.)- pickle, json, yaml 등의 형태
Broker- Message가 적절한 Worker에게 전달될 수 있도록 중계- RabbitMQ, Redis, MognDB 등으로 운영
Worker- Celery Worker Process- Broker로 부터 전달받은 Message를 해석하여 적절한 Task/Job을 수행
Tasks- Python Class로 구현되며 Task/Job의 실행 단위- Group, Chain, Chord, Map, Chunks등의 요소를 통해 비동기/분산 환경에서 Task를 유연하게 활용할 수 있음
Router
Celery Worker Group
소셜 컨텐츠 모아오기
Copyright © 2012-2013 NaleBe, All Rights Reserved.
AggregationInitializer
FacebookHandler
TwitterHandler
CyworldHandler
[Task Broker]
[Result Backend]
[FB-1]
[TW-1]
[CY-1]
[FB-2]
Name: fb-1Queue: aggr_fb, aggr_defaultConcurrency: 400
N: fb-2Q: aggr_fb, aggr_defaultC: 400
N: tw-1Q: aggr_tw, aggr_defaultC: 400
N: cy-1Q: aggr_cy, aggr_defaultC: 400
class AggregationRouter(object): def route_for_task(self, task, args=None, kwargs=None): if task in ['aggregation.v0_5.facebook.trigger', 'aggregation.v0_5.facebook.posts.start', 'aggregation.v0_5.facebook.posts.save', 'aggregation.v0_5.facebook.albums.start', 'aggregation.v0_5.facebook.albums.folder', 'aggregation.v0_5.facebook.photo.save', 'aggregation.v0_5.facebook.request']: return {'queue': 'aggr_fb', 'exchange': 'aggr_fb', 'exchange_type': 'topic', 'routing_key': 'aggregation.facebook.tasks'}
<JSON message>
<JSON message>
<JSON message>
<JSON message>
Django Social Auth
PlanetXAPI.get_cy_photo_albums(user)
Requests Wrapper
MS 윈도우 애져(AZURE)
Copyright © 2012-2013 NaleBe, All Rights Reserved.
Linux VM (Virtual Machine)
- Scale up/out이 비교적 간단함- File Storage를 Blob Storage와 연동하여 VM 환경의 가용성 바깥에서 발생하는 문제를 효과적으로 대응할 수 있음- Visual Studio와 Power Shell같은 강력한 Azure VM 원격 관리 환경이 윈도우에서만 제공되는점은 아쉬움
Virtual Network- 사용하는 서버 군을 동일한 가상 네트워크에 할당 함으로서 분산 환경에서의 통신 및 관리 효율을 극대화 할 수 있음
Blob Storage- Binary 파일 저장소로 CDN(Content delivery network) 제공
Table Storage- NoSQL 타입의 저장소로서 Restful API를 사용하여 구조화된 데이터를 비교적 빠르고 쉽게 저장하고 질의할 수 있음
MS에서 제공하는 클라우드 서비스Linux/Windows VM, Cloud Storage, MSSql, NoSQL 등의 각종 서비스를 IaaS 혹은 PaaS 형태로 제공
Azure Dashboard Menu
애져에서 장고 운영하기
Copyright © 2012-2013 NaleBe, All Rights Reserved.
LinuxVM과 장고 서비스를 운영하기에 비교적 안정적이며,BizSpark 파트너쉽과 연계하여 국내 스타트업이 처음 도입하기에 수월
Django Filesystem과 Blob Storage의 연동- MS에서 공식적으로 Azure Python 라이브러리 제공- Django-storages 모듈에서 Blob Storage 지원 (>= 1.1.7)- 커빙이 처음 Azure에 올라갔을 때에는 AzureStorage 모듈이 없어 자체 구현 (Blob storage의 기본 content-type이 application/octet-stream이며 라이브러리에서 수동으로 설정 하도록 되어 있어 MIME type 기반으로 자동 설정 하도록 함)
Table Storage의 활용- Django Storage와 Django Model Query-set을 참조하여 CRUD Wrapper(insert, delete, update, filter method) 자체 구현- 특히 filter의 경우 Django Model Query-set과 유사항 형태로 구현- 커빙에서는 비동기 Notification을 위한 noti-storage로 활용
애져에서 장고 운영하기는 전체적으로 무난- Storage 외에는 OpenStack 계열이나 Amazon ec2의 VM 서비스와 큰 차이는 없음- Azure Python 라이브러리는 잘 제공되고 있으나 문서화는 부족한 편. 주석이 워낙 잘 적혀 있고 코드도 공개되어 있어 특별히 문제가 되지는 않음. 특히, 최근 라이브러리나 문서들이 빠른 속도로 업데이트 되고 있음- Redis나 PostgresSQL처럼 Start-up들이 최근 많이 사용하는 솔루션을 기본 서비스로 제공하지 않지만 Linux VM에서 운영하는데 무리가 없음
[BizSpark]
서비스 배포: FABRIC
Copyright © 2012-2013 NaleBe, All Rights Reserved.
Python 기반의 command-line 도구로서 ssh 기반의 원격 command 제공
fab command args or kwargs:
Simple commandfab run_server -> 로컬 서버 가동
Command with argumentsfab run_server :prod.live -> live 모드 서버 로 가동
Command with keyword argumentsfab collect_static:mode=prod.live,options=-c -> static 파일(image, css, js) 배포
Command Channingfab app reload_gunicorn -> 모든 원격 app 서버의 gunicorn 재시동fab app collect deploy -> 모든 원격 app 서버 업데이트, static 파일 배포 및 재시동fab worker deploy -> 모든 원격 celery worker 서버 업데이트 및 재시동fab aggregator reload_celery -> 원격 aggregation worker 서버만 celery 재시동
[homepage]
* fabfile.py에 정의
장고 관리페이지 (DJANGO ADMIN)
Copyright © 2012-2013 NaleBe, All Rights Reserved.
Django Model 기반으로 자동 생성되는 관리페이지 제공
[Django Admin]
[Django Admin with Grappelli]
Django ORM 기반- Model Definition에 따라 CRUD가 편리한 FORM 및 Validation 자동 제공
권한과 그룹- 관리자 타입(staff, superuser)과 사용자 그룹 정의, 그룹에 따른 권한을 모델별로 할당 함으로서 필요한 관리자에게 적절한 정보 접근 권한을 분배할 수 있음
Customize- Action, Form, Template 등 거의 대부분의 요소에 대하여 비교적 쉽게 커스터마이즈 해서 사용할 수 있음
Django Grappelli [homepage]
- 3rd-party로 제공되는 admin interface로서 기본 UI보다 유려하고 동적이며 직관적인 UI 및 커스터마이즈 기능 제공
관리자 페이지 기반 이메일 발송 시스템
Copyright © 2012-2013 NaleBe, All Rights Reserved.
+[Django Admin] [Admin Actions]
수신자 model
메일 컨텐츠 model
메일 발송 model
발송 내역 model
+ +
Django Admin을 사용하면 사내의 비 개발팀(경영지원, 마케팅 등)에 필요한 프로그램을 손쉽게 개발할 수 있어 사내 업무효율 향상에 큰 도움이 됨
1. 수신자 등록 (지속적으로 관리)2. 메일 컨텐츠 등록3. 메일 발송 건 등록 (수신자와 발송할 메일 컨텐츠 선택)4. 테스트 메일 발송 및 리뷰5. 발송준비 완료 처리6. 메일 발송 (이전 단계가 처리가 되어있지 않으면 발송 불가)
모니터링 및 로깅
Copyright © 2012-2013 NaleBe, All Rights Reserved.
Ganglia분산 자원 통합 모니터링 시스템다양한 플러그인 제공
statsd + Graphitestatsd: 단순한 stat 전송 clientgraphite: 수집된 stat을 Visualization 시켜주는 시스템커빙에서는 사용자 request 통계(메뉴별, 성별별 등)에 활용
FlowerWeb 기반 Celery 모니터링 및 관리 시스템Task, Queue 모니터링 및 상태 조회/변경 제공특히 언제 어디서나 Worker 상태를 확인할 수 있고 디버깅에도 유용하다는 것이 큰 장점
SentryDisqus 팀에서 Django를 기반으로 개발한 실시간 로깅/오류 레포팅 시스템사용자 관리, 이메일 노티, 비교적 상세한 Stacktrace 제공하며 다양한 개발환경 지원
애자일 방법론 (AGILE METHODOLOGIES)
Copyright © 2012-2013 NaleBe, All Rights Reserved.
기획
디자인
구현
마케팅
2주
고객
제품 주인
임직원
제품 백로그
우선순위할당
Story 추가
Sprint 1 Sprint 2 Sprint 3
모든 절차 필요
디자인 불필요
기획 불필요
구현만 필요
전 직원이 제품 기획에 참여하고 디자인과 구현, 마케팅이 짧은 주기 단위로 반복되어 소수의 인원 이지만 최고의 생산성을 발휘
에필로그
Copyright © 2012-2013 NaleBe, All Rights Reserved.
2013년 8월..
정식 서비스 개시
Thanks to스마트스터디 CTO 박현우 님
한국MS 박승호 부장님, 이건복 차장님코트라 Smart Growth 사업팀전 세계의 오픈소스 개발자
그리고,
내일비 식구들!!!
Copyright © 2012-2013 NaleBe, All Rights Reserved.
커빙은 열정 가득한 구성원들이 만듭니다!함께 하실 분은 [email protected]으로 연락주세요.