DS ForgeCourses
기존 Lab

PRODUCTION SYSTEMS FIELD GUIDE · v1

Rust, 껍데기 제거

컴파일러의 판단에서 운영 중인 queue까지, 값·메모리·task가 실제로 어디로 이동하는지 추적하는 실행형 시스템 랩.

학습 범위

11
심층 모듈
12
강제 장애
01
하나의 capstone
HTTPDISK

CAPSTONE / 01

Telemetry가 통과하는 경계

각 화살표는 무한 대기가 아니라 용량·시간·소유권 정책을 뜻합니다.

  1. 011 · HTTP 수집

    Axum/Tower가 route, request ID, timeout과 64KiB body limit를 적용하고 bytes를 받는다.

    압력 신호: connection/concurrency limit을 넘으면 queue 이전에 거부한다.
  2. 022 · Validation

    wire schema, field count/range, timestamp와 tenant policy를 검사해 `Event<Validated>`로 전환한다.

    압력 신호: invalid input은 retry 불가 400이며 원 payload를 log하지 않는다.
  3. 033 · Bounded queue

    owned validated event만 bounded MPSC slot을 획득해 batcher로 이동한다. 202는 이 admission을 뜻한다.

    압력 신호: queue full/queue-wait timeout은 429 또는 503과 bounded Retry-After로 전파한다.
  4. 044 · Batch 형성

    single owner가 max items/bytes 또는 max age에서 batch를 seal하고 buffer capacity를 정책적으로 재사용한다.

    압력 신호: oldest age와 fill ratio가 latency/throughput trade-off를 드러낸다.
  5. 055 · 저장 transaction

    pool budget 안에서 idempotency key와 batch rows를 한 transaction으로 commit한다.

    압력 신호: pool wait/transaction timeout이 batcher를 늦추고 upstream queue saturation으로 되먹임된다.
  6. 066 · Retry

    typed transient error만 exponential backoff+full jitter로 재시도하고 attempt/elapsed budget을 지킨다.

    압력 신호: concurrency cap과 circuit signal로 retry storm이 store recovery를 압도하지 않게 한다.
  7. 077 · Trace와 metric

    request span을 batch span에 link하고 stage latency, queue saturation, accepted/stored/error count를 기록한다.

    압력 신호: bounded attribute allowlist와 exporter queue limit로 observability 자체의 부하를 제한한다.
  8. 088 · Graceful shutdown

    readiness false→accept 중단→producer close→connection/queue drain→last flush→exporter flush 순으로 deadline 안에 종료한다.

    압력 신호: deadline 초과와 OS별 강제 종료에서 남는 event의 loss/replay 정책을 명시하고 restart test로 확인한다.
P00소스 한 줄에서 binary와 byte까지

Rust 컴파일과 실행

오해: move는 항상 memcpy이고 abstraction은 항상 공짜다. 실체: move는 의미 규칙이며 물리적 복사는 최적화 결과이고 비용은 측정 대상이다.

P01alias와 lifetime을 실행 상태로 읽기

Ownership과 borrowing

오해: lifetime annotation이 값을 오래 살게 한다. 실체: annotation은 reference 관계를 기술하며 storage 수명을 연장하지 않는다.

P02invalid state를 표현 불가능하게

Type system

오해: trait object는 generic과 같은 dispatch다. 실체: generic은 보통 monomorphized static dispatch, `dyn Trait`는 pointer metadata/vtable 기반 dynamic dispatch다.

P03ownership graph가 leak과 panic을 만든다

Smart pointer와 interior mutability

오해: Arc와 Mutex를 붙이면 안전하고 빠르다. 실체: Arc는 수명, Mutex는 access 직렬화를 다루며 cycle·poison·contention 정책은 별도다.

P04실패를 분류하고 경계를 세운다

Error

오해: `?`와 anyhow context면 error 설계가 끝난다. 실체: 호출자는 retry 가능성, 공개 응답, source chain, process 정책을 구분해야 한다.

P05race freedom 밖의 실패를 검증한다

Concurrency

오해: lock-free는 lock보다 빠르고 safe Rust는 deadlock을 막는다. 실체: progress와 성능은 contention/cache/workload에 달리고 deadlock은 safe하게 발생한다.

