โอเพนซอร์สตัวเก็บพฤติกรรมผู้ใช้/อีเวนต์ (Rust) ที่พร้อมใช้งานได้ทันที เบาแต่เร็ว
(github.com/lee-lou2)ถ้าคุณต้องการเก็บพฤติกรรมผู้ใช้หรืออีเวนต์เอง ลองใช้ดูสักครั้งได้เลย (ได้โปรด🙏) รับรองว่าน่าจะพอใจแน่นอน!
ผมได้พัฒนาเว็บเซิร์ฟเวอร์ที่สามารถเก็บข้อมูลได้แบบเบาแต่รวดเร็วด้วย Rust
โค้ดค่อนข้างเรียบง่าย ดังนั้นแม้จะไม่คุ้นเคยกับ Rust ก็สามารถปรับแต่ง เช่น แก้ไขโค้ด ได้ไม่ยาก (ถ้าจำเป็น ผมช่วยแก้บางส่วนให้ได้ 🥳)
ตัวเก็บอีเวนต์ถูกออกแบบไว้ดังนี้
สเปกทางเทคนิค
- ภาษาในการพัฒนา : rust(axum)
- ที่เก็บข้อมูล : เก็บอีเวนต์ (OpenSearch), เก็บข้อมูลค้างรอ (Sqlite3)
มีแผนจะเพิ่มให้รองรับที่เก็บข้อมูลอื่น ๆ ได้ด้วย
โครงสร้างระบบ
ประเภทของ API
- GET /ping : ตรวจสอบสถานะระบบ
- 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 ความคิดเห็น
แผนภาพโครงสร้างระบบ: https://github.com/lee-lou2/rust-events/blob/main/docs/flowchart.png