λ„€νŠΈμ›Œν¬

닀쀑 처리 방식

vividswan 2022. 5. 3. 21:31

기쑴의 per process, pre-fork, worker 닀쀑 처리 방식

fork 방식 (per process)

  • λ‹€μˆ˜μ˜ μ‚¬μš©μž μš”μ²­μ΄ 듀어왔을 λ•Œ μžμ‹ processκ°€ μ‚¬μš©μž μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ” 방식
  • λ‹€μˆ˜μ˜ μ‚¬μš©μž μš”μ²­(μš”μ²­ 1, μš”μ²­ 2, μš”μ²­ 3..)이 λ“€μ–΄μ˜€λ©΄ λΆ€λͺ¨ processμ—μ„œ μžμ‹ processλ₯Ό fork(μžμ‹ 1, μžμ‹ 2, μžμ‹ 3...)ν•΄μ„œ μš”μ²­μ„ 처리
  • μŠ€λ ˆλ“œλ³΄λ‹€ 무거운 ν”„λ‘œμ„ΈμŠ€λ₯Ό 볡제 ν›„ μ²˜λ¦¬ν•˜κΈ° λ•Œλ¬Έμ— μ˜€λ²„ν—€λ“œκ°€ λ°œμƒν•˜κ±°λ‚˜ λ§Žμ€ λ¦¬μ†ŒμŠ€λ₯Ό μ°¨μ§€ν•˜κ²Œ 될 수 μžˆλ‹€.
    • μ—¬κΈ°μ„œμ˜ λ¦¬μ†ŒμŠ€λŠ” λ©”λͺ¨λ¦¬

pre-fork 방식

  • μ‚¬μš©μž μš”μ²­μ„ μ²˜λ¦¬ν•  μžμ‹ ν”„λ‘œμ„ΈμŠ€λ₯Ό μΌμ •λŸ‰ 미리 forkν•˜λŠ” 방식
  • ν•˜λ‚˜μ˜ μžμ‹ ν”„λ‘œμ„ΈμŠ€λŠ” ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œλ₯Ό 가짐
    • μŠ€λ ˆλ“œ κ°„ λ©”λͺ¨λ¦¬ 곡유λ₯Ό μ•ˆ ν•˜λ―€λ‘œ 독립적이고 μ•ˆμ •μ 
  • 일반적으둜 Single CPU, Dual CPUμ—μ„œ μ„±λŠ₯이 μ’‹λ‹€.
  • μžμ‹ ν”„λ‘œμ„ΈμŠ€λŠ” μ΅œλŒ€ 1024κ°œκΉŒμ§€ κ°€λŠ₯

worker 방식

  • workerλŠ” "일을 ν•˜λŠ” μ‚¬λžŒ", "μž‘μ—…μž"λ₯Ό 의미
    • master-slave, primary-secondary(replica) 처럼 master-worker의 관계
    • μ›Œμ»€ μŠ€λ ˆλ“œλ₯Ό λ°±κ·ΈλΌμš΄λ“œ μŠ€λ ˆλ“œλΌκ³ λ„ 뢀름
    • Worker threadλ₯Ό μ—¬λŸ¬ 개 λ³΄μœ ν•˜κ³  μžˆλŠ” μž₯μ†Œλ₯Ό Thread Pool이라고 뢀름
  • ν”„λ‘œμ„ΈμŠ€ λ‹Ή μŠ€λ ˆλ“œ 연결이 μ—¬λŸ¬ 개인 방식
  • μŠ€λ ˆλ“œλΌλ¦¬ λ©”λͺ¨λ¦¬λ₯Ό κ³΅μœ ν•¨
    • λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ€ 효율적
    • 톡신이 λ§Žμ€ μ„œλ²„μ— 적절
    • λ¦¬μ†ŒμŠ€ μ˜€μ—Ό(κ²½ν•©)에 주의 ν•„μš”

μ›Ή μ„œλΉ„μŠ€ μš”μ²­ 처리 κ³Όμ •

