AssignAgent

Tổng quan luồng xử lý

  1. Trigger: Có thể từ nhiều nguồn (ví dụ: User chat tin nhắn đầu tiên, User bấm nút "Gặp nhân viên", hoặc hệ thống tự động trigger khi có hội thoại mới).

  2. cs-event-center-svc: Nhận sự kiện cần Assign Agent và đẩy vào Kafka.

  3. cs-consumer: Đọc Kafka Topic AssignAgent.

  4. cs-consumer: Gọi sang

    cs-chat-storage-svc

    để thực hiện logic chọn Agent và gán vào hội thoại.


Chi tiết từng bước

1. Trigger & Event Center

  • Sự kiện AssignAgent được đẩy vào Kafka (Topic AssignAgent hoặc tương tự).

  • Payload chứa Cid (Company ID) và các thông tin cần thiết.

2. Xử lý tại Consumer: cs-consumer

  • Vị trí: internal/controller/assign_agent/assign_agent.go.

  • Logic:

    • Hàm HandleAssignAgent nhận batch message từ Kafka.

    • Lọc trùng lặp Cid (để tránh xử lý nhiều lần cho cùng 1 công ty trong 1 batch).

    • Sử dụng Worker Pool (mặc định 10 workers) để xử lý song song các yêu cầu Assign Agent.

    • Mỗi worker gọi hàm

      service.Conversation().AssignAgent(ctx, m)

      .

3. Logic Assign Agent: cs-consumer -> cs-chat-storage-svc

  • Vị trí: internal/logic/conversation/assign_process.go.

  • Logic:

    • Hàm assignConversation duyệt qua danh sách các hội thoại cần assign.

    • Gọi gRPC sang

      (hàm

      ).

    • Xử lý lỗi:

      • Nếu lỗi là

        (đã có người xử lý) hoặc

        : Log warning và bỏ qua.

      • Nếu lỗi là

        (không có nhân viên rảnh): Log warning và có thể thử lại sau (tùy cơ chế retry).

4. Logic chọn Agent: cs-chat-storage-svc (Dự đoán)

  • Mặc dù code chi tiết nằm ở

    (chưa view file này trong turn này), nhưng dựa trên tên hàm

    , service này sẽ:

    • Kiểm tra trạng thái các Agent trong team/group (Online/Offline, số lượng chat đang xử lý).

    • Áp dụng thuật toán phân bổ (Round Robin, Load Balancing...).

    • Cập nhật DB: Thêm Agent vào danh sách Participants của hội thoại.

    • Bắn sự kiện (Socket/Kafka) để thông báo cho Agent biết có hội thoại mới được gán.


Chi tiết logic chọn Agent

1. Gọi sang cs-agent-svc

  • Vị trí: cs-chat-storage-svc/internal/usecase/conversation_event.go.

  • Hàm: AssignAgentIntoConversation.

  • Logic:

    • Hàm này chuẩn bị request

      gồm

      , Cid,

      .

    • Đặc biệt, nó lấy thông tin Group ID từ

      của hội thoại (nếu có). Điều này cho thấy hệ thống hỗ trợ phân bổ theo nhóm (ví dụ: Nhóm Kỹ thuật, Nhóm Bán hàng).

    • Gọi gRPC:

      . Đây là bước quan trọng nhất, nơi thuật toán chọn Agent thực sự diễn ra (nằm ở service khác là

      ).

2. Xử lý kết quả trả về

  • trả về

    của nhân viên được chọn.

  • Nếu

    hoặc trả về lỗi -> Không có Agent phù hợp/rảnh -> Kết thúc quy trình (có thể để hội thoại ở trạng thái chờ).

  • Nếu tìm được Agent (

    ):

    • Gọi hàm JoinConversation để thêm Agent này vào danh sách tham gia (Participants) của hội thoại.

    • Cập nhật thông tin Agent (Avatar, Nickname, JobTitle) vào hội thoại nếu cần.

3. Cập nhật trạng thái & Thông báo

  • Sau khi JoinConversation thành công:

    • Cập nhật trạng thái hội thoại (ví dụ: từ Waiting sang Open).

    • Đồng bộ dữ liệu sang ElasticSearch (SyncConversationES).

    • Bắn sự kiện Socket (

      ) để client của User và Agent đều thấy Agent đã tham gia vào chat.

Tóm tắt luồng dữ liệu

->

(Chuẩn bị data) ->

(Thuật toán chọn người) ->

(Thực thi Join, Update DB) -> Realtime (Thông báo).

Dự đoán về thuật toán bên cs-agent-svc

Mặc dù không thấy code của

ở đây, nhưng dựa trên các tham số gửi đi (GroupId,

), thuật toán có thể là:

  1. Lọc danh sách Agent thuộc GroupId yêu cầu.

  2. Lọc Agent đang có trạng thái

    .

  3. Sắp xếp theo tiêu chí:

    • Least Active: Chọn người đang chat ít nhất.

    • Round Robin: Xoay vòng lần lượt.

    • Top Performer: Ưu tiên người có đánh giá cao (ít dùng cho assign tự động).

Last updated