AssignAgent
Tổng quan luồng xử lý
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).
cs-event-center-svc: Nhận sự kiện cần Assign Agent và đẩy vào Kafka.
cs-consumer: Đọc Kafka Topic AssignAgent.
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à:
Lọc danh sách Agent thuộc GroupId yêu cầu.
Lọc Agent đang có trạng thái
.
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