integration-resilience-engineer

작성자: kotlin

탄력적인 HTTP, 메시징, 예약 통합을 Kotlin 및 Spring 서비스용으로 설계하며 명시적인 타임아웃 예산, 재시도, 멱등성, 서킷 브레이커를 포함합니다.

npx skills add https://github.com/kotlin/kotlin-backend-agent-skills --skill integration-resilience-engineer

Integration Resilience Engineer

Source mapping: Tier 2 high-value skill derived from Kotlin_Spring_Developer_Pipeline.md (SK-12).

Mission

Make integrations behave predictably under partial failure, timeouts, retries, and duplicate delivery. Treat every remote boundary as unreliable and every retry as a potential multiplier of load.

Read First

  • External API or messaging contract, including status codes or message schema.
  • SLA, timeout budget, rate-limit rules, and idempotency guarantees.
  • Current client configuration, retry logic, circuit breaker settings, and scheduling configuration.
  • Business criticality of the operation and acceptable degradation behavior.
  • Existing observability around request outcome, retry count, queue depth, and DLQ.

Design Sequence

  1. Classify the operation:
    • read-only or state-changing
    • idempotent or non-idempotent
    • synchronous user path or asynchronous background path
  2. Set timeout budgets from the caller's SLO backward.
  3. Decide which failures are retryable and which are terminal.
  4. Decide where deduplication or idempotency must be enforced.
  5. Add circuit breaking, bulkheading, or rate limiting where failure amplification is plausible.
  6. Add metrics, tracing, and structured outcome logging.

HTTP Client Rules

  • Set connect and response timeouts explicitly.
  • Retry only when the operation is safe to replay or explicitly idempotent.
  • Use exponential backoff with jitter, not fixed-interval retries.
  • Respect 429, Retry-After, and dependency-specific throttling semantics.
  • Distinguish timeout before request reached the server from timeout after side effects may already have happened.
  • Map downstream errors into local semantics deliberately. Do not leak raw remote failures by accident.

Messaging And Scheduling Rules

  • Treat consumers as at-least-once unless a stronger guarantee is proven end to end.
  • Design deduplication with stable keys and durable storage when duplicate delivery matters.
  • Use DLQ or poison-message handling instead of infinite redelivery loops.
  • Be explicit about ordering guarantees and partition-key strategy.
  • For scheduled jobs, prevent overlap with distributed locking when multiple nodes can run the same task.
  • Account for clock skew, long-running jobs, and partial completion when scheduling recurring work.

Advanced Failure Modes

  • Retries at multiple layers multiply explosively. One client retry policy plus platform retry plus queue retry can create storms.
  • Circuit breakers without sensible fallback or operator visibility often only change the failure shape.
  • Fallback data can become a stale correctness problem, not merely a degraded UX.
  • A timeout on a state-changing call may leave the caller uncertain whether the remote side succeeded. This is an idempotency design problem, not just a timeout problem.
  • DLQ without replay discipline creates permanent operational debt.
  • Exactly-once is usually a system property claim, not an individual code property. Be skeptical and precise.
  • If message schema evolution is expected, plan backward-compatible consumers before the first change arrives.

Boundary-Specific Nuances

  • HTTP connection pooling, DNS caching, TLS handshakes, and per-host limits can dominate latency long before business logic does. Client-level transport settings matter.
  • A 202 Accepted plus asynchronous completion model may be safer than a synchronous state-changing call when dependency latency is unpredictable.
  • Outbox and inbox patterns solve different halves of reliability. Do not talk about one as if it covers both publish and consume idempotency.
  • Kafka rebalance behavior, consumer lag, and partition skew are part of resiliency, not only throughput tuning.
  • Schedulers need both overlap prevention and business-level idempotency. A distributed lock alone does not make the job semantically safe.

