node.js conference - cooperative multi-tasking...
TRANSCRIPT
![Page 1: Node.js Conference - Cooperative multi-tasking Nodeplaynode.io/2017/slides/nodejs-cooperative-multi-tasking.pdf · 2017. 12. 29. · Node.js 6.x —harmony 옵션과 함께 사용](https://reader035.vdocuments.net/reader035/viewer/2022071108/5fe36709bf181e6df55e29c9/html5/thumbnails/1.jpg)
Cooperative multi-tasking with Node.js
Node.js로 협력적 멀티태스킹 처리하기
play.node(); 2017 with IBM
![Page 2: Node.js Conference - Cooperative multi-tasking Nodeplaynode.io/2017/slides/nodejs-cooperative-multi-tasking.pdf · 2017. 12. 29. · Node.js 6.x —harmony 옵션과 함께 사용](https://reader035.vdocuments.net/reader035/viewer/2022071108/5fe36709bf181e6df55e29c9/html5/thumbnails/2.jpg)
play.node(); 2017 with IBM
SpeakerIrho Park (박일호)
aka. iMaZiNe @ Kakao corp.
Daum자동차 서비스 개발
![Page 3: Node.js Conference - Cooperative multi-tasking Nodeplaynode.io/2017/slides/nodejs-cooperative-multi-tasking.pdf · 2017. 12. 29. · Node.js 6.x —harmony 옵션과 함께 사용](https://reader035.vdocuments.net/reader035/viewer/2022071108/5fe36709bf181e6df55e29c9/html5/thumbnails/3.jpg)
고백
거창하게 제목을 정해 놓았지만…
하려고 하는 이야기는
적다고 할 수 없는 숫자의 데이터 마이그레이션 경험담
play.node(); 2017 with IBM
![Page 4: Node.js Conference - Cooperative multi-tasking Nodeplaynode.io/2017/slides/nodejs-cooperative-multi-tasking.pdf · 2017. 12. 29. · Node.js 6.x —harmony 옵션과 함께 사용](https://reader035.vdocuments.net/reader035/viewer/2022071108/5fe36709bf181e6df55e29c9/html5/thumbnails/4.jpg)
사건의 시작2016년 카카오 입사
play.node(); 2017 with IBM
11개월 만에 꿈에 그리던 제주생활
출근 20분, 퇴근 15분
월정리 20분, 함덕서우봉해변 15분
![Page 5: Node.js Conference - Cooperative multi-tasking Nodeplaynode.io/2017/slides/nodejs-cooperative-multi-tasking.pdf · 2017. 12. 29. · Node.js 6.x —harmony 옵션과 함께 사용](https://reader035.vdocuments.net/reader035/viewer/2022071108/5fe36709bf181e6df55e29c9/html5/thumbnails/5.jpg)
그렇게 2016년 11월 Daum자동차 서비스를 담당하게 됩니다.
play.node(); 2017 with IBM
![Page 6: Node.js Conference - Cooperative multi-tasking Nodeplaynode.io/2017/slides/nodejs-cooperative-multi-tasking.pdf · 2017. 12. 29. · Node.js 6.x —harmony 옵션과 함께 사용](https://reader035.vdocuments.net/reader035/viewer/2022071108/5fe36709bf181e6df55e29c9/html5/thumbnails/6.jpg)
여기까지는 Happy함
play.node(); 2017 with IBM
![Page 7: Node.js Conference - Cooperative multi-tasking Nodeplaynode.io/2017/slides/nodejs-cooperative-multi-tasking.pdf · 2017. 12. 29. · Node.js 6.x —harmony 옵션과 함께 사용](https://reader035.vdocuments.net/reader035/viewer/2022071108/5fe36709bf181e6df55e29c9/html5/thumbnails/7.jpg)
첫번째 임무Legacy article migration
play.node(); 2017 with IBM
![Page 8: Node.js Conference - Cooperative multi-tasking Nodeplaynode.io/2017/slides/nodejs-cooperative-multi-tasking.pdf · 2017. 12. 29. · Node.js 6.x —harmony 옵션과 함께 사용](https://reader035.vdocuments.net/reader035/viewer/2022071108/5fe36709bf181e6df55e29c9/html5/thumbnails/8.jpg)
대부분 먼저 하는 생각1min = 60s
1hour = 3,600sec
1day = 86,400sec
초당 100개씩만 처리하면…
play.node(); 2017 with IBM
![Page 9: Node.js Conference - Cooperative multi-tasking Nodeplaynode.io/2017/slides/nodejs-cooperative-multi-tasking.pdf · 2017. 12. 29. · Node.js 6.x —harmony 옵션과 함께 사용](https://reader035.vdocuments.net/reader035/viewer/2022071108/5fe36709bf181e6df55e29c9/html5/thumbnails/9.jpg)
여기까지도 Happy함
play.node(); 2017 with IBM
![Page 10: Node.js Conference - Cooperative multi-tasking Nodeplaynode.io/2017/slides/nodejs-cooperative-multi-tasking.pdf · 2017. 12. 29. · Node.js 6.x —harmony 옵션과 함께 사용](https://reader035.vdocuments.net/reader035/viewer/2022071108/5fe36709bf181e6df55e29c9/html5/thumbnails/10.jpg)
요구사항 분석구문서 파싱 및 가공
이 모든것을 안전하게 처리
어뷰징 제거
연결된 정보들 처리 (ex. 댓글)
play.node(); 2017 with IBM
![Page 11: Node.js Conference - Cooperative multi-tasking Nodeplaynode.io/2017/slides/nodejs-cooperative-multi-tasking.pdf · 2017. 12. 29. · Node.js 6.x —harmony 옵션과 함께 사용](https://reader035.vdocuments.net/reader035/viewer/2022071108/5fe36709bf181e6df55e29c9/html5/thumbnails/11.jpg)
어떻게
DB를 읽고, 쓰고
파일을 읽고, 쓰고
API를 호출하고
play.node(); 2017 with IBM
![Page 12: Node.js Conference - Cooperative multi-tasking Nodeplaynode.io/2017/slides/nodejs-cooperative-multi-tasking.pdf · 2017. 12. 29. · Node.js 6.x —harmony 옵션과 함께 사용](https://reader035.vdocuments.net/reader035/viewer/2022071108/5fe36709bf181e6df55e29c9/html5/thumbnails/12.jpg)
결국
비동기 요청들(Asynchronous Requests)을
순차적(Sequentially)으로
안전하게(Transactionally) 처리
play.node(); 2017 with IBM
![Page 13: Node.js Conference - Cooperative multi-tasking Nodeplaynode.io/2017/slides/nodejs-cooperative-multi-tasking.pdf · 2017. 12. 29. · Node.js 6.x —harmony 옵션과 함께 사용](https://reader035.vdocuments.net/reader035/viewer/2022071108/5fe36709bf181e6df55e29c9/html5/thumbnails/13.jpg)
정해진 시간 안에
play.node(); 2017 with IBM
![Page 14: Node.js Conference - Cooperative multi-tasking Nodeplaynode.io/2017/slides/nodejs-cooperative-multi-tasking.pdf · 2017. 12. 29. · Node.js 6.x —harmony 옵션과 함께 사용](https://reader035.vdocuments.net/reader035/viewer/2022071108/5fe36709bf181e6df55e29c9/html5/thumbnails/14.jpg)
Why use Node.JSBecause, I love it!
play.node(); 2017 with IBM
![Page 15: Node.js Conference - Cooperative multi-tasking Nodeplaynode.io/2017/slides/nodejs-cooperative-multi-tasking.pdf · 2017. 12. 29. · Node.js 6.x —harmony 옵션과 함께 사용](https://reader035.vdocuments.net/reader035/viewer/2022071108/5fe36709bf181e6df55e29c9/html5/thumbnails/15.jpg)
Simulation1개의 article을 처리하기 위해 필요한 비동기요청 수는
최소 8개 + 댓글 수 * 2
댓글이 없다고 가정하고 비동기 요청 1개당 20ms 로 잡아도
최소 160ms 필요 (6.25/sec)
86400 * 6.25 = 540,000
play.node(); 2017 with IBM
![Page 16: Node.js Conference - Cooperative multi-tasking Nodeplaynode.io/2017/slides/nodejs-cooperative-multi-tasking.pdf · 2017. 12. 29. · Node.js 6.x —harmony 옵션과 함께 사용](https://reader035.vdocuments.net/reader035/viewer/2022071108/5fe36709bf181e6df55e29c9/html5/thumbnails/16.jpg)
실제 효율은 절반 이하…느려도 너무 느리다!
play.node(); 2017 with IBM
![Page 17: Node.js Conference - Cooperative multi-tasking Nodeplaynode.io/2017/slides/nodejs-cooperative-multi-tasking.pdf · 2017. 12. 29. · Node.js 6.x —harmony 옵션과 함께 사용](https://reader035.vdocuments.net/reader035/viewer/2022071108/5fe36709bf181e6df55e29c9/html5/thumbnails/17.jpg)
Solution병렬처리로 속도를 높이거나
프로세스의 효율을 높이거나
play.node(); 2017 with IBM
![Page 18: Node.js Conference - Cooperative multi-tasking Nodeplaynode.io/2017/slides/nodejs-cooperative-multi-tasking.pdf · 2017. 12. 29. · Node.js 6.x —harmony 옵션과 함께 사용](https://reader035.vdocuments.net/reader035/viewer/2022071108/5fe36709bf181e6df55e29c9/html5/thumbnails/18.jpg)
마음을 비우고 순차적으로…
play.node(); 2017 with IBM
![Page 19: Node.js Conference - Cooperative multi-tasking Nodeplaynode.io/2017/slides/nodejs-cooperative-multi-tasking.pdf · 2017. 12. 29. · Node.js 6.x —harmony 옵션과 함께 사용](https://reader035.vdocuments.net/reader035/viewer/2022071108/5fe36709bf181e6df55e29c9/html5/thumbnails/19.jpg)
결국 동시성(Concurrency) 문제를 해결해야 하는 상황!
Message Queue 를 사용해 스케쥴링 하고
병렬처리 하기로…
play.node(); 2017 with IBM
![Page 20: Node.js Conference - Cooperative multi-tasking Nodeplaynode.io/2017/slides/nodejs-cooperative-multi-tasking.pdf · 2017. 12. 29. · Node.js 6.x —harmony 옵션과 함께 사용](https://reader035.vdocuments.net/reader035/viewer/2022071108/5fe36709bf181e6df55e29c9/html5/thumbnails/20.jpg)
아직까지도 Happy함
play.node(); 2017 with IBM
![Page 21: Node.js Conference - Cooperative multi-tasking Nodeplaynode.io/2017/slides/nodejs-cooperative-multi-tasking.pdf · 2017. 12. 29. · Node.js 6.x —harmony 옵션과 함께 사용](https://reader035.vdocuments.net/reader035/viewer/2022071108/5fe36709bf181e6df55e29c9/html5/thumbnails/21.jpg)
구현해 봅시다비동기를 처리하는 대표적인 방법
play.node(); 2017 with IBM
Callback!
![Page 22: Node.js Conference - Cooperative multi-tasking Nodeplaynode.io/2017/slides/nodejs-cooperative-multi-tasking.pdf · 2017. 12. 29. · Node.js 6.x —harmony 옵션과 함께 사용](https://reader035.vdocuments.net/reader035/viewer/2022071108/5fe36709bf181e6df55e29c9/html5/thumbnails/22.jpg)
Callback DEMO
play.node(); 2017 with IBM
![Page 23: Node.js Conference - Cooperative multi-tasking Nodeplaynode.io/2017/slides/nodejs-cooperative-multi-tasking.pdf · 2017. 12. 29. · Node.js 6.x —harmony 옵션과 함께 사용](https://reader035.vdocuments.net/reader035/viewer/2022071108/5fe36709bf181e6df55e29c9/html5/thumbnails/23.jpg)
Callback Image?
play.node(); 2017 with IBM
![Page 24: Node.js Conference - Cooperative multi-tasking Nodeplaynode.io/2017/slides/nodejs-cooperative-multi-tasking.pdf · 2017. 12. 29. · Node.js 6.x —harmony 옵션과 함께 사용](https://reader035.vdocuments.net/reader035/viewer/2022071108/5fe36709bf181e6df55e29c9/html5/thumbnails/24.jpg)
조금 더 나은 방법
play.node(); 2017 with IBM
Promise
![Page 25: Node.js Conference - Cooperative multi-tasking Nodeplaynode.io/2017/slides/nodejs-cooperative-multi-tasking.pdf · 2017. 12. 29. · Node.js 6.x —harmony 옵션과 함께 사용](https://reader035.vdocuments.net/reader035/viewer/2022071108/5fe36709bf181e6df55e29c9/html5/thumbnails/25.jpg)
Promise DEMO
play.node(); 2017 with IBM
![Page 26: Node.js Conference - Cooperative multi-tasking Nodeplaynode.io/2017/slides/nodejs-cooperative-multi-tasking.pdf · 2017. 12. 29. · Node.js 6.x —harmony 옵션과 함께 사용](https://reader035.vdocuments.net/reader035/viewer/2022071108/5fe36709bf181e6df55e29c9/html5/thumbnails/26.jpg)
How to solve memory issue
play.node(); 2017 with IBM
![Page 27: Node.js Conference - Cooperative multi-tasking Nodeplaynode.io/2017/slides/nodejs-cooperative-multi-tasking.pdf · 2017. 12. 29. · Node.js 6.x —harmony 옵션과 함께 사용](https://reader035.vdocuments.net/reader035/viewer/2022071108/5fe36709bf181e6df55e29c9/html5/thumbnails/27.jpg)
협력적 멀티태스킹
play.node(); 2017 with IBM
Cooperative Multi-tasking일종의 시분할(Time-sharing)방식
운영체제의 개입 없이 task가 독점적으로 CPU를 사용
미사용시 자발적 CPU 자원 반환
Critical section 보호를 위한 Lock이나 Semaphore 불필요
서광열의 코딩스쿨(https://gamecodingschool.org) 참조
![Page 28: Node.js Conference - Cooperative multi-tasking Nodeplaynode.io/2017/slides/nodejs-cooperative-multi-tasking.pdf · 2017. 12. 29. · Node.js 6.x —harmony 옵션과 함께 사용](https://reader035.vdocuments.net/reader035/viewer/2022071108/5fe36709bf181e6df55e29c9/html5/thumbnails/28.jpg)
구현방법의 선택
play.node(); 2017 with IBM
CoroutineES7 스펙 async, await
Node.js 7.6 부터 공식적으로 지원
Node.js 6.x —harmony 옵션과 함께 사용
![Page 29: Node.js Conference - Cooperative multi-tasking Nodeplaynode.io/2017/slides/nodejs-cooperative-multi-tasking.pdf · 2017. 12. 29. · Node.js 6.x —harmony 옵션과 함께 사용](https://reader035.vdocuments.net/reader035/viewer/2022071108/5fe36709bf181e6df55e29c9/html5/thumbnails/29.jpg)
Coroutine코루틴은 우리가 잘 알고 있는 서브루틴(Subroutine)과 달리 진입점(Entry Point)이 여러 개일 수 있습니다.
쉽게 이야기하면 실행을 멈췄다가(Suspend) 재개(Resume)할 수 있다는 점인데요. 이 특성을 살리면 우리가 익히 아는 스레드(Thread)처럼 쓸 수 있게 됩니다. 다만 스레드와 달리 코루틴은 비선점적(Non-Preemptive)이기때문에
코드의 흐름을 전적으로 사용자가 제어할 수 있습니다.
play.node(); 2017 with IBM
spoqa 기술블로그 - Concurrency and eventlet(문성원님) 참조
![Page 30: Node.js Conference - Cooperative multi-tasking Nodeplaynode.io/2017/slides/nodejs-cooperative-multi-tasking.pdf · 2017. 12. 29. · Node.js 6.x —harmony 옵션과 함께 사용](https://reader035.vdocuments.net/reader035/viewer/2022071108/5fe36709bf181e6df55e29c9/html5/thumbnails/30.jpg)
Coroutine
play.node(); 2017 with IBM
![Page 31: Node.js Conference - Cooperative multi-tasking Nodeplaynode.io/2017/slides/nodejs-cooperative-multi-tasking.pdf · 2017. 12. 29. · Node.js 6.x —harmony 옵션과 함께 사용](https://reader035.vdocuments.net/reader035/viewer/2022071108/5fe36709bf181e6df55e29c9/html5/thumbnails/31.jpg)
Coroutine DEMO코드 가독성이 좋아짐
play.node(); 2017 with IBM
대규모 처리시 안전함
비동기 다중 중첩시 유의해야 함
![Page 32: Node.js Conference - Cooperative multi-tasking Nodeplaynode.io/2017/slides/nodejs-cooperative-multi-tasking.pdf · 2017. 12. 29. · Node.js 6.x —harmony 옵션과 함께 사용](https://reader035.vdocuments.net/reader035/viewer/2022071108/5fe36709bf181e6df55e29c9/html5/thumbnails/32.jpg)
결과적으로 Happy함
play.node(); 2017 with IBM
![Page 33: Node.js Conference - Cooperative multi-tasking Nodeplaynode.io/2017/slides/nodejs-cooperative-multi-tasking.pdf · 2017. 12. 29. · Node.js 6.x —harmony 옵션과 함께 사용](https://reader035.vdocuments.net/reader035/viewer/2022071108/5fe36709bf181e6df55e29c9/html5/thumbnails/33.jpg)
TIPs
play.node(); 2017 with IBM
Coroutine 예외 처리 방법
UV_THREADPOOL_SIZE
Coroutine = Generator + promise + dispatcher(trampoline)
![Page 34: Node.js Conference - Cooperative multi-tasking Nodeplaynode.io/2017/slides/nodejs-cooperative-multi-tasking.pdf · 2017. 12. 29. · Node.js 6.x —harmony 옵션과 함께 사용](https://reader035.vdocuments.net/reader035/viewer/2022071108/5fe36709bf181e6df55e29c9/html5/thumbnails/34.jpg)
References
play.node(); 2017 with IBM
TOAST ES6의 제너레이터를 사용한 비동기 프로그래밍(김동우님)
spoqa 기술블로그 - Concurrency and eventlet(문성원님)
서광열의 코딩스쿨 - 코루틴(Coroutine) 이해하기(서광열님)
Wikiedia Coroutine 한글 번역(dogfeet님)
![Page 35: Node.js Conference - Cooperative multi-tasking Nodeplaynode.io/2017/slides/nodejs-cooperative-multi-tasking.pdf · 2017. 12. 29. · Node.js 6.x —harmony 옵션과 함께 사용](https://reader035.vdocuments.net/reader035/viewer/2022071108/5fe36709bf181e6df55e29c9/html5/thumbnails/35.jpg)
play.node(); 2017 with IBM
One more thing…
We want you!https://careers.kakao.com/jobs/P-10465
![Page 36: Node.js Conference - Cooperative multi-tasking Nodeplaynode.io/2017/slides/nodejs-cooperative-multi-tasking.pdf · 2017. 12. 29. · Node.js 6.x —harmony 옵션과 함께 사용](https://reader035.vdocuments.net/reader035/viewer/2022071108/5fe36709bf181e6df55e29c9/html5/thumbnails/36.jpg)
play.node(); 2017 with IBM
Thank you개발자라면 지금 방문하세요! developer.ibm.com/kr
https://github.com/imazine/playnode2017_sample