Reactive Programming เบื้องต้นสำหรับ Spring WebFlux

Sharing is caring!

ในยุคที่เว็บแอปพลิเคชันต้องรองรับผู้ใช้งานจำนวนมาก ความสามารถในการประมวลผลแบบ asynchronous และ non-blocking กลายเป็นสิ่งจำเป็น การเขียนโปรแกรมแบบ Reactive จึงเข้ามามีบทบาท และ Spring WebFlux เป็นหนึ่งในเครื่องมือสำคัญที่ใช้แนวคิดนี้อย่างเต็มรูปแบบ

Reactive Programming คืออะไร?

Reactive Programming เป็น paradigm ในการพัฒนาโปรแกรมที่เน้นการตอบสนองต่อ event หรือข้อมูลที่ไหลเข้ามาแบบต่อเนื่อง โดยที่ระบบสามารถประมวลผลได้แม้ในขณะรอข้อมูลหรือ event จากภายนอก คอนเซ็ปต์หลักประกอบด้วย:

  • Asynchronous: ไม่บล็อก thread รอผลลัพธ์
  • Event-driven: ตอบสนองต่อ event ที่เกิดขึ้น
  • Backpressure: ควบคุมการไหลของข้อมูลเพื่อไม่ให้ overload
  • Data Streams: ทำงานกับข้อมูลในรูปแบบ stream ต่อเนื่อง

ภาพประกอบ: แนวคิด Reactive Streams

ใน Reactive Streams มี 4 องค์ประกอบสำคัญ:

  • Publisher: แหล่งข้อมูล เช่น database หรือ external API
  • Subscriber: ผู้รับข้อมูล เช่น component UI หรือ service
  • Subscription: ตัวควบคุมการเชื่อมต่อ
  • Processor: ตัวกลางที่สามารถเป็นทั้ง Publisher และ Subscriber

Spring WebFlux กับ Reactive Programming

Spring WebFlux รองรับ reactive โดยใช้ Project Reactor เป็น engine หลัก ซึ่งมี 2 class สำคัญคือ:

  • Mono<T>: แสดงค่าหรือ error เพียงหนึ่งค่า
  • Flux<T>: แสดงค่าหลายค่าหรือ stream ของข้อมูล

ตัวอย่าง: Mono และ Flux

Mono<String> mono = Mono.just("Hello");
Flux<String> flux = Flux.just("A", "B", "C");
  

ตัวอย่าง Controller แบบ Reactive

@RestController
public class HelloController {

  @GetMapping("/mono")
  public Mono<String> mono() {
    return Mono.just("Hello Mono");
  }

  @GetMapping("/flux")
  public Flux<String> flux() {
    return Flux.just("Spring", "Web", "Flux");
  }
}
  

การใช้งาน RouterFunction แบบ Functional

WebFlux รองรับการเขียน routing แบบ functional style ด้วย:

@Configuration
public class RouterConfig {
  @Bean
  public RouterFunction<ServerResponse> route() {
    return RouterFunctions.route(GET("/hello"),
      req -> ServerResponse.ok().bodyValue("Hello WebFlux"));
  }
}
  

ข้อดีของ Reactive Programming

  • ประหยัด thread และ resource
  • รองรับ concurrent user ได้มากขึ้น
  • เหมาะกับระบบที่มี latency สูง เช่น call external API
  • ปรับตัวได้กับ system ที่ใช้ stream data เช่น IoT

ข้อเสียของ Reactive Programming

  • Debugging ยากกว่าระบบ synchronous
  • ต้องเปลี่ยน mindset จาก imperative เป็น reactive
  • บาง library ยังไม่รองรับ reactive อย่างเต็มที่

Reactive กับ Blocking ต่างกันอย่างไร?

คุณสมบัติBlocking (Spring MVC)Reactive (WebFlux)
Thread per requestใช่ไม่
Scalabilityจำกัดด้วย threadสูงมาก
เหมาะกับCRUD applicationStreaming, Real-time app

เมื่อไรควรใช้ Reactive Programming?

  • ระบบต้องรองรับ concurrent connection หลายพันราย
  • ต้อง call external system บ่อย เช่น REST API หรือ Database
  • ระบบมี flow ของข้อมูลแบบ stream เช่น live feed, sensor

แหล่งเรียนรู้เพิ่มเติม

สรุป

การเข้าใจ Reactive Programming เป็นพื้นฐานสำคัญในการใช้งาน Spring WebFlux อย่างมีประสิทธิภาพ หากคุณกำลังพัฒนาแอปพลิเคชันสมัยใหม่ที่เน้นความเร็ว ขนาด และความสามารถในการตอบสนองสูง การเปลี่ยนจาก MVC สู่ Reactive คือก้าวสำคัญในการออกแบบระบบแห่งอนาคต


Leave a Reply

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