Request vs Job
Request
- HTTP 프로토콜 수준의 단위
- 클라이언트 <-> 서버 연결의 생명주기
- 짧아야 한다
- 실패하면 즉시 응답해야 한다
- 재시도 개념이 약하다
Job
- 시간이 걸릴 수 있는 실행 단위
- HTTP와 무관하게 독립된 생명주기 보유
- 실행 / 대기 / 종료 상태를 가진다
- timeout, kill, 재시도가 가능하다
- Worker가 실행한다
설계 판단 기준
- 실행 시간이 항상 짧고 (<100ms),
- 실패가 거의 없으며,
- timeout 관리가 필요 없다면
-> Request
- 실행 시간이 길 수 있고
- 무한루프 가능성이 있으며
- 강제 종료가 필요하다면
-> Job
책임 분리
설계 판단 기준: 이 코드가 죽으면 서비스 전체가 죽어도 되나?
YES -> 같은 책임
NO -> 책임 분리
동기/비동기와 블로킹/논블로킹
동기/비동기
- 작업의 완료 여부를 따지면 동기, 아니면 비동기
- 메인 함수가 서브 함수의 처리 결과를 신경쓰면 동기, 아니면 비동기
- caller가 완료 여부를 확인? -> 동기
- callee가 완료 여부를 통지? -> 비동기
블로킹/논블로킹:
- 현재 작업을 처리하기 위해 실행 중인 작업을 블락(차단/대기)하는지가 중요
- 시스템 콜이 스레드를 runnable상태로 유지시키는가?
- 이 호출로 인해 calling thread가 sleep에 들어가는가?
- 호출한 스레드가 멈추면 블로킹, 아니면 논블로킹
대부분의 상황은 동기 + 블로킹, 비동기 + 논블로킹이 사용됨. 하지만, 그렇지 않는 경우도 있음. 비동기 + 블로킹은 동기 + 블로킹과 큰 차이가 없어서 거의 쓰이지 않음. 안티 패턴으로 불리기도 함. 동기 + 논블로킹은 polling 형태.
참고 링크