21
STACK UP YOUR SOCIAL LIFE 주식회사 내일비 / 최상호 / CTO [email protected] 2013/08/26 TECH STORY 커빙은 어떻게 소셜 컨텐츠를 모아올까요?

[커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?

  • Upload
    -

  • View
    1.837

  • Download
    3

Embed Size (px)

DESCRIPTION

커빙의 Django, Celery, Azure Cloud, SNS 연동, 컨텐츠 수집 기술을 한눈에 볼 수 있도록 소개한 자료 입니다. 커빙을 처음 개발하면서 많은 어려움이 있었지만 많은 분들의 도움으로 좋은 결과를 얻을 수 있었답니다! 이에 다른 분들에게 조금이나마 도움이 되었으면 좋겠다는 마음으로 공유합니다 : )

Citation preview

Page 1: [커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?

STACK UP YOUR SOCIAL LIFE

주식회사 내일비 / 최상호 / CTO [email protected]

2013/08/26

TECH STORY커빙은 어떻게 소셜 컨텐츠를 모아올까요?

Page 2: [커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?

커빙?추억을 기록하는 서비스!

온/오프라인에 산재되어 있는 사용자의 소셜 콘텐츠들을 수집하여 사용자만의 하나의 스토리를 만들 수 있는 서비스

Copyright © 2012-2013 NaleBe, All Rights Reserved.

Page 3: [커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?

프롤로그

2012년 3월..기획/디자인/마케팅 4명, 개발자 2명이 커빙 기획/개발 시작

신입사원만 3년째 + 진짜 신입 개발자뭘 어떻게 시작해야 하지?

맨-붕-

Copyright © 2012-2013 NaleBe, All Rights Reserved.

Page 4: [커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?

준비운동영감 얻기

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.

Page 5: [커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?

개발 스토리

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 앱 출시

Page 6: [커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?

전반적인 구조

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]

Page 7: [커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?

장고(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의 수많은 사용자와 질의응답

안정적인 기술, 빠른 개발, 손쉬운 배포 => 생산성 증가

=

Page 8: [커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?

소셜 서비스와 연결하기

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

Page 9: [커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?

몽키패치 (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]

Page 10: [커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?

셀러리(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를 유연하게 활용할 수 있음

Page 11: [커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?

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

Page 12: [커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?

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

Page 13: [커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?

애져에서 장고 운영하기

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]

Page 14: [커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?

서비스 배포: 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에 정의

Page 15: [커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?

장고 관리페이지 (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 및 커스터마이즈 기능 제공

Page 16: [커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?

관리자 페이지 기반 이메일 발송 시스템

Copyright © 2012-2013 NaleBe, All Rights Reserved.

+[Django Admin] [Admin Actions]

수신자 model

메일 컨텐츠 model

메일 발송 model

발송 내역 model

+ +

Django Admin을 사용하면 사내의 비 개발팀(경영지원, 마케팅 등)에 필요한 프로그램을 손쉽게 개발할 수 있어 사내 업무효율 향상에 큰 도움이 됨

1. 수신자 등록 (지속적으로 관리)2. 메일 컨텐츠 등록3. 메일 발송 건 등록 (수신자와 발송할 메일 컨텐츠 선택)4. 테스트 메일 발송 및 리뷰5. 발송준비 완료 처리6. 메일 발송 (이전 단계가 처리가 되어있지 않으면 발송 불가)

Page 17: [커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?

모니터링 및 로깅

Copyright © 2012-2013 NaleBe, All Rights Reserved.

Ganglia분산 자원 통합 모니터링 시스템다양한 플러그인 제공

statsd + Graphitestatsd: 단순한 stat 전송 clientgraphite: 수집된 stat을 Visualization 시켜주는 시스템커빙에서는 사용자 request 통계(메뉴별, 성별별 등)에 활용

FlowerWeb 기반 Celery 모니터링 및 관리 시스템Task, Queue 모니터링 및 상태 조회/변경 제공특히 언제 어디서나 Worker 상태를 확인할 수 있고 디버깅에도 유용하다는 것이 큰 장점

SentryDisqus 팀에서 Django를 기반으로 개발한 실시간 로깅/오류 레포팅 시스템사용자 관리, 이메일 노티, 비교적 상세한 Stacktrace 제공하며 다양한 개발환경 지원

Page 18: [커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?

애자일 방법론 (AGILE METHODOLOGIES)

Copyright © 2012-2013 NaleBe, All Rights Reserved.

기획

디자인

구현

마케팅

2주

고객

제품 주인

임직원

제품 백로그

우선순위할당

Story 추가

Sprint 1 Sprint 2 Sprint 3

모든 절차 필요

디자인 불필요

기획 불필요

구현만 필요

전 직원이 제품 기획에 참여하고 디자인과 구현, 마케팅이 짧은 주기 단위로 반복되어 소수의 인원 이지만 최고의 생산성을 발휘

Page 19: [커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?

에필로그

Copyright © 2012-2013 NaleBe, All Rights Reserved.

2013년 8월..

정식 서비스 개시

Thanks to스마트스터디 CTO 박현우 님

한국MS 박승호 부장님, 이건복 차장님코트라 Smart Growth 사업팀전 세계의 오픈소스 개발자

그리고,

내일비 식구들!!!

Page 20: [커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?

감사합니다-!

http://www.cubbying.com/

Page 21: [커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?

Copyright © 2012-2013 NaleBe, All Rights Reserved.

커빙은 열정 가득한 구성원들이 만듭니다!함께 하실 분은 [email protected]으로 연락주세요.