Files
huanld 1018ff97dc
Release pipeline / Get version (push) Has been cancelled
Release pipeline / Get Chart Name (push) Has been cancelled
Release pipeline / tests (push) Has been cancelled
Release pipeline / builds (push) Has been cancelled
Release pipeline / builds-ghcr (push) Has been cancelled
Release pipeline / test-deployments (push) Has been cancelled
Release pipeline / deploy (push) Has been cancelled
Release pipeline / Helm chart oci (push) Has been cancelled
Release pipeline / npm (push) Has been cancelled
Release pipeline / snyk (push) Has been cancelled
docs: add comprehensive business logic and architecture documentation
2026-04-16 08:06:15 +07:00
..

Microservices Architecture (Speckle Automation/Workers)

Ngoài ứng dụng tải API chính (packages/server), Speckle tách các tiến trình chạy nặng phần CPU / IO ra thành nhiều Microservices chạy độc lập, giao tiếp với nhau bằng Redis hoặc Polling Database. Nếu một service sập, core API vẫn hoạt động bình thường.

1. Cơ chế giao tiếp cốt lõi

Hầu hết các services này không lắng nghe API HTTP request từ User. Thay vào đó, nó lắng nghe Events. Ví dụ: Khi User tạo một Commit mới ở main server, main server bắn một event vào Redis Pub/Sub hoặc Bull Queue. Microservice "ứng trực" ở Queue đó sẽ chộp lấy và xử lý công việc mất nhiều thời gian.

2. Preview Service (Chụp ảnh 3D)

Nằm tại packages/preview-service.

  • Mục tiêu: Tránh việc phải tải cục thiết kế 3D nặng 50MB chỉ để thấy cái thumbnail.
  • Tiến trình:
    1. Lắng nghe event commit_created.
    2. Bật một trình duyệt Headless (Puppeteer) ngầm.
    3. Load packages/viewer trong tab ẩn.
    4. Stream dữ liệu object xuống viewer, cho camera tự động căn giữa (Focus/Zoom extent) toàn bộ toà nhà.
    5. Gọi hàm chụp lại canvas của ThreeJS (Screenshot to base64 buffer), sau đó bắn ảnh này lưu vào Database/S3 với nhãn là thumbnail của commit đó.

3. Webhook Service

Nằm tại packages/webhook-service.

  • Mục tiêu: Khi có thay đổi mô hình, cần Notify sang Slack, Zalo, hoặc Trigger Pipeline hệ thống công ty XYZ.
  • Tại sao cần tách ra?: Người dùng có thể cấu hình URL của webhook đến 1 server chậm/chết. Nếu để Server chính chờ timeout sẽ treo Thread Nodejs.
  • Tiến trình: Service bắt event -> bốc HTTP Request (axios/fetch) đẩy dữ liệu -> Retry nếu lỗi (Exponential backoff) thông qua bull Queue.

4. Fileimport / IFC Import Service

Nằm tại packages/fileimport-service & packages/ifc-import-service.

  • Mục tiêu: Speckle sinh ra là để xử lý plugin Native (Revit, Rhino, AutoCad trực tiếp gửi lên thẳng bằng C# SDK). Tuy nhiên nếu dev/người dùng đẩy trực tiếp 1 file IFC thô hoặc OBJ/STL lên Web Upload, hệ thống cần convert.
  • Tiến trình:
    1. User upload file tĩnh lên /api/stream/..
    2. Main server ném file vào MinIO/Blob sau đó lưu event "Bắt đầu convert".
    3. ifc-import-service đọc Blob về, phân tích file IFC (Dùng thư viện WebAssembly hoặc bin parser như web-ifc).
    4. Dịch các entity IFC ngược lại thành cây Speckle JSON Objects và sau đó push lại vào Main Server.

5. Portability Note (Viết Lại Các Service)

  • Mảng micro-service này là thứ Dễ đổi/rewrite nhất.
  • Bất cứ ngôn ngữ nào (Python, Go, Rust) kết nối được vào Postgres / Redis của Speckle là lập tức có thể Code ngay một worker ngầm (VD: Viết một service AI bằng Python tự động đọc hình học Speckle và gửi cảnh báo thiết kế sai). Kiến trúc Event-driven và DB share này hoàn toàn lỏng lẻo. Cực kỳ có lợi để team mở rộng logic ngoài lề (Automate).