9 คะแนน โดย leelou2 2025-01-09 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

ถ้าคุณต้องการเก็บพฤติกรรมผู้ใช้หรืออีเวนต์เอง ลองใช้ดูสักครั้งได้เลย (ได้โปรด🙏) รับรองว่าน่าจะพอใจแน่นอน!

ผมได้พัฒนาเว็บเซิร์ฟเวอร์ที่สามารถเก็บข้อมูลได้แบบเบาแต่รวดเร็วด้วย Rust

โค้ดค่อนข้างเรียบง่าย ดังนั้นแม้จะไม่คุ้นเคยกับ Rust ก็สามารถปรับแต่ง เช่น แก้ไขโค้ด ได้ไม่ยาก (ถ้าจำเป็น ผมช่วยแก้บางส่วนให้ได้ 🥳)

ตัวเก็บอีเวนต์ถูกออกแบบไว้ดังนี้

สเปกทางเทคนิค

  • ภาษาในการพัฒนา : rust(axum)
  • ที่เก็บข้อมูล : เก็บอีเวนต์ (OpenSearch), เก็บข้อมูลค้างรอ (Sqlite3)

มีแผนจะเพิ่มให้รองรับที่เก็บข้อมูลอื่น ๆ ได้ด้วย

โครงสร้างระบบ

ประเภทของ API

  1. GET /ping : ตรวจสอบสถานะระบบ
  2. POST /events : เก็บอีเวนต์

ข้อมูลที่เก็บ

  • ข้อมูลผู้ใช้จากโทเคนที่อยู่ใน Headers
  • ข้อมูลอุปกรณ์/แอปที่อยู่ใน Headers
  • รายละเอียดอีเวนต์ที่อยู่ใน Body

ปรับแก้ได้ง่ายเพียงเปลี่ยนสคีมา 👍

รายละเอียดทางเทคนิค

โครงสร้างพื้นฐาน (คำอธิบายแบบง่าย)

  • 100,000 channels : ทำหน้าที่ส่งต่ออีเวนต์ที่รับเข้ามาไปยัง consumer หากทั้ง 100,000 channels เต็ม จะบันทึกอีเวนต์ไว้ในฐานข้อมูลค้างรอ
  • 10 threads + consumer : รับอีเวนต์จาก channels แล้วรวมเป็นชุดละ 1,000 รายการ หรืออีเวนต์ที่สะสมในช่วง 10 วินาที ก่อนบันทึกลง OpenSearch
  • 1 scheduler : ดึงอีเวนต์ที่เก็บไว้ในฐานข้อมูลค้างรอตามรอบเวลา แล้วส่งกลับเข้า channels อีกครั้ง

คำขอสร้างข้อมูล (http)

  • ใช้ http api สำหรับส่งคำขอสร้างข้อมูล
  • เมื่อรับคำขอแล้วจะส่งต่อเข้า channel และถ้า channels เต็มทั้งหมดจะบันทึกลงฐานข้อมูลค้างรอ

event consumer (lightweight thread 10 ตัว)

  • นำอีเวนต์ที่ได้รับจาก channel มารวมเป็นชุดละ 1,000 รายการ แล้วส่งคำขอลงทะเบียนแบบ bulk ไปยัง OpenSearch
  • หากยังไม่ครบ 1,000 รายการ จะลงทะเบียนแบบ bulk ให้กับอีเวนต์ที่สะสมทุก ๆ 10 วินาที
  • หากลงทะเบียนกับ OpenSearch ไม่สำเร็จ จะบันทึกลงฐานข้อมูลค้างรอ

การบันทึก pending event (Sqlite3)

  • หาก channel เต็มหรือเกิดข้อผิดพลาดระหว่างลงทะเบียนกับ OpenSearch จะบันทึกลงฐานข้อมูลค้างรอ

scheduler

  • ตรวจสอบอีเวนต์ที่สะสมอยู่ในฐานข้อมูลค้างรอตามช่วงเวลาที่กำหนด แล้วส่งต่อเข้า channel
  • ในอนาคตมีแผนจะเพิ่มการจัดการแยกสำหรับอีเวนต์ที่สะสมต่อเนื่องหรืออีเวนต์ที่มีปัญหาข้อมูลจนไม่สามารถบันทึกลง OpenSearch ได้

จำนวน channels และจำนวน lightweight threads ควรปรับตามทรัพยากรของสภาพแวดล้อมที่นำไปใช้งานและประเภทของ OpenSearch 💪

ตอนนี้ผมเพิ่งใช้ Rust ได้ราว 2~3 เดือน ไวยากรณ์อาจยังดูไม่ลื่นนัก แต่ตั้งใจจะปรับปรุงอย่างต่อเนื่อง

ฝากติดตามกันด้วยนะครับ และยินดีรับฟีดแบ็กหลากหลายแบบเลย~~~
ขอบคุณครับ 🙇‍♂️

1 ความคิดเห็น

 
leelou2 2025-01-09

แผนภาพโครงสร้างระบบ: https://github.com/lee-lou2/rust-events/blob/main/docs/flowchart.png