Expert Heuristics

  • Put a retry budget around each integration path. If retries exceed the budget, fail fast and surface the degradation clearly.
  • If a dependency is slow but not down, circuit breaking may be less useful than tight timeouts plus bulkheads.
  • If the caller cannot safely determine whether a remote write succeeded, design a reconciliation path, not only a retry policy.
  • If a queue consumer is critical, define operator behavior for DLQ replay before the first poison message appears.

Output Contract

Return these sections:

  • Failure model: what can go wrong at this boundary.
  • Resilience policy: timeouts, retries, circuit breaking, bulkheads, fallback, and deduplication.
  • Idempotency rule: how duplicate or uncertain delivery is handled.
  • Operational signals: which metrics, logs, traces, and alerts are required.
  • Minimal implementation plan: client, listener, scheduler, or config changes to make.
  • Verification: chaos, integration, or replay tests that prove the design.

Guardrails

  • Do not retry non-idempotent operations by default.
  • Do not add retries without jitter and a retry budget.
  • Do not use fallbacks that silently violate business invariants.
  • Do not leave outcome ambiguity unexplained for timed-out state changes.
  • Do not build resilience policies that operators cannot observe.

Quality Bar

A good run of this skill produces an integration policy that fails in controlled, explainable ways. A bad run adds retries and circuit breakers everywhere while increasing duplication, latency, and operational confusion.

kotlin의 다른 스킬

kotlin-backend-jpa-entity-mapping
kotlin
Kotlin의 data class는 DTO에 자연스럽지만 JPA 엔티티에는 위험합니다. Hibernate는 data class가 깨뜨리는 identity 의미론에 의존합니다. 모든 필드에 대한 equals/hashCode는 상태 변경 후 Set/Map 멤버십을 손상시키고, 자동 생성된 copy()는 관리되는 엔티티의 분리된 복제본을 만듭니다.
kotlin-tooling-agp9-migration
kotlin
Android Gradle Plugin 9.0은 동일한 모듈에서 Android 애플리케이션 및 라이브러리 플러그인을 Kotlin Multiplatform 플러그인과 호환되지 않게 만듭니다. 이 스킬은 마이그레이션 과정을 안내합니다.
kotlin-tooling-cocoapods-spm-migration
kotlin
KMP 프로젝트를 CocoaPods(kotlin("native.cocoapods"))에서 Swift Package Manager(swiftPMDependencies DSL)로 마이그레이션 — pod()를 swiftPackage()로 대체,…
kotlin-tooling-immutable-collections-0-5-x-migration
kotlin
Kotlin(및 Java) 코드를 kotlinx.collections.immutable 0.3.x / 0.4.x에서 최신 0.5.x로 마이그레이션합니다. 0.5.x 라인은 모든 복사본을 반환하는 메서드의 이름을 변경합니다…
kotlin-tooling-java-to-kotlin
kotlin
Java 소스 파일을 체계적인 4단계 변환 방법론을 사용하여 관용적인 Kotlin으로 변환하며, 각 단계에서 5가지 불변 조건을 확인합니다. 애노테이션 사이트 대상, 라이브러리 관용구, API 보존을 처리하는 프레임워크 인식 변환을 지원합니다.
kotlin-tooling-native-build-performance
kotlin
Kotlin Multiplatform 프로젝트에서 iOS를 대상으로 할 때 느린 Kotlin/Native 컴파일 및 링크를 진단하고 수정합니다. 사용자가 느린 iOS 또는…을 보고할 때 사용하세요.
kotlin-spring-proxy-compatibility
kotlin
Diagnose and prevent Kotlin plus Spring proxy failures around `@Transactional`, `@Cacheable`, `@Async`, method security, retry, configuration proxies, and JPA…
ci-cd-containerization-advisor
kotlin
재현 가능한 빌드, 이미지 및 배포 파이프라인을 설계합니다. Kotlin 및 Spring 애플리케이션을 대상으로 하며, CI 검증, 계층형 컨테이너, 롤아웃 안전성 등을 포함합니다.