P06Future state와 cancellation point를 해부한다

Async Rust 내부

오해: async 함수는 background thread이고 drop하면 작업이 원자적으로 취소된다. 실체: Future는 poll state machine이며 drop은 다음 poll을 없앨 뿐 이미 발생한 side effect를 rollback하지 않는다.

P07HTTP admission에서 durable batch까지

Network service

오해: graceful shutdown은 signal handler와 sleep이면 된다. 실체: accept 중단, connection drain, producer close, queue drain, transaction flush에 명시적 deadline과 loss policy가 필요하다.

P08검사가 사라지는 정확한 한 줄

Unsafe와 FFI

오해: unsafe block 안에서는 compiler 검사가 모두 꺼진다. 실체: 제한된 unsafe operation을 허용할 뿐 type/borrow/lifetime 검사는 계속되고, UB 방지 proof가 작성자에게 이동한다.

P09평균이 숨기는 allocation과 tail

성능

오해: clone은 느리고 zero-copy는 빠르다. 실체: clone 비용은 타입별이며 copy 제거가 buffer retention·complexity·cache miss를 늘릴 수 있다.

P10signal을 incident action으로 바꾼다

운영

오해: tracing과 OpenTelemetry를 붙이면 observable하다. 실체: bounded semantic fields, SLO, alert, runbook, canary/rollback 연결이 없으면 data만 쌓인다.

READING PROTOCOL

근거 수준

서로 다른 종류의 주장을 같은 확신으로 읽지 않도록 표시했습니다.

SPEC

Rust Reference, 표준 라이브러리 API 계약, 프로토콜 명세가 약속하는 범위. 구현 우연과 구분한다.

VERIFIED BEHAVIOR

고정된 도구체인과 저장소 명령으로 재현하도록 만든 관찰 결과. 실행하지 않은 OS·부하·컴파일러 버전으로 일반화하지 않는다.

RECOMMENDED PRACTICE

명세상 의무는 아니지만 실패 비용을 줄이는 engineering 선택. workload 측정과 threat model로 재평가한다.

PROJECT POLICY

이 telemetry lab이 의도적으로 채택한 운영 계약. Rust 전체의 보장으로 오해하지 않는다.

GUARANTEE MAP

경계표: Rust가 보장하는 것과 하지 않는 것

슬로건을 운영 보장으로 오해하지 않기 위한 공격 표면입니다.

주장보장 / 측정 대상보장하지 않음근거 수준
‘zero-cost abstraction’소유권·generic·iterator 같은 많은 추상화는 정적 분석과 최적화로 런타임 표현을 제거할 수 있다.모든 추상화가 allocation·branch·code-size·compile-time 비용 0이라는 뜻이 아니다. release assembly와 workload benchmark로 비교해야 한다.VERIFIED BEHAVIOR
‘memory safe’sound한 safe API만 통과하는 safe Rust는 언어가 정의한 dangling reference, invalid value, data race 같은 UB를 만들 수 없도록 제한된다.unsafe/FFI/compiler bug의 soundness, 메모리 leak, OOM, panic, deadlock, 논리 오류, secret 노출까지 보장하지 않는다. 정확한 aliasing 모델도 완결된 명세가 아니다.SPEC
‘fearless concurrency’ownership과 `Send`/`Sync` 경계는 많은 use-after-free와 data race를 compile time에 배제한다.deadlock, starvation, priority inversion, false sharing, atomic ordering 실수, 메시지 순서·중복 같은 논리 race는 남는다.SPEC
`Arc<T>`는 T를 thread-safe로 만든다strong/weak reference count 갱신이 atomic이고 공유 ownership 수명이 관리된다.T의 mutation 동기화는 제공하지 않는다. thread 간 공유에는 `T: Send + Sync`와 적절한 interior synchronization이 필요하다.SPEC
async는 자동 병렬·비차단이다Future는 `poll` 기반 state machine이며 `Pending`일 때 thread를 반환할 수 있다.poll 안의 blocking syscall/CPU loop는 executor thread를 막는다. 공정성·취소 안전성·병렬성은 runtime과 코드가 별도로 설계해야 한다.SPEC
`Pin`이면 self-reference가 안전하다`Unpin`이 아닌 값에 대해 safe code가 pinned storage 밖으로 값을 이동하지 못하게 하는 API 계약을 제공한다.내부 pointer 생성, 초기화 순서, Drop invariant, unsafe projection의 정당성을 자동 검증하지 않는다.SPEC

