企业规模一大,消息来源就杂:客户在企业微信里发的、在个人微信里发的、在官网表单里留的、在邮件里问的,加上自家业务系统内部产生的通知。每条渠道各跑一套处理逻辑,数据散在各处,客服切换工具切到手抽筋。用 Eyun 企业微信 API 做底座搭一套统一消息中台,把所有渠道的消息收敛到一个处理流水线,是这套架构要解决的问题。
一、先想清楚为什么要统一
多渠道分散处理带来的不只是体验差,更致命的是数据无法沉淀。一个客户上午在企微问退款、下午在邮件催进展、晚上在官网表单投诉,三段对话在不同系统里,客服每次都得从头问一遍。统一处理的核心价值是同一客户在不同渠道的对话能拼起来,背后靠的是统一的客户身份和会话模型。
但统一不是把所有消息原样塞一张表,那样做出来的是垃圾堆。要分层抽象。
二、三层抽象模型
把多渠道消息统一,关键是设计好三层抽象:
层级 | 抽象内容 | 解决的问题 |
|---|---|---|
渠道适配层 | 把不同渠道的原始报文转成统一消息格式 | 协议差异 |
统一消息模型 | 标准化的消息体(发送方、接收方、内容、时间、渠道) | 数据结构差异 |
业务路由层 | 根据消息属性决定由谁处理、走哪条业务流程 | 处理逻辑差异 |
渠道适配层做的是翻译:Eyun 企业微信 API 推过来的回调报文里,正文在content[].text、contentType为0或2;邮件渠道的正文在邮件 body;官网表单的正文在 form 字段。适配层把它们都转成同一种结构:
{ "channel": "wecom", "fromId": "uin_xxx", "toId": "we_yyy", "content": "退款怎么还没到账", "msgType": "text", "timestamp": 1789000000, "rawRef": "原始报文存储路径" }rawRef字段指向原始报文存储路径,业务层用统一格式处理,需要回溯细节时再取原始报文。
三、统一身份:把不同渠道的客户拼起来
这是整个架构最难的一块。同一个客户在企业微信里的标识是uin,在个人微信里是wxid,在邮件里是邮箱地址,在官网表单里是手机号。这些标识之间没有天然关联。
工程上要做的是身份合并:
维护一张客户主档表,每个真实客户一个
customerId。各渠道标识作为关联表的外键挂在
customerId下。当某渠道消息进来时,先用本渠道标识查关联表,没命中就尝试用手机号/邮箱/昵称做模糊匹配,仍不命中就先建临时客户,等后续人工或自动合并。
模糊匹配不能完全信。我们实测过,靠昵称匹配的误识率超过 30%,最好用手机号这种强标识做合并键。客户在不同渠道填的手机号不一致时,要靠人工客服在管理后台确认后合并。
四、消息队列:统一处理的物理实现
适配层把统一消息格式产出之后,不能直接同步处理,原因有二:
各渠道消息量差异大,业务系统扛不住突发。
不同渠道对响应时效要求不同,邮件可以晚 5 分钟回,企微客户等不了 30 秒。
正确做法是适配层产出统一消息后写入消息队列,处理层从队列消费。队列要分优先级:
优先级 | 渠道 | 处理时效 |
|---|---|---|
P0 | 企微客户消息 | ≤30 秒 |
P1 | 官网表单、电话回呼 | ≤5 分钟 |
P2 | 邮件 | ≤30 分钟 |
P3 | 业务系统内部通知 | 可延后 |
队列选型上,Redis Streams 适合中小规模,吞吐够用且实现简单;规模上千 QPS 再考虑 Kafka 或 RabbitMQ。别一上来就上 Kafka,运维成本会拖死小团队。
五、业务路由:消息分流到对应处理流程
统一消息进来之后,怎么决定走哪条业务流程?靠规则路由:
按渠道:企微客户消息走客服流程,邮件走工单流程。
按内容:含"退款"关键词走退款流程,含"投诉"走投诉升级。
按客户:VIP 客户的消息直接路由给专属客服。
按状态:已有进行中工单的客户消息追加到该工单,不开新流程。
这几条规则要做成可配置,别写死在代码里。我们用一张规则表存所有路由条件,运营人员能改优先级、加新规则,不用发版。
六、统一回复:一个出口发往多渠道
客户从邮件问的问题,回复可能要发回邮件、同时通过 消息模块 发到企微、还要在官网表单里更新状态。统一回复层做的事就是把业务系统产出的回复文本,按客户在本次对话使用的渠道原路返回,或者按规则发到指定渠道。
这块的实现要点是渠道抽象:回复层只关心"回复给 customerId 的某段文本",具体用哪个渠道发由路由表决定。sendText接口负责企微侧,邮件 SMTP 负责邮件侧,HTTP 接口负责官网侧。每个渠道写一个适配器,统一接口签名。
七、会话视图:客服侧的统一界面
客服侧看到的不是分散的几个工具,而是一个统一工作台:
左侧客户列表:按渠道、按未回复时长排序
中间会话视图:该客户在所有渠道的对话按时间线拼起来
右侧客户档案:身份信息、历史工单、标签
时间线拼接的难点是跨渠道上下文关联。客户上午在企微问了退款流程,下午在邮件里说"按昨天聊的办吧",邮件单独看完全没有上下文,但拼到一起就能看出延续性。我们的做法是同一customerId在 24 小时内的所有渠道对话默认视为同一上下文,客服可手动拆分。
八、监控与告警
多渠道统一之后,问题排查难度指数级上升:客户说"我没收到回复",到底卡在哪一层?必须埋全链路监控:
接收延迟:从客户发出到适配层收到,超出阈值告警。
队列堆积:各优先级队列深度超阈值告警。
处理失败:处理层抛异常要立即告警并自动重试。
发送失败:回复层调渠道接口失败要告警,且不能丢消息,进死信队列人工介入。
每条消息带一个traceId,从适配层生成一路传到发送层。客户报问题时拿 traceId 一查就定位到卡在哪。
写在最后
用 Eyun 企业微信 API平台 搭多渠道统一消息中台,技术栈本身不新鲜,难的是抽象层级和身份合并。把渠道适配、统一模型、业务路由三层抽象做扎实,再加一套靠谱的身份合并机制,多渠道消息统一处理就有了底座。剩下的是持续优化路由规则、监控告警、客服工作台体验。这套架构跑顺之后,客服再也不用切工具,客户也不用把同样的话说三遍。