SEND_MESSAGE
Tổng quan luồng xử lý
Luồng gửi tin nhắn trong hệ thống CS chủ yếu đi qua giao thức WebSocket để đảm bảo tính realtime.
Client (SDK/Frontend) gửi tin nhắn qua WebSocket tới
cs-chat-realtime-svc.
cs-chat-realtime-svc tiếp nhận, validate và chuyển tiếp sự kiện tới
cs-event-center-svc.
cs-event-center-svc đẩy sự kiện vào Kafka.
cs-consumer đọc Kafka và gọi sang
cs-chat-storage-svcđể lưu trữ.
cs-chat-storage-svc lưu tin nhắn vào Database (MongoDB) và phát tán sự kiện (Socket, Sync ES) để các bên khác nhận được tin nhắn.
Chi tiết từng bước
1. Tiếp nhận tin nhắn: cs-chat-realtime-svc
Giao thức: WebSocket.
Vị trí xử lý: internal/controller/websocket/send_message.go.
Logic:
Hàm processSendMessage nhận payload từ client.
Validate dữ liệu (độ dài, loại tin nhắn...).
Gọi
chatSvc.SendMessage.
Tại internal/usecase/chat.go:
Sinh
MessageIDmới từ
sequence-svc.
Đóng gói dữ liệu thành
KafkaEventProcessSendMessage.
Gọi gRPC sang
cs-event-center-svc(hàm EventProcessing).
2. Điều phối sự kiện: cs-event-center-svc
Giao thức: gRPC.
Vị trí xử lý: internal/controllerrpc/event_processing/rpc_event_processing.go.
Logic:
Nhận request EventProcessing.
Xác định Kafka Topic đích dựa trên EventType (ở đây là ProcessSendMessage) và Cid (Company ID).
Đẩy message vào Kafka Topic tương ứng.
3. Xử lý logic nghiệp vụ: cs-consumer
Giao thức: Kafka Consumer.
Vị trí xử lý: internal/controller/event/send_message.go -> internal/logic/event/message.go.
Logic:
Consume message từ Kafka.
Hàm ProcessSendMessage chuyển đổi dữ liệu sang định dạng Protobuf.
Gọi gRPC sang
(hàm SendMessages).
4. Lưu trữ & Phân phối: cs-chat-storage-svc
Giao thức: gRPC Server.
Vị trí xử lý: internal/controller/grpc/message.go -> internal/usecase/message.go.
Logic:
Lưu DB: Hàm SendMessages gọi
để lưu tin nhắn vào MongoDB.
Hậu xử lý (Post Process):
Đẩy sự kiện để tính toán thống kê (Conversation Stats).
Đồng bộ dữ liệu sang ElasticSearch (
-> Kafka ->
hoặc tương tự) để phục vụ tìm kiếm.
Thông báo Realtime:
Hàm publishSocketSendMessageEvents tạo payload socket.
Gửi lại
để đẩy vào luồng Socket (Redis Pub/Sub), từ đó
sẽ push xuống các client khác đang online trong hội thoại.
Last updated