ทำความรู้จักกับ Mono และ Flux

Sharing is caring!

ถ้าคุณกำลังเริ่มต้นกับการเขียนโปรแกรมแบบ 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

คุณสมบัติMonoFlux
จำนวนข้อมูล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 ได้ดีในระบบจริง


Leave a Reply

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