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.

  1. Client (SDK/Frontend) gửi sự kiện "Seen" qua WebSocket tới

    cs-chat-realtime-svc

    .

  2. cs-chat-realtime-svc tiếp nhận và chuyển tiếp sự kiện tới

    cs-event-center-svc

    .

  3. cs-event-center-svc đẩy sự kiện vào Kafka.

  4. cs-consumer đọc Kafka và gọi sang

    cs-chat-storage-svc

    để lưu trữ.

  5. 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