API Events
Outreach không có Kafka và không có BullMQ. Nó chỉ là một nguồn event qua WebSocket. Event bất đồng bộ duy nhất nó phát ra là bản phát
INQUIRY_SUBMITTEDtheo thời gian thực tới các phòng quan sát của admin.
1. Inbound - Kafka
Không. Outreach không chạy Kafka consumer.
2. Outbound - Kafka
Không. Outreach không tạo Kafka event. Hệ thống phía sau nếu cần dữ liệu yêu cầu thì poll REST API hoặc đăng ký qua WebSocket.
3. Inbound - BullMQ
Không. Không có queue worker.
4. Outbound - BullMQ
Không. Không enqueue job nào.
5. WebSocket Emissions
| Topic (path) | Phòng | Kích hoạt khi | Emitter |
|---|---|---|---|
observation/outreach/inquiry/submitted | outreach/inquiries, outreach/inquiries/{id} | POST /inquiries/submit thành công | OutreachSocketEventService.notifyInquirySubmitted() |
| Thuộc tính | Giá trị |
|---|---|
| Emitter identifier | outreach-ws-emitter (tên kết nối Redis outreach-ws-redis) |
| Backend | WebSocketEmitter dựa trên Redis (single hoặc cluster qua APP_ENV_WEBSOCKET_REDIS_MODE) |
| Topic builder | WebSocketTopics.build({ paths: ['observation','outreach','inquiry','submitted'] }) |
| Room builder | WebSocketRooms.build({ paths: ['outreach','inquiries'(, id)] }) |
| Giao nhận | Fire-and-forget; có kiểm tra isReady(); dùng Promise.allSettled để một phòng lỗi không làm hỏng phần còn lại |
6. Payload Schemas
// observation/outreach/inquiry/submitted
export interface InquirySubmittedMessage {
id: string; // inquiry id (Snowflake)
type: string; // giá trị InquiryTypes, ví dụ "200_SALES"
firstName: string;
lastName: string | null;
email: string;
businessName: string | null;
subject: string | null;
createdAt: string; // ISO timestamp
}Nguồn chuẩn:
packages/outreach/src/components/websocket/socket-event.service.ts. Không có entry trongpackages/core/src/models/messages/- đây là payload chỉ dành cho WS.
7. Idempotency & Ordering
| Kênh | Giao nhận | Thứ tự | Khôi phục |
|---|---|---|---|
observation/outreach/inquiry/submitted | tối đa một lần (best-effort, không await) | không | không - client lấy lại qua GET /inquiries nếu bỏ lỡ một event |
Việc phát WS cố tình chấp nhận mất mát: yêu cầu đã được lưu trước khi thông báo chạy, nên database là bản ghi bền vững. Một WS event bị rớt chỉ làm chậm toast theo thời gian thực của admin, không bao giờ làm mất dữ liệu.