15. Simulation
1개의 article을 처리하기 위해 필요한 비동기요청 수는
최소 8개 + 댓글 수 * 2
댓글이 없다고 가정하고 비동기 요청 1개당 20ms 로 잡아도
최소 160ms 필요 (6.25/sec)
86400 * 6.25 = 540,000
play.node();2017withIBM
16. 실제 효율은 절반 이하…
느려도 너무 느리다!
play.node();2017withIBM
29. Coroutine
코루틴은 우리가 잘 알고 있는 서브루틴(Subroutine)과 달리 진입점(Entry Point)이 여러 개일 수 있습니다.
쉽게 이야기하면 실행을 멈췄다가(Suspend) 재개(Resume)할 수 있다는 점인데요.
이 특성을 살리면 우리가 익히 아는 스레드(Thread)처럼 쓸 수 있게 됩니다.
다만 스레드와 달리 코루틴은 비선점적(Non-Preemptive)이기때문에
코드의 흐름을 전적으로 사용자가 제어할 수 있습니다.
play.node();2017withIBM
spoqa 기술블로그 - Concurrency and eventlet(문성원님) 참조
퇴근 15분 (내리막길)
서울 -> 판교 때 편도 1시간40분
제주에서는 마라도 갈 수 있는 시간
제주 좋은거 다들 아실거고… 효리네 민박?
삶의 질이 달라졌다!!
우여곡절 끝에
The king of the hill
8,640,000 개의 문서를 처리할 수 있을 것이라는 긍정적인 생각을 하게 됨
자 이제 먼저… 요구사항을 분석해 봅시다
비동기 IO
가장 손에 익숙한 도구, 문제를 인식했을 때 가장 먼저 떠오른 도구
최대한 긍정적으로 생각했을 때 하루 540,000개
- 모든 IO가 20ms에서 끝나지 않음
- H사 관련 댓글만 수백개 이상
처리할 수 있다면 좋겠지만…
대부분의 병렬 마이그레이션 상황에 선택하는 가장 쉬운 방법을 선택
많은 분들이 이야기 하셨던 부분이라 MQ 사용은 넘어감
별 문제 없을 것이라 생각함
질문한다.
비동기를 처리하는 대표적인 방법
Node.js 의 Continuous Passing Style
코드를 보시고
이런 생각 하신분들 있을겁니다.
- 다중 순차적 비동기 처리가 상당히 까다롭다.
- transaction및 failover까지 처리하면 더 복잡한 코드가 됩니다.
질문한다.
콜백헬의 솔루션이라 알려지기도 한.. (사실은 아님)
Lazy evaluation 이 가능
1,000,000개 메모리 펑터짐
어떻게 메모리 이슈를 해결 하는가…
어디선가 놀고있는 자원을 빡시게 사용할 수 있다 들었던…
- 협력적 멀티태스킹은 일종의 시분할(time-sharing) 방식으로 여러 task가 하나의 CPU를 나눠쓰는 방식,
선점형 멀티태스킹(preemptive multitasking)과 달리 운영체제의 개입 없이 각 task가 독점적으로 CPU를 사용,
사용이 끝나면 CPU 자원을 자발적으로 양보
장점은 리소스를 사용하는 도중에 강제로 CPU를 뺏기는 일이 없으므로, 크리티컬 섹션(critical section)을 보호하기 위한 락(lock)이나 세마포어(semaphore) 등 동기화 수단이 필요 없다는 점
from 서광열의 코딩 스쿨(https://gamecodingschool.org/tag/%ED%98%91%EB%A0%A5%ED%98%95-%EB%A9%80%ED%8B%B0%ED%83%9C%EC%8A%A4%ED%82%B9/)
비동기 방식은 아님
Cooperative multitasking 을 구현하는 방법 중 하나인 Coroutine을 써봅시다.
코루틴은 우리가 잘 알고 있는 서브루틴(Subroutine)과 달리 진입점(Entry Point)이 여러 개일 수 있습니다. 쉽게 이야기하면 실행을 멈췄다가(Suspend) 재개(Resume)할 수 있다는 점인데요. 이 특성을 살리면 우리가 익히 아는 스레드(Thread)처럼 쓸 수 있게 됩니다. 다만 스레드와 달리 코루틴은 비선점적(Non-Preemptive)이기때문에 코드의 흐름을 전적으로 사용자가 제어할 수 있습니다. - from spoqa 기술블로그 - 코루틴과 greenlet(문성원님)(https://spoqa.github.io/2012/02/13/concurrency-and-eventlet.html#코루틴과-greenlet)
코루틴은
1. 특정일을 단계적으로 발생하게 할때
2. 시간의 흐름에 따라 발생하는 루틴을 작성할때
3. 다른 연상이 완료될때까지 기다리는 루틴이 필요할때
사용하면 굉장히 편리하게 사용할수 있다.
무사히 마이그레이션을 마칠 수 있었음.
하지만 아직 끝이 아니다…
마이그레이션 할 다른 녀석들은 지금도 생산되고 있습니다.
Coroutine은 Generator + promise + dispatcher(trampoline) 조합으로도 구현할 수 있습니다. (시간상 제외된 이야기) TOAST (김동우님) 글(http://meetup.toast.com/posts/73)
Node.js의 libuv 의 IO는 멀티스레드로 구현, UV_THREADPOOL_SIZE 를 늘리면 Connection 수를 늘릴 수 있음
promise.all 은 microTask(promise) limit를 모두 소진할 수 있음 —max_old_space_size로 힙을 늘리면 늘어남
코루틴을 이해하는데 큰 도움이 된 글을 써주신 감사한 분들께 다시한번 감사를
한가지 더 있습니다.
다음 미디어 개발팀에서 이런 것들을 함께할 동료를 구해요!
변태적으로 신규 스펙 사용을 즐기거나…
대규모 서비스를 경험해 보고 싶다거나…
제주근무를 해보고 싶다거나…
기술 공유를 즐기는 분 !
환영 합니다!!
아까 말씀드린 남아있는 과제를 비롯 기상천외한 일들이 기다리고 있습니다.