SlideShare a Scribd company logo
추천 시스템을 위한 어플리케이션 서버
개발 후기
김광섭
김광섭
mrkwangsub@gmail.com
C++/Python 개발자
Pattern Recognition 전공
추천 시스템 / 머신러닝에 관심있습니다
추천 시스템
추천 시스템
https://cse.umn.edu/news-release/university-of-minnesota-professors-and-alumnus-win-international-award-for-groundbreaking-recommender-systems-research/
데이터를 소비하는 새로운 경험!
음악 블로그 뉴스 영화
추천 시스템은 복잡한 문제입니다.
https://leankit.com/blog/2016/01/managing-complex-workflows-in-leankit/
추천 시스템은 복잡한 문제입니다.
하지만, 우리가 해야할 일을 아주 간단히 축소하면,
다음 두가지 맥락으로 해석할 수 있습니다
https://leankit.com/blog/2016/01/managing-complex-workflows-in-leankit/
아이템 추천
개인화 추천
아이템
개인
Thanks a lot to http://xkcd.com
설계
쿼리 유사도 정렬 메타데이터/선호도 조회
필터링
다이어트
바나나...
품절
사과혐오
아이템 추천 시나리오
어떤 게 적합할까?
여기서 원하는 게 뭘까?
2. 관계, 유사도, 거리, .... • 상품명
• 재고량
• 가격
• 판매처
• …
3. 상품 정보1. 활동 정보
• 좋아요
• 싫어요
• 산 것/본 것
• …
이런 저런 기술로 만들어요
2. 관계, 유사도, 거리, ....
오렌지 토마토 레몬
바나나 0.831321 0.8221123 0.747661
• 상품명
• 재고량
• 가격
• 판매처
• …
3. 상품 정보1. 활동 정보
• 좋아요
• 싫어요
• 산 것/본 것
• …
2. 관계, 유사도, 거리, ....
3. 상품 정보
1. 활동 정보
데이터베이스
데이터 수집
데이터 분석
어플리케이션 서버
장보기/과일추천
{
type: “similar”,
database: “장보기”,
filter: {“kind”: “disliked”, “n”: 5},
where: {“status”: “okay”},
limit: 20
}
과일추천
Rule(Schema)
이제 만들어 보자!
이제 만들어 보자!
vs
그냥 있는거 쓰면 안되요? (이런 사람 꼭 있다)
유사도/메타/이력 데이터 적재
수평 확장이 용이해야하며 대량
의 쓰기와 읽기에도 안정적인 성
능을 유지해야함
실시간 개인화 추천, 복잡한 필터
링, 비지니스 로직, 온라인 기계학
습에 필요한 실시간 분석 기능을
제공해야 하며 실시간 서비스에
필요한 수준으로 빠르게 처리해
야함
실시간분석 데이터베이스
관계형 분석 기능을 제공하며 낮
은 지연시간을 보장해야함(실시
간 분석에 필요한 시간을 위해)
OLTP
실시간분석 Online Transaction Processing 데이터베이스
어플리케이션 서버 요구 사항 분석
유사도/메타/이력 데이터 적재
수평 확장이 용이해야하며 대량
의 쓰기와 읽기에도 안정적인 성
능을 유지해야함
실시간 개인화 추천, 복잡한 필터
링, 비지니스 로직, 온라인 기계학
습에 필요한 실시간 분석 기능을
제공해야 하며 실시간 서비스에
필요한 수준으로 빠르게 처리해
야함
실시간분석 데이터베이스
관계형 분석 기능을 제공하며 낮
은 지연시간을 보장해야함(실시
간 분석에 필요한 시간을 위해)
OLTP
실시간분석 Online Transaction Processing 데이터베이스
어플리케이션 서버 요구 사항 분석
중요!
실시간 개인화 추천, 복잡한 필터
링, 비지니스 로직, 온라인 기계학
습에 필요한 실시간 분석 기능을
제공해야 하며 실시간 서비스에
필요한 수준으로 빠르게 처리해
야함
실시간분석
실시간분석
어플리케이션 서버 요구 사항 분석
개인화 추천을 미리 계산하는 것은 매우 비효율적.
실시간 분석이 적합.
벤치마킹
실시간분석 OLTP 데이터베이스 기타
실시간분석이 거의 제공 되지 않음
스케일 아웃이 쉽지 않음(확장성)
실시간분석이 거의 제공 되지 않음
OLTP성 작업에 제약이 있음
일부 실시간분석이 가능하지만 처리 속도가 느림
안정성이 충분히 검증되지 않음
일부 실시간분석을 만족할만한 시간 내에 처리 하지만
안정성이 낮음(버전 1.0이하 테스트)
실시간분석 기능을 가장 많이 제공하나, 여전히 불충분
하고, 유료임
그냥 있는거 쓰면 안되요? 네.
1. 실시간분석
• “결과가 없으면 같은 카테고리내 다른 상품을 보여줬으면 좋겠어요.”
• “본 거는 빼주세요. 그런데 3번 정도 봐야 빠졌으면 좋겠어요.”
• 대용량 개인화 추천, 온라인 기계학습
2. 속도/성능
• 데이터베이스 작업을 단순화하고, 복잡한 로직을 더 효과적으로 구현하자. (혹은 써드파티 라이브러리의 활용)
3. 확장성/안정성
• 대용량 데이터베이스의 특성과 실시간 분석 두가지를 하나의 플랫폼으로 만족시키기 어렵다.
4. 완결성
• API를 사용하는 입장에서 추가 작업 없이 바로 사용 가능하도록 하자.
이제 만들어 보자!
실시간분석 데이터베이스OLTP
실시간분석과 OLTP 연산을 처리하는 것에 집중하고
데이터베이스는 외부 솔루션에 의존
만드려는 것은 여기에 집중
L7 스위치백엔드
마라톤 LB (HaProxy)
마라톤 앱
NGINX
GUNICORN
APP APP
Redis
Mongo

