9 điểm bởi leelou2 2025-01-09 | 1 bình luận | Chia sẻ qua WhatsApp

Nếu bạn cần tự thu thập hành vi người dùng hoặc chính các sự kiện, hãy thử ít nhất một lần nhé (xin đó🙏) Chắc chắn bạn sẽ hài lòng!

Tôi đã phát triển một web server bằng Rust có thể thu thập dữ liệu theo cách nhẹ nhưng nhanh.

Vì code đơn giản nên ngay cả những người chưa quen với Rust cũng có thể dễ dàng tùy biến như sửa đổi mã nguồn, v.v. (nếu cần tôi cũng có thể hỗ trợ chỉnh sửa một phần 🥳)

Bộ thu thập sự kiện được triển khai như sau:

Thông số kỹ thuật

  • Ngôn ngữ phát triển: rust(axum)
  • Kho lưu trữ: lưu sự kiện (OpenSearch), lưu dữ liệu chờ (Sqlite3)

Dự kiến sẽ bổ sung để có thể dùng với các kho lưu trữ khác nữa.

Kiến trúc hệ thống

Các loại API

  1. GET /ping : kiểm tra tình trạng
  2. POST /events : thu thập sự kiện

Dữ liệu thu thập

  • Thông tin người dùng từ token có trong Headers
  • Thông tin thiết bị/ứng dụng có trong Headers
  • Thông tin chi tiết sự kiện có trong Body

Có thể chỉnh sửa đơn giản chỉ bằng cách thay đổi schema 👍

Chi tiết kỹ thuật

Cấu hình cơ bản (mô tả ngắn)

  • 100.000 channel: đóng vai trò chuyển tiếp các sự kiện đã nhận đến consumer; nếu cả 100.000 channel đều đầy thì lưu sự kiện vào cơ sở dữ liệu chờ
  • 10 thread + consumer: nhận sự kiện từ channel, gom thành từng lô 1.000 bản ghi hoặc lưu các sự kiện tích lũy trong 10 giây vào OpenSearch
  • 1 scheduler: gọi các sự kiện đã lưu trong cơ sở dữ liệu chờ theo chu kỳ thời gian nhất định rồi chuyển lại vào channel

Yêu cầu tạo dữ liệu (http)

  • Gửi yêu cầu tạo dữ liệu qua http api
  • Khi nhận yêu cầu sẽ chuyển vào channel; nếu channel đều đầy thì lưu vào cơ sở dữ liệu chờ

Consumer sự kiện (10 thread nhẹ)

  • Lấy sự kiện từ channel, gom 1.000 bản ghi rồi gửi yêu cầu đăng ký hàng loạt vào OpenSearch
  • Nếu chưa đủ 1.000 bản ghi thì cứ mỗi 10 giây sẽ đăng ký hàng loạt các sự kiện đã tích lũy vào OpenSearch
  • Nếu đăng ký vào OpenSearch thất bại thì lưu vào cơ sở dữ liệu chờ

Đăng ký sự kiện chờ (Sqlite3)

  • Khi channel đầy hoặc phát sinh lỗi khi đăng ký vào OpenSearch thì lưu vào cơ sở dữ liệu chờ

Scheduler

  • Truy vấn các sự kiện tích trong cơ sở dữ liệu chờ theo chu kỳ nhất định rồi chuyển vào channel
  • Sau này, với các sự kiện tiếp tục tích lũy liên tục hoặc các sự kiện không thể lưu vào OpenSearch do vấn đề dữ liệu, dự kiến sẽ bổ sung xử lý riêng

Số lượng channel hay số thread nhẹ cần được điều chỉnh theo tài nguyên của môi trường triển khai hoặc loại OpenSearch đang dùng 💪

Tôi mới học Rust được khoảng 2~3 tháng nên cú pháp có thể còn hơi vụng; tôi sẽ tiếp tục cải thiện đều đặn.

Mong nhận được nhiều sự quan tâm và cả những phản hồi đa dạng nữa~~~
Xin cảm ơn 🙇‍♂️

1 bình luận

 
leelou2 2025-01-09