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