DB
External
API
APP
MySQL
룰(스키마)
리소스
실시간 분석
APP
MySQL
정의된 룰(스키마) 로드
brunch/similar
{
“bucket_A”: {
},
“bucket_B”: {
}
}
brunch/similar (200 OK)
dinner/similar (404)
Mongo

DB
External
API
Redis
개발 후기
만들면서 겪었던 문제들
• python2 vs python3: tornado vs sanic
• asyncio.Future
• 데이터베이스 프로파일링
• 꼼꼼한 캐싱
• 복잡한 필터링
• 설정 배포
• 퍼포먼스
v.s.
python2 v.s. python3
python2 v.s. python3
v.s.
Flask-like Python 3.5+ web server
서비스에 사용중이던 파이썬2 + 토네이도 기반의 비슷한 구현체가
있었습니다
가능하면 재활용을 하고 싶었지만, 몇가지 장점으로 파이썬3 +
Sanic 조합으로 변경했습니다
python2 v.s. python3
코드 가독성 증가 및 LOC 감소
Sanic의 문법이 tornado보다 간결하기도 하지만 파이썬3와 써드
파티 라이브러리 전반적으로 코드 사용이 더 쉬웠습니다
python2 v.s. python3
성능
uvloop 덕택인지 tornado 구현체 대비해 동일 환경에서 약 2.1배
가량 빠른 응답 속도를 보였습니다
https://magic.io/blog/uvloop-blazing-fast-python-networking/
python2 v.s. python3
asyncio.Future
asyncio.Future
VS
asyncio.Future
VS
RUN/WAIT
RUN/WAIT
RUN
RUN/WAIT
WAIT
네트워크 I/O 대기를 최소화해서 CPU를 최대한 뽑아먹자
데이터베이스 프로파일링
코드를 최적화 하다 보니 결국에는 쿼리를 처리하는데 소요되는 대
부분의 시간은 데이터베이스 조회에(혹은 다른 RPC) 사용됐습니다
데이터베이스는 MongoDB를 사용했습니다 sanic-motor를 사용
하면 쉽게 비동기 호출 방식으로 사용할 수 있습니다
고민이 되는 지점은 데이터베이스의 기능을 어디까지 사용할지 입
니다
데이터베이스 프로파일링
ELSE
32%
DB
68%
ELSE
1%
DB
99%
Rule A Rule B
데이터베이스 프로파일링
품절
APP
Mongo