μ›Ή μ„œλΉ„μŠ€ μ„œλ²„μ˜ λŒ€λΆ€λΆ„μ˜ μž‘μ—…μ€ 읽기/μ“°κΈ°(I/O) 및 λŒ€κΈ°

  1. ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ΄ 였면 μš”μ²­μœΌλ‘œ 보낸 HTTP 메세지 등을 μ½λŠ”λ‹€.
  2. ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ” μž‘μ—…μ„ μˆ˜ν–‰ν•œλ‹€.
    • μ„œλ²„κ°€ μš”μ²­μ„ μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ νŠΉμ • μž‘μ—…(apiλ₯Ό 호좜, 데이터 처리 λ“±)을 호좜 ν›„ κ²°κ³Όλ₯Ό κΈ°λ‹€λ¦°λ‹€.
    • μ΄λ•Œ μ—­μ‹œ ν˜ΈμΆœν•œ μž‘μ—…μ΄ μ™„λ£Œλ˜λ©΄ κ²°κ³Όλ₯Ό 읽어야 ν•œλ‹€.
  3. λͺ¨λ“  μ²˜λ¦¬κ°€ μ™„λ£Œλ˜λ©΄ κ²°κ³Όλ₯Ό ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 보내기 μœ„ν•΄μ„œ μ“°κΈ° μž‘μ—…μ΄ μ§„ν–‰λœλ‹€.
  • μœ„ κ³Όμ •μ—μ„œ μ„œλ²„κ°€ ν•˜λŠ” 일의 λŒ€λΆ€λΆ„μ€ 읽기 & 쓰기와 μš”μ²­ ν›„ λŒ€κΈ°μ΄λ‹€.

I/O에 νŠΉν™”λœ event-loop λ‹€μ€‘μ²˜λ¦¬ 방식

  • λŒ€λΆ€λΆ„μ˜ μž‘μ—…μ΄ 읽기/μ“°κΈ°(I/O) 및 λŒ€κΈ°μΈ μ›Ή μ„œλΉ„μŠ€ μ„œλ²„λ₯Ό I/O에 νŠΉν™”λœ μ‹±κΈ€ μŠ€λ ˆλ“œλ‘œ λ‹€μ€‘μ²˜λ¦¬λ₯Ό ν•˜λŠ” 방식
    1. μ‹±κΈ€ μŠ€λ ˆλ“œλŠ” 계속 λŒμ•„κ°€λ©°(event-loop) λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μˆ˜ν–‰
    2. μˆ˜ν–‰ 도쀑 λΈ”λ‘œν‚Ή I/O μž‘μ—…μ„ λ§Œλ‚˜λ©΄ μ›Œμ»€ μŠ€λ ˆλ“œν’€μ—κ²Œ μž‘μ—…μ„ λ„˜κ²¨μ€Œ
    3. μž‘μ—…μ„ λ„˜κ²¨μ€€ λ’€ λ©”μΈμŠ€λ ˆλ“œλŠ” κ³„μ†ν•΄μ„œ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μˆ˜ν–‰
    4. μ›Œμ»€ μŠ€λ ˆλ“œν’€μ—κ²Œ λ„˜κ²¨μ£Όμ—ˆλ˜ μž‘μ—…μ΄ μ™„λ£Œλ˜λ©΄ λ‹€μ‹œ λ©”μΈμŠ€λ ˆλ“œλ‘œ λ“€μ–΄μ˜΄
  • μ›Œμ»€μŠ€λ ˆλ“œλ“€μ€ μ „λž΅μ— 따라 CPU Bound or I/O Bound ν•œ μŠ€λ ˆλ“œ
ajax.than({
  // 1번 : ajax μš”μ²­
  // ...(λΈ”λ‘œν‚Ή I/O μž‘μ—…μ΄ μžˆλ‹€κ³  κ°€μ •) 2번 : λΈ”λ‘œν‚Ή I/O μž‘μ—…
});

console.log("~"); //  3번
  • event-loop 처리 예제
    1. event-loop μŠ€λ ˆλ“œμ— ajax μ½”λ“œμΈ 1번이 μ‹€ν–‰λœλ‹€.
    2. 2λ²ˆμ€ λΈ”λ‘œν‚Ή I/O μž‘μ—…μ΄ μžˆλ‹€κ³  κ°€μ •ν•  λ•Œ 2λ²ˆμ€ 메인 μŠ€λ ˆλ“œμ—μ„œ μˆ˜ν–‰λ˜μ§€ μ•Šκ³  μ›Œμ»€ μŠ€λ ˆλ“œλ‘œ μž‘μ—…μ΄ λ„˜μ–΄κ°„λ‹€.
    3. 3번의 console.log()κ°€ μ‹€ν–‰λœλ‹€.
    4. 2번의 λΈ”λ‘œν‚Ή I/O μž‘μ—…μ΄ λλ‚œ ν›„μ˜ κ²°κ³Όκ°€ 메인 μŠ€λ ˆλ“œμ˜ event-loop둜 λ“€μ–΄μ˜¨λ‹€.
    5. 즉, μœ„ μ†ŒμŠ€μ½”λ“œλŠ” 1 -> 3 -> 2의 순으둜 μ‹€ν–‰λœλ‹€.

