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.

  1. Client (SDK/Frontend) gửi tin nhắn qua WebSocket tới

    cs-chat-realtime-svc

    .

  2. cs-chat-realtime-svc tiếp nhận, validate 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 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

        MessageID

        mớ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