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