요청 경로와 작업 경로 분리
사용자가 지금 기다려야 하는 일과 나중에 처리해도 되는 일을 나눈다.
API 응답 시간이 외부 API, 이메일, 이미지 처리 때문에 흔들릴 때분류: Layer 6 - 운영 & 관측성
L6는 서비스가 느려지거나, 실패하거나, 일부 작업을 나중에 처리해야 할 때 운영 가능한 구조로 바꾸는 레이어다.
API 서버 안에서 모든 일을 즉시 끝내는 방식은 처음에는 단순하다. 하지만 이메일 발송, 결제 후 알림, 이미지 처리, 외부 API 동기화, 대량 집계처럼 느리거나 실패하기 쉬운 일이 요청 경로 안에 들어오면 사용자 응답 시간과 장애 범위가 같이 커진다. L6는 이런 일을 Queue와 Worker로 분리하고, 재시도와 중복을 안전하게 다루고, 이벤트로 서비스 사이 결합을 낮추고, Redis 같은 완충 레이어로 하위 시스템을 보호하는 방법을 배운다.
그 다음 질문은 “문제가 안 생기게 만들 수 있는가”가 아니라 “문제가 생겼을 때 어디서, 얼마나, 누구에게 영향을 주는지 볼 수 있는가”다. CloudWatch, Logs, Metrics, Traces는 장애를 보이게 만들고, SRE는 그 신호를 기준으로 배포, 알림, 롤백, 안정화 우선순위를 정한다.
즉 L6의 목표는 운영 도구 이름을 외우는 것이 아니다. 느리고 실패하는 일을 사용자 요청 밖으로 옮기고, 그 결과 생기는 지연·중복·적체·장애 신호를 관측해서 신뢰성 판단으로 연결하는 것이다.
선행 방식은 요청을 받은 API 서버가 모든 일을 끝낸 뒤 응답하는 구조다. 이 방식은 작은 기능에는 충분하지만, 느린 외부 의존성 하나가 사용자 응답 시간과 장애 범위를 같이 끌고 간다. L6는 이 한계를 비동기 처리, 안전한 재시도, 캐시 기반 완충, 관측성, SRE 판단으로 나누어 다룬다.
프론트엔드에서 지연, 오류, 중복 입력이 사용자 상태로 드러난다는 감각은 배경으로만 가져오면 된다. L6부터는 화면 상태가 아니라 요청 경로, 작업 경로, 실패 경계, 데이터 원본, 관측 신호를 판단 단위로 삼는다.
202 Accepted를 반환했다면 접수가 끝난 것이지 작업이 성공한 것은 아니다. 시스템은 접수, 처리 중, 재시도 중, 최종 실패를 다른 상태로 기록해야 한다.L6에서는 아래 사고 모델을 반복해서 쓴다.
사용자가 지금 기다려야 하는 일과 나중에 처리해도 되는 일을 나눈다.
API 응답 시간이 외부 API, 이메일, 이미지 처리 때문에 흔들릴 때일시 실패, 영구 실패, timeout, 중복 실행 가능성을 구분한 뒤 재시도한다.
에러가 났다고 바로 다시 보내면 중복 결제나 retry storm이 생길 수 있을 때이벤트와 Queue는 서비스를 느슨하게 만들지만 순서, 중복, 지연을 새로 만든다.
주문 생성 뒤 알림, 재고, 감사 로그가 각자 반응해야 할 때Redis는 빠른 저장소이면서 DB 과부하와 장애 전파를 줄이는 완충 레이어다.
반복 조회가 DB connection pool과 p99 latency를 밀어 올릴 때로그, 지표, 추적은 대시보드 장식이 아니라 장애 범위와 사용자 영향을 판단하는 근거다.
알람이 울렸을 때 증상 확인에서 롤백·확장·배포 중단 판단으로 넘어가야 할 때첫 회독에서는 각 도구의 세부 옵션보다 “이 선택이 어떤 실패를 줄이고, 어떤 새 운영 부담을 만드는가”를 먼저 보면 된다.
이 문서를 읽기 위해 frontmatter에 강제 선수 문서를 걸 필요는 없다. 다만 아래 감각이 있으면 첫 토픽이 훨씬 가벼워진다.
content/topics/L0/nodejs-event-loop.mdx로 돌아간다.content/topics/L2/osi-web-server.mdx와 content/topics/L2/tcp-udp-internals.mdx를 본다.content/topics/L3/ecs-vs-ec2.mdx, content/topics/L3/rds-basics.mdx, content/topics/L3/vpc-subnet-sg.mdx를 필요한 만큼만 참고한다.content/topics/L5/docker-basics.mdx와 content/topics/L5/kubernetes-basics.mdx가 도움이 된다.처음부터 모든 선수 문서를 끝내야 하는 것은 아니다. 막히는 지점이 나왔을 때 해당 문서로 내려갔다가 다시 L6로 올라오면 된다.
느리거나 실패하기 쉬운 일을 사용자 요청 경로에서 분리하는 기본 구조를 잡는다.
Queue와 네트워크 호출에서 생기는 실패, 재시도, 중복 실행을 안전하게 다루는 기준을 배운다.
하나의 작업 분리를 넘어 여러 서비스가 이벤트에 독립적으로 반응하는 구조로 확장한다.
DB와 외부 의존성을 보호하기 위해 캐시, TTL, fallback, circuit breaker를 운영 관점에서 본다.
AWS 리소스와 애플리케이션의 로그, 지표, 알람을 모아 운영 신호를 보는 기본기를 만든다.
CloudWatch 기본기 위에서 장애를 감지하고, 좁히고, 요청 경로까지 추적하는 관측성 모델을 정리한다.
앞의 관측 신호를 SLI, SLO, error budget, postmortem 같은 신뢰성 의사결정으로 종합한다.
이 순서가 중요한 이유는 앞의 선택이 뒤의 문제를 만들기 때문이다. Queue/Worker로 느린 일을 분리하면 중복과 재시도가 생긴다. 재시도와 멱등성을 이해하면 이벤트 기반 구조의 consumer 실패를 읽을 수 있다. 이벤트와 Worker가 늘어나면 DB와 외부 시스템을 보호할 캐시와 격리가 필요하다. 그런 다음에야 CloudWatch와 관측성 신호가 “무엇을 봐야 하는지”와 연결되고, 마지막에 SRE가 그 신호를 운영 결정으로 묶는다.
보통 부족한 전제: 이벤트 루프와 프로세스 밖 작업 경로 구분
돌아갈 문서: `content/topics/L0/nodejs-event-loop.mdx`, `content/topics/L6/queue-worker-basics.mdx`보통 부족한 전제: 네트워크 실패와 응답 유실의 차이
돌아갈 문서: `content/topics/L2/tcp-udp-internals.mdx`, `content/topics/L6/retry-backoff-idempotency.mdx`보통 부족한 전제: 작업 분산과 이벤트 발행/구독의 목적 차이
돌아갈 문서: `content/topics/L6/queue-worker-basics.mdx`, `content/topics/L6/eda-basics.mdx`보통 부족한 전제: 원본 데이터와 캐시 복사본의 책임 차이
돌아갈 문서: `content/topics/L3/rds-basics.mdx`, `content/topics/L6/redis-cache-basics.mdx`보통 부족한 전제: AWS 관리형 서비스와 배포 단위 감각
돌아갈 문서: `content/topics/L3/ecs-vs-ec2.mdx`, `content/topics/L3/vpc-subnet-sg.mdx`, `content/topics/L5/docker-basics.mdx`보통 부족한 전제: 감지, 좁히기, 요청 경로 추적의 역할 분리
돌아갈 문서: `content/topics/L6/cloudwatch-basics.mdx`, `content/topics/L6/logs-metrics-traces.mdx`보통 부족한 전제: 관측 신호를 신뢰성 목표와 의사결정으로 바꾸는 흐름
돌아갈 문서: `content/topics/L6/logs-metrics-traces.mdx`, `content/topics/L6/sre-practices.mdx`보통 부족한 전제: 컨테이너와 Kubernetes의 실행 단위
돌아갈 문서: `content/topics/L5/docker-basics.mdx`, `content/topics/L5/kubernetes-basics.mdx`막힐 때는 “도구 이름을 모른다”보다 “어떤 실패 경계를 아직 못 나누고 있는가”를 먼저 확인한다. L6의 대부분은 도구 사용법보다 실패 경계, 중복 경계, 관측 경계를 나누는 문제다.
L6 운영 & 관측성은 느리고 실패하는 일을 숨기는 레이어가 아니라, 사용자 요청 밖으로 안전하게 옮기고, 중복과 지연을 통제하고, 관측 신호를 신뢰성 의사결정으로 바꾸는 레이어다.