sync/async, blocking/non-blocking

  • κ΄€μ μ˜ 차이

sync/async

  • sync/asyncλŠ” μ‹€ν–‰ μˆœμ„œ(μ‹œκ°„)λ₯Ό κ΄€μ μœΌλ‘œ λ‚˜λˆ„μ–΄μ§„λ‹€.
  • sync
    • μ‹€ν–‰ μˆœμ„œκ°€ 절차적
    • μ½”λ“œμ˜ μž‘μ„± μˆœμ„œλŒ€λ‘œ μ‹€ν–‰λ˜λŠ” 것을 보μž₯ (μ „ λͺ…λ Ήμ˜ μž‘μ—…μ΄ λλ‚˜μ§€ μ•ŠμœΌλ©΄ λ‹€λ₯Έ μž‘μ—…μ„ ν•  수 μ—†λ‹€.)
  • async
    • μ‹€ν–‰ μˆœμ„œκ°€ μ ˆμ°¨μ μ΄μ§€ μ•ŠμŒ
    • μ „ λͺ…λ Ήμ˜ μž‘μ—…μ΄ λλ‚˜μ§€ μ•Šμ•„λ„ λ‹€μŒ λͺ…령을 μ‹€ν–‰
    • μ•žμ„œ μ‚΄νŽ΄λ³Έ event-loop 기반의 μ‹±κΈ€ μŠ€λ ˆλ“œ μ—­μ‹œ μ‹œκ°„μ΄ 많이 κ±Έλ¦¬λŠ” 연산듀을 μ›Œμ»€ μŠ€λ ˆλ“œμ—κ²Œ λ„˜κΈ°κ³  λ‹€λ₯Έ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λ―€λ‘œ μ‹€ν–‰ μˆœμ„œκ°€ μ ˆμ°¨μ μ΄μ§€ μ•Šμ€ asyncλ‹€.

blocking/non-blocking

  • blocking/non-blocking은 μ œμ–΄κΆŒμ˜ λ°˜ν™˜μ„ κ΄€μ μœΌλ‘œ λ‚˜λˆ„μ–΄μ§„λ‹€.
  • blocking
    • 호좜된 ν•¨μˆ˜κ°€ μ œμ–΄κΆŒμ„ λ„˜κ²¨μ£Όμ§€ μ•ŠμŒ
    • ν˜ΈμΆœν•œ ν•¨μˆ˜μ—μ„  λ‹€λ₯Έ μž‘μ—…μ„ μˆ˜ν–‰ λͺ»ν•˜κ³  μ œμ–΄κΆŒμ˜ λ°˜ν™˜μ„ κΈ°λ‹€λ €μ•Ό 함
  • non-blocking
    • ν˜ΈμΆœν•œ ν•¨μˆ˜ μΈ‘μ—μ„œ μ œμ–΄κΆŒμ„ 계속 가짐 (μ œμ–΄κΆŒμ΄ λ„˜κ²¨μ§€μ§€ μ•ŠμŒ)
    • ν˜ΈμΆœν•œ ν•¨μˆ˜λŠ” μ œμ–΄κΆŒμ΄ μžˆμœΌλ―€λ‘œ κ³„μ†ν•΄μ„œ λ‹€λ₯Έ μž‘μ—…μ„ μ²˜λ¦¬ν•  수 있음
    • μœ„μ˜ event-loop κ΅¬μ‘°λŠ” μ›Œμ»€ μŠ€λ ˆλ“œμ—μ„œ 호좜된 ν•¨μˆ˜κ°€ μˆ˜ν–‰λœλ‹€λ©΄ κ·Έ ν•¨μˆ˜μ— λŒ€ν•œ 결과값을 받을 수 μžˆλŠ” 상황인지 체크 κ³Όμ • ν›„ 결과값을 λ°›μŒ