ถ้าคุณกำลังเริ่มต้นกับการเขียนโปรแกรมแบบ Reactive บน Spring WebFlux คุณคงเคยเห็นคำว่า Mono และ Flux ผ่านตามาบ้าง ทั้งสองคลาสนี้เป็นหัวใจสำคัญของ Project Reactor ที่ใช้สำหรับจัดการ asynchronous data stream ใน Spring WebFlux บทความนี้จะพาคุณไปรู้จักกับพฤติกรรม ความสามารถ และวิธีใช้งาน Mono และ Flux พร้อมตัวอย่างแบบเข้าใจง่าย
Reactive Programming คืออะไร (สั้น ๆ)
เป็นแนวทางการเขียนโปรแกรมที่เน้นการตอบสนองต่อข้อมูลหรือ event ที่เกิดขึ้นต่อเนื่องแบบ real-time และ asynchronous ซึ่งช่วยให้เราสามารถประมวลผลได้โดยไม่ต้อง block thread ที่ใช้งานอยู่
Mono คืออะไร?
Mono คือ Publisher ที่ส่งค่าหนึ่งค่าหรือไม่ส่งค่าใด ๆ เลย (0 หรือ 1 ค่า)
เหมาะกับ API ที่ส่งข้อมูลเพียงรายการเดียว เช่น การโหลด user จาก ID
ตัวอย่างการใช้งาน Mono
Mono<String> mono = Mono.just("Hello WebFlux"); mono.subscribe(System.out::println); // พิมพ์ Hello WebFlux
Mono กับ HTTP Response
@GetMapping("/mono") public Mono<String> helloMono() { return Mono.just("Hello from Mono"); }
Flux คืออะไร?
Flux คือ Publisher ที่สามารถส่งค่าหลายค่าได้ (0 ถึง n ค่า)
เหมาะกับข้อมูลแบบ stream หรือรายการ เช่น รายการ product, log, หรือข้อมูล sensor ต่อเนื่อง
ตัวอย่างการใช้งาน Flux
Flux<String> flux = Flux.just("A", "B", "C"); flux.subscribe(System.out::println); // พิมพ์ A, B, C
Flux กับ HTTP Response
@GetMapping("/flux") public Flux<String> helloFlux() { return Flux.just("Spring", "Web", "Flux"); }
เปรียบเทียบ Mono vs Flux
คุณสมบัติ | Mono | Flux |
---|---|---|
จำนวนข้อมูล | 0 หรือ 1 ค่า | 0 หรือมากกว่าค่า |
เหมาะกับ | ค่าที่มีเพียงรายการเดียว เช่น user | รายการข้อมูล เช่น รายการสินค้า |
พฤติกรรม | จบการทำงานเมื่อส่งข้อมูลหรือ error | ส่งหลายค่าและจบเมื่อครบ หรือเกิด error |
ภาพประกอบ: การแสดงผล Mono และ Flux

การแปลงค่าผ่าน Mono/Flux
สามารถใช้ method เช่น map()
, flatMap()
, filter()
เพื่อจัดการข้อมูลใน stream
Mono<String> name = Mono.just("John"); Mono<String> upper = name.map(String::toUpperCase); // จะได้ "JOHN"
Flux<Integer> numbers = Flux.range(1, 5); Flux<Integer> even = numbers.filter(n -> n % 2 == 0); // จะได้ 2, 4
การหน่วงเวลา (Delay)
Flux<Long> delayed = Flux.interval(Duration.ofSeconds(1)).take(5); // ส่งค่า 0,1,2,3,4 ทุกวินาที
เมื่อไรควรใช้ Mono/Flux?
- Mono: ค่าที่ดึงจากฐานข้อมูล เช่น ID หรือ Config เดี่ยว
- Flux: ข้อมูลรายการ เช่น list, streaming, หรือ websocket
แหล่งเรียนรู้เพิ่มเติม
สรุป
Mono และ Flux คือเครื่องมือหลักในการจัดการข้อมูลแบบ asynchronous ในโลกของ reactive programming โดย Mono เหมาะกับข้อมูล 1 ค่า ส่วน Flux เหมาะกับหลายค่า การเข้าใจพฤติกรรมและการใช้งานของทั้งสอง จะทำให้คุณสามารถพัฒนา API ที่รองรับผู้ใช้จำนวนมาก มีประสิทธิภาพ และ scale ได้ดีในระบบจริง