Java 多商戶客服系統(tǒng)技術(shù)方案(含架構(gòu)圖與數(shù)據(jù)設(shè)計(jì))
目標(biāo):搭建一套支持 多商戶(多租戶) 的全渠道智能客服系統(tǒng),覆蓋網(wǎng)頁(yè)/APP/小程序接入、實(shí)時(shí) IM、會(huì)話分配、工單流轉(zhuǎn)、知識(shí)庫(kù)、統(tǒng)計(jì)報(bào)表,滿足 高并發(fā)、可觀測(cè)、安全合規(guī) 要求,并支持 開源二開或私有化部署。
1. 總體架構(gòu)概覽
┌────────────────────────── SaaS/私有化 控制面 ──────────────────────────┐
│ 租戶管理(Tenant) 計(jì)費(fèi)&訂閱 運(yùn)營(yíng)配置 賬號(hào)&權(quán)限 風(fēng)險(xiǎn)與審計(jì) 管理后臺(tái) │
└─────────────────────────────────────────────────────────────┘
│
▼
┌────────────────────────── 數(shù)據(jù)層 ────────────────────────────┐
│ MySQL/PG(主從/分片) Redis(緩存/隊(duì)列) ES(全文檢索) MinIO(文件) │
└─────────────────────────────────────────────────────────────┘
│
▼
┌────────────────────────── 服務(wù)層(微服務(wù)) ──────────────────────────┐
│ 網(wǎng)關(guān)(API Gateway) 鑒權(quán)(Auth) 多租戶路由(Tenant Router) │
│ 會(huì)話/會(huì)話分配(Session & Routing) 客服工作臺(tái)(Agent Service) │
│ 消息(IM Service: WebSocket/STOMP) 渠道接入(Channel Adapters) │
│ 工單(Ticket) 知識(shí)庫(kù)(KB) 統(tǒng)計(jì)報(bào)表(Analytics) 通知(Notify) │
│ 機(jī)器人/FAQ(Bot) Webhook/集成(Integration) 審計(jì)(Audit) │
└─────────────────────────────────────────────────────────────┘
│
▼
┌────────────────────────── 邊緣/接入層 ───────────────────────────┐
│ Web SDK 小程序SDK App SDK 第三方渠道(公眾號(hào)/企微/釘釘/短信/郵件) │
└─────────────────────────────────────────────────────────────┘
關(guān)鍵技術(shù)選型
- 后端:Java 17、Spring Boot 3、Spring Cloud (Gateway/Nacos/OpenFeign/Resilience4j)
- 持久化:MySQL 8 / PostgreSQL 14 + MyBatis-Plus(多租戶插件)
- 緩存/會(huì)話:Redis(Cluster)
- 消息隊(duì)列:RabbitMQ / Kafka(二選一;推薦 Kafka 做高吞吐消息流)
- 全文檢索:Elasticsearch/OpenSearch(聊天記錄檢索)
- 對(duì)象存儲(chǔ):MinIO / S3(圖片、語音、文件)
- 長(zhǎng)連接:Spring WebSocket + STOMP(可替換為 Netty)
- 前端:Vue3 + Vite + TypeScript;UI:Element Plus/Ant Design Vue
- 部署:Docker + Kubernetes(HPA 自動(dòng)擴(kuò)縮)
- 觀測(cè):Prometheus + Grafana + Loki,SkyWalking/Jaeger(鏈路)
- 鑒權(quán):OAuth2.1/OpenID Connect(Keycloak/自建 Auth)
2. 多租戶(多商戶)隔離模型
關(guān)鍵實(shí)現(xiàn)點(diǎn)
- 全鏈路透?jìng)?X-Tenant-Id(Header、JWT Claim、WS SUB topic)
- MyBatis-Plus 多租戶攔截器按列自動(dòng)拼接 tenant_id
- 租戶級(jí)限流(Gateway 層 + Redis Token Bucket)
- 數(shù)據(jù)脫敏與 RBAC 權(quán)限按租戶隔離
3. 核心域與服務(wù)說明
3.1 渠道接入 (Channel Adapters)
- Web/H5 SDK:嵌入式氣泡、全屏面板、匿名/登錄訪客
- 小程序/APP SDK:同域名直連或反向代理;原生/混合容器
- 第三方:微信公眾號(hào)/企微/釘釘/郵箱/短信/電話SIP(按適配器接入)
3.2 即時(shí)通訊 IM Service
- 協(xié)議:WebSocket + STOMP;Topic 命名:/topic/{tenantId}/{convId}
- 消息投遞:WS → Kafka im.messages → 持久化/路由 → 推送在線坐席
- 歷史消息:ES + MySQL 混合(冷熱數(shù)據(jù)分層)
3.3 會(huì)話與分配 Session & Routing
- 入口:訪客發(fā)起會(huì)話或渠道 webhook
- 分配策略: 輪詢(Round-Robin)/最少會(huì)話/最大并發(fā)閾值 技能標(biāo)簽(Skill-Based)與優(yōu)先級(jí)(VIP、渠道) 工作時(shí)間、排班、SLA 閾值、機(jī)器人優(yōu)先
- 隊(duì)列與排隊(duì):Redis ZSet 維護(hù)等待隊(duì)列;超時(shí)回退機(jī)器人
3.4 客服工作臺(tái) Agent Service
- 多會(huì)話標(biāo)簽頁(yè)、快捷回復(fù)、知識(shí)庫(kù)檢索、工單一鍵創(chuàng)建
- 屏蔽詞/敏感詞檢測(cè)、消息撤回、轉(zhuǎn)接/邀請(qǐng)協(xié)作
3.5 工單 Ticket & CRM
- 工單模板、狀態(tài)機(jī)(Open → Pending → Solved → Closed)
- SLA 計(jì)時(shí)、升級(jí)策略(超時(shí)自動(dòng)升級(jí)/通知)
- 用戶畫像(標(biāo)簽、設(shè)備、最近會(huì)話、CSAT)
3.6 統(tǒng)計(jì)與報(bào)表
- 實(shí)時(shí)指標(biāo):在線坐席、排隊(duì)人數(shù)、平均響應(yīng)、解決時(shí)長(zhǎng)
- 經(jīng)營(yíng)報(bào)表:按租戶/渠道/坐席/技能組聚合
3.7 機(jī)器人/知識(shí)庫(kù)(可選)
- FAQ 檢索、意圖路由、智能建議;所有模型調(diào)用在 服務(wù)端 側(cè)以保護(hù)密鑰
4. 關(guān)鍵數(shù)據(jù)模型(簡(jiǎn)表)
命名約定:所有表含 tenant_id;時(shí)間均為 UTC,應(yīng)用層按租戶時(shí)區(qū)展示。
tenant(id, name, plan, status, created_at)
user(id, tenant_id, role[admin/agent/viewer], email, phone, hashed_password, status, last_login)
visitor(id, tenant_id, external_id, nickname, channel, device, locale, created_at)
agent_skill(id, tenant_id, agent_id, skill, level)
conversation(id, tenant_id, channel, visitor_id, status[open/queued/assigned/closed], priority, assigned_agent_id, queue_at, first_reply_at, solved_at, close_reason)
message(id, tenant_id, conversation_id, from_type[visitor/agent/bot/system], from_id, content_type[text/image/file/event], content, meta(json), created_at, seq)
ticket(id, tenant_id, subject, description, requester_id, assignee_id, status, priority, sla_policy_id, related_conversation_id)
kb_article(id, tenant_id, title, body, tags, visibility, updated_at)
webhook_sub(id, tenant_id, url, events, secret, status)
audit_log(id, tenant_id, actor_type, actor_id, action, target, data, ip, created_at)
analytics_daily(id, tenant_id, date, channel, sessions, messages, avg_first_reply_sec, csat, solved_cnt)
索引建議:
- conversation(tenant_id, status, assigned_agent_id)
- message(conversation_id, seq)、message(tenant_id, created_at)
- visitor(tenant_id, external_id)
5. API 設(shè)計(jì)(REST + WS)
5.1 認(rèn)證與多租戶
- JWT 承載 tenant_id、roles;Gateway 校驗(yàn)并注入上下文
- 請(qǐng)求頭要求:Authorization: Bearer <token> + X-Tenant-Id: <tid>
5.2 主要 REST 接口(示例)
- POST /api/v1/conversations 啟動(dòng)會(huì)話(訪客/渠道)
- GET /api/v1/conversations?status=queued&skill=xx 列表
- POST /api/v1/conversations/{id}/assign?agentId= 指派/轉(zhuǎn)接
- POST /api/v1/messages 發(fā)送消息 {conversationId, content, type}
- POST /api/v1/tickets 創(chuàng)建工單
- GET /api/v1/analytics/realtime 實(shí)時(shí)指標(biāo)
- POST /api/v1/webhooks/test 測(cè)試回調(diào)
5.3 WebSocket 通道
- 連接:wss://gw.example.com/ws?token=...
- 訂閱:/topic/{tenantId}/{conversationId}
- 發(fā)送:/app/message.send(服務(wù)端鑒權(quán)后廣播)
6. 會(huì)話分配與消息流轉(zhuǎn)(時(shí)序圖)
6.1 訪客接入 → 坐席分配
Visitor → Gatewa