LANGUAGE / SHARED

Glossary

AST
parser가 source 문법 구조를 표현한 abstract syntax tree. macro expansion과 lowering 전의 형태다.
HIR
rustc가 AST를 desugar해 name/type analysis에 쓰는 high-level intermediate representation.
MIR
control flow와 move/drop을 명시해 borrow checking, optimization, codegen 입력에 쓰는 mid-level IR.
Monomorphization
generic code를 사용된 concrete type별 machine-code instance로 특수화하는 과정.
Move
값의 ownership을 새 place로 이전하고 이전 place 사용을 막는 의미 규칙. 물리적 byte copy 방식은 보장하지 않는다.
Borrow
ownership을 옮기지 않고 제한된 기간 shared 또는 exclusive access를 부여하는 reference 관계.
Lifetime
reference가 유효해야 하는 program-point 범위와 reference 사이 관계. runtime duration field가 아니다.
Aliasing
둘 이상의 pointer/reference가 같은 memory region을 지칭하는 상태. mutation과 결합된 허용 규칙이 중요하다.
RAII
resource 획득을 value 생성, 해제를 Drop/scope exit에 결합하는 pattern.
Coherence
trait implementation이 program 전체에서 모호하거나 겹치지 않도록 하는 규칙 집합; orphan rule을 포함한다.
Vtable
`dyn Trait` 호출에 쓰이는 concrete method/drop/layout metadata table. fat pointer metadata가 이를 가리킨다.
Typestate
protocol 상태를 type parameter로 표현해 허용된 transition만 compile되게 하는 API pattern.
Interior mutability
shared reference 뒤의 mutation을 UnsafeCell 기반 runtime/atomic/lock protocol로 허용하는 pattern.
Poisoning
lock guard 보유 중 panic을 advisory state로 표시하는 정책. data rollback이나 soundness 증명이 아니다.
Send
값의 ownership을 thread 사이로 이동해도 안전함을 뜻하는 unsafe auto marker trait.
Sync
`&T`를 thread 사이에 공유해도 안전함, 즉 `&T: Send`임을 뜻하는 unsafe auto marker trait.
Happens-before
한 memory action의 효과가 다른 action에 관찰되어야 함을 세우는 synchronization 관계.
False sharing
독립 data를 다른 core가 쓰지만 같은 cache line에 있어 coherence traffic으로 느려지는 현상.
Future
`poll`로 progress를 요청받아 `Pending` 또는 `Ready`를 반환하는 비동기 계산 state machine.
Waker
Pending Future가 다시 progress할 가능성이 생겼음을 executor에 알리는 handle.
Pin
pinned `!Unpin` value를 safe code가 storage 밖으로 move하지 않는다는 library contract.
Cancellation safety
Future를 임의 await 지점에서 drop하고 다시 시작해도 logical data loss/duplication이나 invariant 파괴가 없는 성질.
Backpressure
downstream capacity 부족을 upstream admission 지연/거부로 전달해 in-flight resource를 bound하는 feedback.
Idempotency
같은 operation을 중복 적용해도 한 번 적용한 것과 같은 externally relevant state가 되는 성질.
Undefined behavior
Rust abstract machine이 허용하지 않아 compiler가 어떤 결과도 보장하지 않는 실행. unsafe block 안에서도 금지된다.
Provenance
pointer가 어느 allocation/access history에서 유래했는지 나타내는 abstract 정보; integer address와 동일하지 않다.
p99
관측값의 99%가 이하인 percentile. sample window, load, coordinated omission에 따라 해석이 달라진다.
Span
trace 안의 한 operation을 duration, attributes, events, status로 표현하는 telemetry record.
Cardinality
metric attribute 조합의 고유한 수. 증가할수록 series state, memory와 backend 비용이 커진다.
Graceful shutdown
새 작업 admission을 막고 owned in-flight work를 deadline 안에 drain/flush한 뒤 종료하는 protocol.
FFI
Rust와 다른 language/ABI 사이 호출 경계. layout, ownership, error, unwind 계약을 compiler 밖에서 맞춰야 한다.