DB
품절
APP
Mongo

DB
MongoDB에 aggregate라는 기능으로 여러 연산을 중복해서 실행
할 수 있습니다. 그 중에 $filter 연산은 사용하는 것이 더 좋았습니다.
앱서버 CPU 사용량 감소
데이터 전송량 감소
데이터베이스 부하는 비슷
데이터베이스 프로파일링
Mongo

DB
Mongo

DB
반면 $group는 어플리케이션 서버에서 처리하는 것이 수배 빨랐습
니다.
3개
3개
3개
3개
APP
APP
데이터베이스 프로파일링
데이터베이스에서 제공하는 기능을 그대로 사용할지 어플리케이션
서버에서 구현할지 테스트 해보자!
꼼꼼한 캐싱
꼼꼼한 캐싱
데이터베이스 조회 비용이 비싸기 때문에 최대한 캐싱을 꼼꼼히 할
필요가 있습니다
인스턴스내 여러 프로세스로 앱 프로세스가 생성되기 때문에 프로
세스간 중복되는 연산을 줄이기 위해 임베디드 캐시 대신 Redis를
사용했습니다
APP
Redis
APPAPP
꼼꼼한 캐싱
쿼리
쿼리
단일 인스턴스
프로세스B
프로세스A
중복 질의
꼼꼼한 캐싱
슈퍼 노드를 해결을 위해서도 인스턴스 내의 캐시는 필요했습니다
Mongo

DB
Shard1
Shard2
ShardN
적절한 키로 샤드를 구성하더라도
공통되어 사용되는 리소스가 존재하는 경우
특정 샤드에 부하가 집중됩니다
핫 포도
복잡한 필터링
복잡한 필터링
바나나 싫다
바나나 싫다
제거하기
뒤로 밀어내기
최근에 봤거나, 결과 수를 일정하게
유지 하기 위해서는 커스텀 필터 구현
복잡한 필터링
빌트인 프로시져로 처리할 수 없는 필터링의 경우를 위해 

