GaiaEx AcademyGaiaEx Academy
Thiết kế RESTful API và tích hợp WebSocket
Lập Trình ViênLập Trình10 min read

Thiết kế RESTful API và tích hợp WebSocket

Xây dựng và sử dụng API dữ liệu thị trường và giao dịch

Chia Sẻ Bài Viết

REST: Tài nguyên và động từ

REST ánh xạ CRUD sang HTTP: GET để đọc, POST để tạo, PATCH để cập nhật một phần, DELETE để xóa. Dùng mã trạng thái một cách trung thực — 200 kèm một JSON lỗi sẽ làm hỏng client.

Đánh phiên bản trong đường dẫn (/v1/), phân trang các danh sách lớn (feed dạng cursor cho các luồng chỉ thêm dữ liệu), và ghi lại tài liệu về các thay đổi phá vỡ tương thích với một cửa sổ ngừng hỗ trợ (deprecation window).

REST vs WEBSOCKET Lệnh vs truyền phát liên tục — hầu hết sàn giao dịch dùng cả hai REST (HTTPS) Yêu cầu → phản hồi → nghỉ Đặt/hủy lệnh, số dư, ảnh chụp trạng thái WebSocket Kênh song công liên tục Giao dịch, delta sổ lệnh, ticker
REST cho các thay đổi trạng thái; WebSocket cho dữ liệu thị trường liên tục — đừng poll sổ lệnh ở tần suất bị hạn chế của HTTP.

Khóa và HMAC

API key nhận diện; secret chứng minh. Đối với các endpoint giao dịch, hãy dùng HMAC trên một chuỗi chuẩn (phương thức + đường dẫn + phần thân + dấu thời gian) để secret không bao giờ đi trên đường truyền. Từ chối các dấu thời gian đã cũ để chặn tấn công lặp lại (replay) — ±30 giây là một cửa sổ phổ biến.

OAuth phù hợp với các ứng dụng bên thứ ba; các bot sàn giao dịch thuần túy thường vẫn dùng key+HMAC. Hạn mức tần suất: hãy chờ đợi 429 và tuân theo Retry-After.

Nâng cấp WebSocket

Phiên làm việc bắt đầu như một HTTP GET với Upgrade: websocket; máy chủ trả về 101 Switching Protocols. Sau đó, các frame rẻ hơn nhiều so với việc lặp lại bắt tay TLS trên polling HTTP.

Các thông điệp đăng ký (subscribe) thường là JSON: phương thức, kênh, và đôi khi là chữ ký xác thực cho các khớp lệnh riêng tư.

Sổ lệnh, giao dịch, khôi phục

Luồng giao dịch là dữ liệu tick; sổ lệnh là ảnh chụp trạng thái (snapshot) + delta kèm số thứ tự (sequence number). Nếu bạn bị mất các số thứ tự, hãy đồng bộ lại từ ảnh chụp trạng thái REST rồi áp dụng các delta có số thứ tự lớn hơn số thứ tự của ảnh chụp.

Heartbeat: gửi ping hoặc chờ ping từ máy chủ; kết nối lại với backoff có độ rung ngẫu nhiên (jitter) để tránh hiện tượng dồn tải hàng loạt (thundering herd).

ĐỒNG BỘ LẠI SỔ LỆNH Khoảng trống số thứ tự nghĩa là sổ lệnh cục bộ của bạn sai cho đến khi được sửa WS rớt Ảnh chụp REST Đăng ký delta chỉ áp dụng nếu seq > snapshot_seq seq: 10421 khoảng trống 10422–10429 snapshot @10429 delta 10430+ Giao dịch trên một sổ lệnh cũ tồi tệ hơn việc dừng báo giá trong một giây
Sau khi mất kết nối: ảnh chụp trạng thái, rồi delta — không bao giờ đoán các mức giá bị thiếu.

GraphQL và OpenAPI

GraphQL cắt giảm việc lấy dữ liệu dư thừa cho các bảng điều khiển (dashboard); nhiều sàn giao dịch vẫn dùng REST cho các đường thực thi giao dịch nóng. Đặc tả OpenAPI (Swagger) hỗ trợ sinh mã (codegen) và kiểm định chất lượng (QA) — giữ các ví dụ có thể sao chép và dán trực tiếp.

Một mẫu tiêu thụ dữ liệu tối giản

Chạy vòng lặp WebSocket trong một task, đẩy các giá gần nhất vào một map an toàn cho đa luồng (thread-safe), phơi ra HTTP cho kiểm tra sức khỏe. Ghi log số lần kết nối lại; cảnh báo khi con số đó tăng vọt.

Đặt các bài kiểm tra ký lệnh và lệch đồng hồ trong CI: một HMAC bị hỏng trong môi trường sản xuất không thể phân biệt được với "thị trường đã di chuyển" cho đến khi bạn kiểm toán log.