COMPANION / EXECUTABLE

Cargo workspace

웹에서 읽은 경계를 같은 commit의 실행 코드로 재현한다.

cargo fmt --check
cargo clippy --workspace --all-targets --all-features -- -D warnings
cargo build --workspace --all-targets
cargo test --workspace --all-targets
cargo bench --workspace --no-run
cargo run -p telemetry-service

PRIMARY SOURCES

공식 출처

문서의 표현보다 코드와 버전 동작이 우선입니다. 링크는 근거가 닿는 범위만 지지합니다.

  1. 01

    지원하는 범위 · token/AST, macro expansion, HIR/THIR/MIR, type/borrow checking, monomorphization/codegen 흐름.

  2. 02
    Type layoutRust Project

    지원하는 범위 · size, alignment, repr와 보장되지 않는 Rust layout 경계.

  3. 03
    DestructorsRust Project

    지원하는 범위 · Drop scope, local/field destructor 순서와 temporary lifetime extension.

  4. 04

    지원하는 범위 · trait object로 만들 수 있는 trait의 공식 조건.

  5. 05
    Memory modelRust Project

    지원하는 범위 · Rust memory model의 현재 명세 범위와 미완결 경고.

  6. 06

    지원하는 범위 · data race, dangling/misaligned access, alias, invalid/uninitialized value와 unsafe 책임.

  7. 07
    RefCellRust Project

    지원하는 범위 · runtime borrow checking과 violation panic.

  8. 08
    MutexRust Project

    지원하는 범위 · mutual exclusion, poisoning, recovery caveat와 platform behavior.

  9. 09
    catch_unwindRust Project

    지원하는 범위 · unwind boundary의 사용 목적과 abort/foreign exception 한계.

  10. 10
    Atomic OrderingRust Project

    지원하는 범위 · Relaxed, Acquire, Release, AcqRel, SeqCst 의미.

  11. 11
    Send and SyncRust Project

    지원하는 범위 · unsafe auto marker의 의미와 Rc/UnsafeCell/raw pointer 경계.

  12. 12
    PinningRust Project

    지원하는 범위 · Pin/Unpin의 address-sensitive value 계약.

  13. 13
    FutureRust Project

    지원하는 범위 · poll, Pending/Ready, Waker contract.

  14. 14
    SelectTokio

    지원하는 범위 · select branch lifecycle과 Future drop 기반 cancellation.

  15. 15

    지원하는 범위 · blocking boundary, thread pool과 abort 한계.

  16. 16

    지원하는 범위 · shutdown 신호, 전파, task 종료 대기 pattern.

  17. 17

    지원하는 범위 · bounded channel backpressure와 clean shutdown behavior.

  18. 18
    axumTokio

    지원하는 범위 · extractor, response, state와 Tower middleware 통합 선택 근거.

  19. 19

    지원하는 범위 · HTTP request body byte limit middleware behavior.

  20. 20

    지원하는 범위 · C ABI, ownership, callback와 unwind 경계.

  21. 21
    MiriRust Project

    지원하는 범위 · MIR interpreter가 탐지하는 UB와 path/platform/모델 coverage 한계.

  22. 22
    Sanitizer supportRust Project

    지원하는 범위 · nightly sanitizer flags, target별 지원과 사용 범위.

  23. 23
    Rust Fuzz BookRust Fuzz Project

    지원하는 범위 · cargo-fuzz/libFuzzer harness와 corpus workflow.

  24. 24
    LoomTokio contributors

    지원하는 범위 · modeled concurrency permutation test의 목적과 범위.

  25. 25

    지원하는 범위 · 통계적 microbenchmark, warm-up, measurement과 분석 workflow.

  26. 26
    Cargo ProfilesRust Project

    지원하는 범위 · dev/release/test/bench optimization, overflow, debug 설정.

  27. 27

    지원하는 범위 · Rust trace, metric, log instrumentation과 SDK/exporter 구성.

  28. 28

    지원하는 범위 · span/metric/log attribute naming, stability와 versioned convention.

  29. 29

    지원하는 범위 · security event logging, data exclusion, secret/PII protection과 log injection.

  30. 30

    지원하는 범위 · client error에서 internal detail/stack 노출 방지.