36
Cooperative multi-tasking with Node.js Node.js로 협력적 멀티태스킹 처리하기 play.node(); 2017 with IBM

Nodejs cooperative-multi-tasking

Embed Size (px)

Citation preview

Cooperative multi-tasking

with Node.js

Node.js로협력적멀티태스킹처리하기

play.node(); 2017 with IBM

play.node(); 2017 with IBM

Speaker

Irho Park (박일호)

aka. iMaZiNe @ Kakao corp.

Daum자동차서비스개발

고백

거창하게제목을정해놓았지만…

하려고하는이야기는

적다고할수없는숫자의데이터마이그레이션경험담

play.node(); 2017 with IBM

사건의시작

2016년카카오입사

play.node(); 2017 with IBM

11개월만에꿈에그리던제주생활

출근 20분, 퇴근 15분

월정리 20분, 함덕서우봉해변 15분

그렇게 2016년 11월Daum자동차서비스를담당하게됩니다.

play.node(); 2017 with IBM

여기까지는 Happy함

play.node(); 2017 with IBM

첫번째임무

Legacy article migration

play.node(); 2017 with IBM

대부분먼저하는생각

1min = 60s

1hour = 3,600sec

1day = 86,400sec

초당 100개씩만처리하면…

play.node(); 2017 with IBM

여기까지도 Happy함

play.node(); 2017 with IBM

요구사항분석

구문서파싱및가공

이모든것을안전하게처리

어뷰징제거

연결된정보들처리 (ex. 댓글)

play.node(); 2017 with IBM

어떻게

DB를읽고, 쓰고

파일을읽고, 쓰고

API를호출하고

play.node(); 2017 with IBM

결국

비동기요청들(Asynchronous Requests)을

순차적(Sequentially)으로

안전하게(Transactionally) 처리

play.node(); 2017 with IBM

정해진시간안에

play.node(); 2017 with IBM

Why use Node.JS

Because, I love it!

play.node(); 2017 with IBM

Simulation

1개의 article을처리하기위해필요한비동기요청수는

최소 8개 + 댓글수 * 2

댓글이없다고가정하고비동기요청 1개당 20ms 로잡아도

최소 160ms 필요 (6.25/sec)

86400 * 6.25 = 540,000

play.node(); 2017 with IBM

실제효율은절반이하…

느려도너무느리다!

play.node(); 2017 with IBM

Solution

병렬처리로속도를높이거나

프로세스의효율을높이거나

play.node(); 2017 with IBM

마음을비우고순차적으로…

play.node(); 2017 with IBM

결국동시성(Concurrency) 문제를해결해야하는상황!

Message Queue 를사용해스케쥴링하고

병렬처리하기로…

play.node(); 2017 with IBM

아직까지도 Happy함

play.node(); 2017 with IBM

구현해봅시다

비동기를처리하는대표적인방법

play.node(); 2017 with IBM

Callback!

Callback DEMO

play.node(); 2017 with IBM

Callback Image?

play.node(); 2017 with IBM

조금더나은방법

play.node(); 2017 with IBM

Promise

Promise DEMO

play.node(); 2017 with IBM

How to solve memory issue

play.node(); 2017 with IBM

협력적멀티태스킹

play.node(); 2017 with IBM

Cooperative Multi-tasking

일종의시분할(Time-sharing)방식

운영체제의개입없이 task가독점적으로 CPU를사용

미사용시자발적 CPU 자원반환

Critical section 보호를위한 Lock이나 Semaphore 불필요

서광열의코딩스쿨(https://gamecodingschool.org) 참조

구현방법의선택

play.node(); 2017 with IBM

Coroutine

ES7 스펙 async, await

Node.js 7.6 부터공식적으로지원

Node.js 6.x —harmony 옵션과함께사용

Coroutine

코루틴은우리가잘알고있는서브루틴(Subroutine)과달리진입점(Entry Point)이여러개일수있습니다.

쉽게이야기하면실행을멈췄다가(Suspend) 재개(Resume)할수있다는점인데요.

이특성을살리면우리가익히아는스레드(Thread)처럼쓸수있게됩니다.

다만스레드와달리코루틴은비선점적(Non-Preemptive)이기때문에코드의흐름을전적으로사용자가제어할수있습니다.

play.node(); 2017 with IBM

spoqa 기술블로그 - Concurrency and eventlet(문성원님) 참조

Coroutine

play.node(); 2017 with IBM

Coroutine DEMO

코드가독성이좋아짐

play.node(); 2017 with IBM

대규모처리시안전함

비동기다중중첩시유의해야함

결과적으로 Happy함

play.node(); 2017 with IBM

TIPs

play.node(); 2017 with IBM

Coroutine 예외처리방법

UV_THREADPOOL_SIZE

Coroutine = Generator + promise + dispatcher(trampoline)

References

play.node(); 2017 with IBM

TOAST ES6의제너레이터를사용한비동기프로그래밍(김동우님)

spoqa 기술블로그 - Concurrency and eventlet(문성원님)

서광열의코딩스쿨 - 코루틴(Coroutine) 이해하기(서광열님)

Wikiedia Coroutine 한글번역(dogfeet님)

play.node(); 2017 with IBM

One more thing…

We want you!

https://careers.kakao.com/jobs/P-10465

play.node(); 2017 with IBM

Thank you개발자라면지금방문하세요! developer.ibm.com/kr

https://github.com/imazine/playnode2017_sample