เปลี่ยนระบบให้ Real-time ด้วย Firebase Database

การทำระบบ Real-time นั้น อาจจะดูเหมือนง่าย แต่ทำจริงแล้วไม่ง่ายเลย

แค่ implement socket เอง ยากตรงไหน… แล้วถ้า client เน็ตหลุด, sleep คอม เปิดมาแล้วจะทำยังไงให้ข้อมูล sync กันอยู่ ?

จึงไม่ง่ายเลย ที่จะทำระบบ real-time เพราะอาจจะต้องคิดถึงในกรณีพวกนี้ด้วย

แต่มีระบบอยู่แล้ว รันได้อยู่แล้ว จะให้ย้าย data ไปไว้บน firebase database หรอ ? แถมบน firebase database รัน query ที่ซับซ้อนไม่ได้อีก…

ก็ไม่ต้องย้ายครับ แต่แทนที่จะส่งไปบอก socket ก็ส่งไปบอก firebase แทน…

ลองดูตัวอย่างง่าย ๆ ครับ

ผมมี api อยู่แบบนี้

GET /resource
POST /resource
GET /resource/:id
PUT /resource/:id
DELETE /resource/:id

วิธีที่ 1

ปกติเวลา create หรือ update resource เราจะใส่ค่าลงใน field updatedAt เป็นเวลาที่ update ใช่ไหมครับ เราก็แค่เอาเวลาตรงนี้ไปใส่ใน firebase database เช่น

/resource/timestamp

/resource/:id/timestamp

หรืออาจจะลบ /resource/:id ออกเลย เมื่อมีการลบ data ออก

คราวนี้บน client เราก็แค่ onValue ไว้บน resource ที่สนใจ เมื่อค่าเปลี่ยน ก็ส่ง request ไปดึง data จาก api

วิธีที่ 2

เมื่อมีการเปลี่ยน data เราก็อาจจะ push เป็น changelog ไว้เก็บไว้ใน firebase database เช่น

Push /change

{
"ns": "resource",
"type": "update",
"id": 10,
"timestamp": 1481540679031
}

แล้วให้ client onChildAdded (หรือ query ด้วย) ไว้ที่ /change พอมี data ที่สนใจ ก็ดูตาม type ถ้าเป็น create หรือ update ก็ส่ง request ไปขอ data จาก api ถ้าเป็น delete ก็ลบ data ออก (แล้วก็อาจจะลบ changelog เก่า ๆ ออกไปบ้าง เพื่อประหยัดเนื้อที่)


ทั้งสองวิธีนี้เป็นวิธีที่คิดขึ้นมาเล่น ๆ นะครับ ยังเป็น experiment อยู่ ถ้าใครมีวิธีที่ดีกว่านี้ก็เอามาแชร์ได้นะครับ ผมจะได้เอามาใช้ด้วย

Like what you read? Give acoshift a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.