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