การจัดการ Timeout และ Retry ใน WebFlux

Sharing is caring!

Spring WebFlux เป็นเทคโนโลยีสำหรับเขียนแอปพลิเคชันแบบ Reactive ที่ไม่บล็อก thread ขณะประมวลผล ซึ่งเหมาะกับระบบที่ต้องการความเร็วสูงและรองรับผู้ใช้จำนวนมาก การจัดการ Timeout และ Retry จึงเป็นสิ่งสำคัญเพื่อให้ระบบทำงานได้อย่างเสถียรเมื่อเกิดปัญหา เช่น เซิร์ฟเวอร์ล่าช้า หรือการเชื่อมต่อล้มเหลว

📌 ความสำคัญของ Timeout และ Retry

  • Timeout ป้องกันไม่ให้ request ค้างนานจนกิน resource
  • Retry เพิ่มโอกาสสำเร็จเมื่อเกิดความผิดพลาดชั่วคราว เช่น network error

🧪 การใช้ Timeout ใน Mono / Flux

Mono Timeout

Mono.just("data")
    .delayElement(Duration.ofSeconds(5))
    .timeout(Duration.ofSeconds(3))
    .onErrorResume(TimeoutException.class, e -> Mono.just("Timeout fallback"));

Flux Timeout

Flux.interval(Duration.ofSeconds(2))
    .take(5)
    .timeout(Duration.ofSeconds(1))
    .onErrorResume(TimeoutException.class, e -> Flux.just(-1L));

🌐 การจัดการ Timeout ใน WebClient

ระดับ TCP (Network Level)

HttpClient httpClient = HttpClient.create()
    .responseTimeout(Duration.ofSeconds(3));

WebClient webClient = WebClient.builder()
    .clientConnector(new ReactorClientHttpConnector(httpClient))
    .build();

ระดับ Mono

webClient.get()
    .uri("/api/slow")
    .retrieve()
    .bodyToMono(String.class)
    .timeout(Duration.ofSeconds(2))
    .onErrorResume(TimeoutException.class, e -> Mono.just("Timeout fallback"));

🔁 การใช้ Retry ใน Reactive

Retry ปกติ

Mono.fromCallable(() -> unstableOperation())
    .retry(3);

Retry แบบ Delay

Mono.fromCallable(() -> unstableOperation())
    .retryWhen(Retry.fixedDelay(3, Duration.ofSeconds(2)));

Retry แบบ Backoff และมีเงื่อนไข

Mono.fromCallable(() -> unstableOperation())
    .retryWhen(Retry.backoff(3, Duration.ofSeconds(1))
        .filter(ex -> ex instanceof IOException)
        .onRetryExhaustedThrow((spec, signal) -> signal.failure()));

📊 ตารางสรุป Retry

รูปแบบพฤติกรรม
retry(n)Retry ทันที n ครั้ง
retryWhen(fixedDelay)Retry ทุก n วินาที
retryWhen(backoff)Retry โดยเพิ่มเวลาทุกครั้ง (Exponential)

📉 ภาพประกอบ Timeout/Retry Flow

⚠️ คำแนะนำในการใช้ Timeout/Retry

  • หลีกเลี่ยงการ retry โดยไม่จำกัดเวลา เพราะอาจเกิด retry storm
  • ตั้ง timeout ที่เหมาะสมตาม SLA ของ backend
  • ใช้ onErrorResume เพื่อควบคุม fallback
  • ระวังเรื่อง rate limit หาก retry หลายครั้งเกินไป

🔍 คำค้น SEO

WebFlux Timeout, WebFlux Retry, Spring WebFlux Timeout Retry, Reactor Retry, WebClient Timeout Handling, Mono Timeout Fallback, Retry Backoff Reactor, Spring Reactive Timeout, Resilient Reactive Service

Leave a Reply

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *