Java 多商户客服系统技术方案(含架构图与数据设计)
目标:搭建一套支持 多商户(多租户) 的全渠道智能客服系统,覆盖网页/APP/小程序接入、实时 IM、会话分配、工单流转、知识库、统计报表,满足 高并发、可观测、安全合规 要求,并支持 开源二开或私有化部署。
1. 总体架构概览
┌────────────────────────── SaaS/私有化 控制面 ──────────────────────────┐
│ 租户管理(Tenant) 计费&订阅 运营配置 账号&权限 风险与审计 管理后台 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌────────────────────────── 数据层 ────────────────────────────┐
│ MySQL/PG(主从/分片) Redis(缓存/队列) ES(全文检索) MinIO(文件) │
└─────────────────────────────────────────────────────────────┘
│
▼
┌────────────────────────── 服务层(微服务) ──────────────────────────┐
│ 网关(API Gateway) 鉴权(Auth) 多租户路由(Tenant Router) │
│ 会话/会话分配(Session & Routing) 客服工作台(Agent Service) │
│ 消息(IM Service: WebSocket/STOMP) 渠道接入(Channel Adapters) │
│ 工单(Ticket) 知识库(KB) 统计报表(Analytics) 通知(Notify) │
│ 机器人/FAQ(Bot) Webhook/集成(Integration) 审计(Audit) │
└─────────────────────────────────────────────────────────────┘
│
▼
┌────────────────────────── 边缘/接入层 ───────────────────────────┐
│ Web SDK 小程序SDK App SDK 第三方渠道(公众号/企微/钉钉/短信/邮件) │
└─────────────────────────────────────────────────────────────┘
关键技术选型
- 后端:Java 17、Spring Boot 3、Spring Cloud (Gateway/Nacos/OpenFeign/Resilience4j)
- 持久化:MySQL 8 / PostgreSQL 14 + MyBatis-Plus(多租户插件)
- 缓存/会话:Redis(Cluster)
- 消息队列:RabbitMQ / Kafka(二选一;推荐 Kafka 做高吞吐消息流)
- 全文检索:Elasticsearch/OpenSearch(聊天记录检索)
- 对象存储:MinIO / S3(图片、语音、文件)
- 长连接:Spring WebSocket + STOMP(可替换为 Netty)
- 前端:Vue3 + Vite + TypeScript;UI:Element Plus/Ant Design Vue
- 部署:Docker + Kubernetes(HPA 自动扩缩)
- 观测:Prometheus + Grafana + Loki,SkyWalking/Jaeger(链路)
- 鉴权:OAuth2.1/OpenID Connect(Keycloak/自建 Auth)
2. 多租户(多商户)隔离模型
关键实现点
- 全链路透传 X-Tenant-Id(Header、JWT Claim、WS SUB topic)
- MyBatis-Plus 多租户拦截器按列自动拼接 tenant_id
- 租户级限流(Gateway 层 + Redis Token Bucket)
- 数据脱敏与 RBAC 权限按租户隔离
3. 核心域与服务说明
3.1 渠道接入 (Channel Adapters)
- Web/H5 SDK:嵌入式气泡、全屏面板、匿名/登录访客
- 小程序/APP SDK:同域名直连或反向代理;原生/混合容器
- 第三方:微信公众号/企微/钉钉/邮箱/短信/电话SIP(按适配器接入)
3.2 即时通讯 IM Service
- 协议:WebSocket + STOMP;Topic 命名:/topic/{tenantId}/{convId}
- 消息投递:WS → Kafka im.messages → 持久化/路由 → 推送在线坐席
- 历史消息:ES + MySQL 混合(冷热数据分层)
3.3 会话与分配 Session & Routing
- 入口:访客发起会话或渠道 webhook
- 分配策略: 轮询(Round-Robin)/最少会话/最大并发阈值 技能标签(Skill-Based)与优先级(VIP、渠道) 工作时间、排班、SLA 阈值、机器人优先
- 队列与排队:Redis ZSet 维护等待队列;超时回退机器人
3.4 客服工作台 Agent Service
- 多会话标签页、快捷回复、知识库检索、工单一键创建
- 屏蔽词/敏感词检测、消息撤回、转接/邀请协作
3.5 工单 Ticket & CRM
- 工单模板、状态机(Open → Pending → Solved → Closed)
- SLA 计时、升级策略(超时自动升级/通知)
- 用户画像(标签、设备、最近会话、CSAT)
3.6 统计与报表
- 实时指标:在线坐席、排队人数、平均响应、解决时长
- 经营报表:按租户/渠道/坐席/技能组聚合
3.7 机器人/知识库(可选)
- FAQ 检索、意图路由、智能建议;所有模型调用在 服务端 侧以保护密钥
4. 关键数据模型(简表)
命名约定:所有表含 tenant_id;时间均为 UTC,应用层按租户时区展示。
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 设计(REST + WS)
5.1 认证与多租户
- JWT 承载 tenant_id、roles;Gateway 校验并注入上下文
- 请求头要求:Authorization: Bearer <token> + X-Tenant-Id: <tid>
5.2 主要 REST 接口(示例)
- POST /api/v1/conversations 启动会话(访客/渠道)
- GET /api/v1/conversations?status=queued&skill=xx 列表
- POST /api/v1/conversations/{id}/assign?agentId= 指派/转接
- POST /api/v1/messages 发送消息 {conversationId, content, type}
- POST /api/v1/tickets 创建工单
- GET /api/v1/analytics/realtime 实时指标
- POST /api/v1/webhooks/test 测试回调
5.3 WebSocket 通道
- 连接:wss://gw.example.com/ws?token=...
- 订阅:/topic/{tenantId}/{conversationId}
- 发送:/app/message.send(服务端鉴权后广播)
6. 会话分配与消息流转(时序图)
6.1 访客接入 → 坐席分配
Visitor → Gatewa