Request vs Job

Request

  • HTTP 프로토콜 수준의 단위
  • 클라이언트 <-> 서버 연결의 생명주기
  • 짧아야 한다
  • 실패하면 즉시 응답해야 한다
  • 재시도 개념이 약하다

Job

  • 시간이 걸릴 수 있는 실행 단위
  • HTTP와 무관하게 독립된 생명주기 보유
  • 실행 / 대기 / 종료 상태를 가진다
  • timeout, kill, 재시도가 가능하다
  • Worker가 실행한다

설계 판단 기준

  • 실행 시간이 항상 짧고 (<100ms),
  • 실패가 거의 없으며,
  • timeout 관리가 필요 없다면

-> Request

  • 실행 시간이 길 수 있고
  • 무한루프 가능성이 있으며
  • 강제 종료가 필요하다면

-> Job

책임 분리

설계 판단 기준: 이 코드가 죽으면 서비스 전체가 죽어도 되나?
YES -> 같은 책임
NO -> 책임 분리

동기/비동기와 블로킹/논블로킹

  • 동기/비동기

    • 작업의 완료 여부를 따지면 동기, 아니면 비동기
    • 메인 함수가 서브 함수의 처리 결과를 신경쓰면 동기, 아니면 비동기
    • caller가 완료 여부를 확인? -> 동기
    • callee가 완료 여부를 통지? -> 비동기
  • 블로킹/논블로킹:

    • 현재 작업을 처리하기 위해 실행 중인 작업을 블락(차단/대기)하는지가 중요
    • 시스템 콜이 스레드를 runnable상태로 유지시키는가?
    • 이 호출로 인해 calling thread가 sleep에 들어가는가?
    • 호출한 스레드가 멈추면 블로킹, 아니면 논블로킹
  • 대부분의 상황은 동기 + 블로킹, 비동기 + 논블로킹이 사용됨. 하지만, 그렇지 않는 경우도 있음. 비동기 + 블로킹은 동기 + 블로킹과 큰 차이가 없어서 거의 쓰이지 않음. 안티 패턴으로 불리기도 함. 동기 + 논블로킹은 polling 형태.

참고 링크