룰에 파이썬 코드를 심고 런타임 컴파일을 사용
brunch/similar
{
“bucket_A”: {
“$filter”: “{"$match": {"$and": [{"is_black_user": {"$eq": 0}}, {"status": {"$eq": “normal”}}]}}”,
},
“bucket_B”: {
“@filter”: “lambda x: “,
}
설정 배포
설정 배포
마라톤 앱
NGINX
GUNICORN
APP APP
Redis
External
API
APP
MySQL
룰(스키마)
brunch/similar
{
“bucket_A”: {
},
“bucket_B”: {
}
}
설정 배포
마라톤 앱
NGINX
GUNICORN
APP APP
Redis
External
API
APP
MySQL
룰(스키마)
brunch/similar
{
“bucket_A”: {
}
}
테스트를 포함해 룰을 바꾸는 일은 잦음
설정 배포
마라톤 앱
NGINX
GUNICORN
APP APP
Redis
External
API
APP
MySQL
룰(스키마)
순차적 재시작
이럴 경우 요청이 유실
될 수 있습니다.
설정 배포
마라톤 앱
NGINX
GUNICORN
APP APP
Redis
External
API
APP
MySQL
룰(스키마)
KILL SIGTERM
안전하게 앱을 재시작
할 수 있습니다.
설정 배포
마라톤 앱
NGINX
GUNICORN
APP APP
Redis
External
API
APP
MySQL
룰(스키마)
KILL SIGTERM
안전하게 앱을 재시작
할 수 있습니다.
퍼포먼스
퍼포먼스
API
API 요청 350M+
평균 응답 속도 17ms
100ms 이하 응답 비율 99.7%
/ day
데이터베이스
INSERT 1B+
UPDATE 1.5B+
SELECT 1.2B+
/ day
인스턴스(1Thread)
294.98 TPS
20 가상 유저, 60초 버스트
평균 전송 데이터 43KB
linear scalability
그 밖의 코멘트
파이썬으로 그런거 만드는 거 아니에요
(그만 좀 들었으면... 실제로 이런 경우가 적지 않습니다)
실시간 어플리케이션 서버의 병목 대부분 네트워크 IO
(왜 우리 파이썬한태 그래요!!?!)
CPU 연산의 경우 수치 연산에 최적화된 라이브러리를 잘 활용하자
(그래도 느리다면 내 코드가 문ㅈ...)
FAQ
kakao > 추천팀 영입 공고
• 추천 시스템 연구/개발: https://careers.kakao.com/jobs/P-9883
• 추천 시스템 소프트웨어 엔지니어: https://careers.kakao.com/jobs/P-10200

More Related Content

PDF
[MLOps KR 행사] MLOps 춘추 전국 시대 정리(210605)
PDF
Amazon OpenSearch Deep dive - 내부구조, 성능최적화 그리고 스케일링
PDF
[236] 카카오의데이터파이프라인 윤도영
PPTX
로그 기깔나게 잘 디자인하는 법
PDF
인공지능추천시스템 airs개발기_모델링과시스템
PDF
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
PDF
2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요
PDF
Spark 의 핵심은 무엇인가? RDD! (RDD paper review)
[MLOps KR 행사] MLOps 춘추 전국 시대 정리(210605)
Amazon OpenSearch Deep dive - 내부구조, 성능최적화 그리고 스케일링
[236] 카카오의데이터파이프라인 윤도영
로그 기깔나게 잘 디자인하는 법
인공지능추천시스템 airs개발기_모델링과시스템
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요
Spark 의 핵심은 무엇인가? RDD! (RDD paper review)

What's hot (20)

PDF
Aws glue를 통한 손쉬운 데이터 전처리 작업하기
PDF
Data Science. Intro
PDF
개발자를 위한 (블로그) 글쓰기 intro
PDF
상상을 현실로 만드는, 이미지 생성 모델을 위한 엔지니어링
PDF
데이터 분석가는 어떤 SKILLSET을 가져야 하는가? - 데이터 분석가 되기
PDF
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
PDF
[팝콘 시즌1] 이윤희 : 다짜고짜 배워보는 인과추론
PDF
스타트업 나홀로 데이터 엔지니어: 데이터 분석 환경 구축기 - 천지은 (Tappytoon) :: AWS Community Day Onlin...
PPTX
Data pipeline and data lake
PDF
성장을 좋아하는 사람이, 성장하고 싶은 사람에게
PPTX
MSA를 넘어 Function의 로의 진화::주경호 수석::AWS Summit Seoul 2018
PDF
머신러닝 해외 취업 준비: 닳고 닳은 이력서와 고통스러웠던 면접을 돌아보며 SNU 2018
PDF
Vector databases and neural search
PDF
추천시스템 이제는 돈이 되어야 한다.
PDF
AWS기반 서버리스 데이터레이크 구축하기 - 김진웅 (SK C&C) :: AWS Community Day 2020
PDF
카카오 광고 플랫폼 MSA 적용 사례 및 API Gateway와 인증 구현에 대한 소개
PDF
[부스트캠프 Tech Talk] 진명훈_datasets로 협업하기
PPTX
Recommender system introduction
PDF
[KAIST 채용설명회] 데이터 엔지니어는 무슨 일을 하나요?
PPTX
mongodb와 mysql의 CRUD 연산의 성능 비교
Aws glue를 통한 손쉬운 데이터 전처리 작업하기
Data Science. Intro
개발자를 위한 (블로그) 글쓰기 intro
상상을 현실로 만드는, 이미지 생성 모델을 위한 엔지니어링
데이터 분석가는 어떤 SKILLSET을 가져야 하는가? - 데이터 분석가 되기
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
[팝콘 시즌1] 이윤희 : 다짜고짜 배워보는 인과추론
스타트업 나홀로 데이터 엔지니어: 데이터 분석 환경 구축기 - 천지은 (Tappytoon) :: AWS Community Day Onlin...
Data pipeline and data lake
성장을 좋아하는 사람이, 성장하고 싶은 사람에게
MSA를 넘어 Function의 로의 진화::주경호 수석::AWS Summit Seoul 2018
머신러닝 해외 취업 준비: 닳고 닳은 이력서와 고통스러웠던 면접을 돌아보며 SNU 2018
Vector databases and neural search
추천시스템 이제는 돈이 되어야 한다.
AWS기반 서버리스 데이터레이크 구축하기 - 김진웅 (SK C&C) :: AWS Community Day 2020
카카오 광고 플랫폼 MSA 적용 사례 및 API Gateway와 인증 구현에 대한 소개
[부스트캠프 Tech Talk] 진명훈_datasets로 협업하기
Recommender system introduction
[KAIST 채용설명회] 데이터 엔지니어는 무슨 일을 하나요?
mongodb와 mysql의 CRUD 연산의 성능 비교
Ad

Similar to [PYCON Korea 2018] Python Application Server for Recommender System (20)

PDF
[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석
PDF
Tdc2013 선배들에게 배우는 server scalability
PDF
빅데이터 기술 현황과 시장 전망(2014)
PDF
대규모 서비스를 가능하게 하는 기술
PDF
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
PDF
[AWS Builders] 우리 워크로드에 맞는 데이터베이스 찾기
PPT
The nosql echossytem
PDF
MongoDB 신제품 및 신기능 소개
PDF
201210 그루터 빅데이터_플랫폼_아키텍쳐_및_솔루션_소개
PDF
[231]운영체제 수준에서의 데이터베이스 성능 분석과 최적화
PPTX
DeView2013 Big Data Platform Architecture with Hadoop - Hyeong-jun Kim
PDF
Rankwave MOMENT™ (Korean)
PDF
나에게 맞는 AWS 데이터베이스 서비스 선택하기 :: 양승도 :: AWS Summit Seoul 2016
PDF
PDF
게임서비스를 위한 ElastiCache 활용 전략 :: 구승모 솔루션즈 아키텍트 :: Gaming on AWS 2016
PPTX
분산저장시스템 개발에 대한 12가지 이야기
PDF
Custom DevOps Monitoring System in MelOn (with InfluxDB + Telegraf + Grafana)
PDF
Monitoring System for DevOps - Case of MelOn
PDF
log-monitoring-architecture.pdf
PDF
워크로드에 맞는 데이터베이스 찾기 - 박주연 솔루션즈 아키텍트, AWS :: AWS Summit Seoul 2019
[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석
Tdc2013 선배들에게 배우는 server scalability
빅데이터 기술 현황과 시장 전망(2014)
대규모 서비스를 가능하게 하는 기술
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
[AWS Builders] 우리 워크로드에 맞는 데이터베이스 찾기
The nosql echossytem
MongoDB 신제품 및 신기능 소개
201210 그루터 빅데이터_플랫폼_아키텍쳐_및_솔루션_소개
[231]운영체제 수준에서의 데이터베이스 성능 분석과 최적화
DeView2013 Big Data Platform Architecture with Hadoop - Hyeong-jun Kim
Rankwave MOMENT™ (Korean)
나에게 맞는 AWS 데이터베이스 서비스 선택하기 :: 양승도 :: AWS Summit Seoul 2016
게임서비스를 위한 ElastiCache 활용 전략 :: 구승모 솔루션즈 아키텍트 :: Gaming on AWS 2016
분산저장시스템 개발에 대한 12가지 이야기
Custom DevOps Monitoring System in MelOn (with InfluxDB + Telegraf + Grafana)
Monitoring System for DevOps - Case of MelOn
log-monitoring-architecture.pdf
워크로드에 맞는 데이터베이스 찾기 - 박주연 솔루션즈 아키텍트, AWS :: AWS Summit Seoul 2019
Ad

[PYCON Korea 2018] Python Application Server for Recommender System