SEEN_MESSAGE
Tổng quan luồng xử lý
Luồng xử lý "Seen Message" tương tự như "Send Message", đi theo mô hình Store-then-Forward để đảm bảo tính nhất quán.
Client (SDK/Frontend) gửi sự kiện "Seen" qua WebSocket tới
cs-chat-realtime-svc.
cs-chat-realtime-svc tiếp nhận 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 cập nhật trạng thái "Seen" vào Database (MongoDB) và phát tán sự kiện realtime (Socket) để các bên khác biết tin nhắn đã được xem.
Chi tiết từng bước
1. Tiếp nhận sự kiện: cs-chat-realtime-svc
Giao thức: WebSocket.
Vị trí xử lý: internal/controller/websocket/seen_message.go.
Logic:
Hàm processSeenMessage nhận payload từ client.
Validate dữ liệu.
Gọi
chatSvc.SeenMessage.
Tại internal/usecase/chat.go:
Đóng gói dữ liệu thành
KafkaEventProcessSeenMessage.
Gọi gRPC sang
cs-event-center-svc(hàm EventProcessing) với EventType là
KafkaEventTypeProcessSeenMessage.
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 (ProcessSeenMessage) và Cid.
Đẩ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/seen_message.go -> internal/logic/event/message.go.
Logic:
Consume message từ Kafka.
Hàm ProcessSeenMessage chuyển đổi dữ liệu sang định dạng Protobuf.
Gọi gRPC sang
(hàm SeenMessages).
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 SeenMessages (trong usecase) gọi
để cập nhật trạng thái "Seen" cho tin nhắn trong MongoDB.
Thông báo Realtime:
Sau khi lưu thành công, gọi hàm publishSeenMessagesSocketEvents.
Hàm này gọi createSeenMessageSocketPayloads để tạo payload socket (
).
Payload chứa:
,
,
(người xem),
.
Gửi lại
(qua gRPC PublishSocketStreamEvent) để đẩy vào luồng Socket (Redis Stream), từ đó
sẽ push xuống các client khác để cập nhật giao diện (ví dụ: hiện icon "đã xem").
Last updated