丁亮的个人博客   Java/Go/Linux/开源

GitHub 上 Star 数最多的 Java 博客 Solo
Golang 黑科技之在线 IDE Wide
黑客与画家的社区 Sym

呼叫中心架构设计

背景

  • 客户在打电话给客服(坐席)时需要保护自己的隐私(客户电话号码不能透传给客服)
  • 客服在打电话给客户时可根据实际对应业务来设定是否进行号码透传(大部分场景是透传)
  • 对一些业务提供基础数据的支撑(通话开始时间、结束时间、录音等)
  • 不建立真正的实体呼叫中心,而是接入多个第三方提供的云通话服务完成实际通话过程,降低成本和风险

为此我们需要实现一个能够能够支撑业务实现并能够接入多个云通话服务渠道的系统,命名为 CC(Call Center,呼叫中心)。

架构设计

从呼叫模式上看,目前业界大多数采用的是“回拨”模式,即由呼叫中心发起两路呼叫,然后将两路进行连通。提供回拨服务的厂商比较多,比如玖云、华为、吉亚等,下面以玖云和华为为例进行架构设计。(选择玖云和华为主要是因为他们正好使用了不同的两种通话状态获取模式,玖云是回调,而华为是轮询)

1468845260279

(图片看不清的话请另存为后查看)

子模块

  • Callback Logging:玖云事件回调持久化,实现上使用 NGINX 写文件日志
  • Scheduled Task:华为事件轮询
  • Dispatch & Handle:处理来自 Callback Logging 和 Scheduled Task 的通话事件
  • Unified Call Records:统一格式的通过记录持久化存储
  • Channel:提供给应用调用,完成“用户-坐席-渠道”的关联管理功能
  • User-Agent-Channel:“用户-坐席-渠道”持久化存储
  • Call:提供给应用调用,完成“回拨”功能
  • Call Query:提供给应用调用,完成通话数据查询功能
  • Health:渠道及回调日志健康状态检查,以及渠道故障时让 Channel 自动切换渠道
  • Aliyun OSS:将获取到的通话录音上传到阿里云 OSS 进行存储

通话记录表

列名 类型 长度 备注
id bigint 20 主键
tenant varchar 32 租户标识
main_num varchar 16 400 商户号码
ext_num varchar 8 400 商户分机号码
agent varchar 64 坐席标识
call_id varchar 64 由渠道返回的话单 id
caller varchar 16 主叫(A 路)号码
called varchar 16 被叫(B 路)号码
biz_data text 业务数据
channel varchar 8 渠道标识:(玖云:e9;华为:hw;吉亚:jy)
ch_state varchar 32 渠道返回的话单当前状态
state varchar 8 话单当前状态。初始化(发起呼叫 A 路):init;双通:conn;关闭:close
a_call_time bigint 20 呼叫 A 路时间
b_call_time bigint 20 呼叫 B 路时间
a_offhook_time bigint 20 A 路摘机(接通)时间
b_offhook_time bigint 20 B 路摘机(接通)时间
conn_time bigint 20 双通时间
close_time bigint 20 关闭通话时间
duration int 11 通话时长(秒)
ch_audio_url varchar 512 渠道录音文件 URL
audio_url varchar 512 外部存储录音文件 URL
ivr_url varchar 512 IVR 语音文件 URL
ivr_text text IVR 文本内容
close_type varchar 32 0:正常挂断;1:A 路无法接通;2:B 路无法接通;3:A 路目标忙;4:B 路目标忙;5:通话达到最大时长;6:渠道服务器错误;7:渠道网络错误;255:其他错误
updated bigint 20 记录更新时间
created bigint 20 记录创建时间

回拨流程

  1. 应用发起回拨请求,调用 Call
  2. Call 调用 Channel,有 Channel 选择适合的渠道,并通过公网 HTTP(S) 进行回拨请求
  3. 由渠道通过 PSTN 实现电话呼叫:
    3.1 呼叫 A 路(客服),A 路摘机
    3.2 呼叫 B 路(客户),客户摘机
    3.3 A-B 接通进行通话
    3.4 通话结束(A/B 挂断或异常)
  • 在此期间需要接收事件回调(玖云)或进行事件轮询(华为)并持久化通话状态,最终形成统一格式的通话记录
  • 回拨接口参数中可以带上业务实体标识,以便将通话记录和业务实体进行关联对应
  • 回拨接口的返回值中会返回一个 callId,用来表示该次回拨,以便将通话记录和业务实体进行关联对应
  • 在通话期间,应用可以使用 callId 来轮询 CC 查看通话状态

用户-坐席-渠道

这个模型用于描述业务系统中的用户实体以及坐席(可以理解为渠道提供的通话线路,同一时刻同一个线路只能有一通电话在拨打)的关联,并却定了这个用户所使用的通话渠道。

  • 对于玖云,坐席对应的是电话号码
  • 对于华为,坐席对应的是坐席号

默认情况下并不需要指定关联,CC 会自动选择渠道,只有在某些业务场景下需要应用来指定渠道。


以上都是我瞎扯的,实在编不下去了,欢迎大家分享真正的经验 :-p

---- EOF ----
欢迎加入开源技术 Q 群 242561391 HacPai,让学习和分享成为一种习惯!
validate