ว่าง ๆ เลยมาลองเล่นตัว Spring WebFlux และ R2DBC (Reactive Relational Database Connectivity)
ซึ่งเป็นคู่ขวัญที่ทำงานแบบ non-blocking
นั่นหมายความว่า สามารถรองรับจำนวน concurrent user ได้เยอะขึ้น
รวมทั้งยังมีการใช้งาน CPU และ Memory ที่มีประสิทธิภาพกว่าด้วย
เมื่อเทียบกับ Spring boot + REST + JDBC/JPA ปกติ
ดังนั้นลองมาเล่นเพื่อทำความรู้จักกันหน่อย

โดยที่ Spring WebFlux น่าจะอธิบายด้วยภาพนี้

ความแตกต่างระหว่าง Reactive vs Servlet

ซึ่งทำงานแบบ Non-blocking
ดังนั้นถ้ามีการเชื่อมต่อไปยัง Database ก็น่าจะเป็น Non-blocking เช่นกัน
นั่นก็คือต้องทำงานผ่าน R2DBC นั่นเอง
โดยที่มี database ไม่กี่ตัวที่สนับสนุน
หนึ่งในนั้นคือ PostgreSQL จึงเป็นที่มาของการใช้ใน blog นี้นั่นเอง

เป้าหมายของ blog นี้คือ

  • เรียนรู้เริ่มต้นกับ Spring WebFlux
  • ลองใช้งาน Spring Data R2DBC

เริ่มด้วยการสร้าง project จากที่เดิม คือ  Spring Initializr

จากนั้นก็สร้าง Controller และ Repository ตามขั้นตอน

แต่เราจะใช้ Spring WebFlux + Spring Data R2DBC แทน
Code ตัวอย่างไปดูเพิ่มได้ที่ GitHub:: Up1

ตัวอย่างของ Controller ที่ใช้งาน Spring WebFlux

สิ่งที่เราเขียนใน Controller นั้นจะเรียกว่า Publisher

โดยจะมี implementation 2 ตัวคือ Mono กับ Flux จาก code ข้างต้น สำหรับผมจะงงว่า Mono มันต่างจาก Flux อย่างไร ? เพื่อให้เข้าใจง่าย ๆ คือ

  • Mono สำหรับการ return ข้อมูล 0  หรือ 1 อย่าง
  • Flux  สำหรับการ return ข้อมูล 0  หรือ มากกว่า 1 อย่าง เช่นพวก List อะไรพวกนี้

1. Mono

2. Flux

จากนั้นลองทำการ run
พบว่า start ได้แม้ยังไม่ได้ทำการ start database server !!
เพียงเท่านี้ก็ใช้งานได้แบบง่าย ๆ แล้ว

สุดท้ายมาดูผลการทำงานหน่อย

  • R2DBC นั้นมี database ที่รองรับไม่เยอะ ตัวอย่างที่ใช้งานคือ PostgreSQL
  • ใน Spring Data Reactive ทำงานกับ Spring WebFlux ได้เลย คือ MongoDB, Redis, Cassandra และ Couchbase เป็นต้น
  • ที่สำคัญ JDK มี Loom project ที่น่าจะมาใน JDK 15 นั้นมี Java Fibers อาจจะทำให้อนาคตของ R2DBC เปลี่ยนไปก็ได้
  • R2DBC ยังไม่สามารถทำงานร่วมกับ JPA ได้ จึงมี Spring Data R2DBC ให้ใช้งาน
  • การทำงานของ Spring WebFlux + R2DBC จะทำงานได้ดี ใช้ resource มีประสิทธิภาพเมื่อจำนวน concurrent สูง จากการทดสอบจะแตกต่างเมื่อมี concurrent 200 ขึ้นไป ทั้ง response time, CPU/memory usage