服务器 频道

聚焦沟通:货拉拉自研客服IM系统实践

  引言

  在快速变化的商业环境中,我们迫切需要高效的即时通讯工具来满足日益增长的沟通需求。尽管传统的第三方IM系统提供了基本的沟通功能,但其在灵活性和可定制性方面往往无法满足我们的特定要求。因此,我们自主研发了一款客服IM系统,经过三年的稳定运行,显著提升了沟通协作效率,更好地支持了业务发展。

  背景

  在使用第三方IM系统时,我们面临着多重挑战,尤其是在灵活性不足和个性化服务无法满足特定业务需求。这不仅影响了沟通效率,也限制了我们在业务流程和司用体验上的创新。为了解决这些问题,我们设计并开发了自研的客服IM系统,旨在提供更高的定制化能力,以适应我们的业务需求和沟通协作方式,并且有较高的稳定性。

  在接下来的内容中,我们将深入探讨自研IM系统的技术架构、设计理念,以及在开发过程中遇到的挑战与解决方案,以全面了解该系统如何高效、灵活地开展司用服务。

  系统设计理念

  在开发自研客服IM系统时,我们秉持以下设计理念,以确保系统不仅能满足当前需求,还能灵活应对未来多变的业务场景:

  1. 以司用为中心

  无缝互动体验:设计时充分考虑司用与虚拟客服助手、人工客服之间的交互流畅性,同时我们支持ASR语音智能转文本能力,让司用能享受到和人工交互一致的、流畅的互动体验,确保服务的连贯性。

  个性化沟通:通过询前收集司用数据,系统能根据司用状态推测进线意图,提供更精准、个性化的信息和建议,提升咨询效率,以达到更高的司用满意度。

  2. 虚拟客服助手

  智能对话能力:虚拟客服助手通过先进的NLP自然语言处理技术,能够理解复杂问题,进行智能对话,提供及时而准确的反馈。

  上下文理解能力:根据上下文内容理解进行任务对话,以便在多轮对话中保持信息一致性和流畅性,增强司用体验。

  3. 实时性与高可用性

  即时响应:通过优化系统响应时间,使司用无论是使用语音还是文本输入,都能及时获得反馈,满足快速服务的需求。

  高可用架构:采用高可用的系统架构,异步化处理,支持高并发访问,确保在业务高峰期系统依然稳定运行。

  4. 数据安全与隐私保护

  安全的通讯保障:会话前司用身份智能识别,会话中数据权限访问控制及匹配校验,确保数据的安全性与司用隐私得到有效保护。

  数据保护:敏感信息数据加密存储,数据输出脱敏处理,致力于为司用提供强有力的数据保护。

  技术架构

  系统架构

  基于目前主流的,也是货拉拉标准化的系统架构设计,能确保系统的可靠性,通过模块化将系统划分为不同层级,使系统更具灵活性,便于系统维护。

  业务层:IM系统旨在全天候提供在线服务,通过H5渠道链接的统一方式嵌入不同的业务客户端,广泛覆盖用户APP、司机APP、小程序等,确保司用随时随地都能使用在线客服服务。

  接入层:通过统一的链接访问与网关建立连接,简化了接入流程。

  应用层:应用层负责所有IM业务处理,具备动态扩展能力,以快速响应多样化的业务场景,确保灵活应对业务需求的变化。

  服务层:服务层提供底层业务支持,负责处理核心功能,确保系统稳定高效运行。

  基础层:基础层构建了公司内部的基础设施,提供各个业务系统所需的支持,确保系统的稳定性和可靠性。  

  技术选型

  通信协议

  我们选择WebSocket作为通信协议。WebSocket作为一种全双工通信的TCP网络协议,被广泛应用于即时通讯、游戏、实时通知等,它在HTTP协议基础上,通过“握手”过程建立了一个持久的连接,支持双向通信,使得信息的发送和接收可以即时进行,而不需要不断地重新建立连接,具有实时性、低延迟、高效性等特点。

  网络模型

  网络模型可以使用同步阻塞I/O、同步非阻塞I/O和异步I/O,详细的差异在此不展开赘述,Java针对网络模型分别提供了BIO,NIO和AIO等API,我们最终决定使用NIO网络模型,一方面是结合实际应用场景以及公司内部的基础建设,一方面是NIO通过非阻塞I/O和多路复用,提供高效的大量并发连接管理和处理能力,而且系统开销也比较小,比较符合IM系统使用场景。

  开发框架

  对接原生NIO操作API比较繁琐,为了更好更高效完成系统开发,我们选择市面上比较成熟的Spring Webflux框架,底层容器使用Netty,大大降低了NIO网络模型对接成本,并且框架内部做了许多系统优化,能充分利用NIO的非阻塞特性,通过实现Reactor响应式编程以及事件驱动处理模型,表现出卓越的性能,提供高并发连接和低延迟通信。

  Netty事件驱动模型  

  服务中心化

  在IM系统的网络设计中,对于端对端的个人通信,通常采用Client-Client模式。此模式下,两个客户端通过WebSocket建立直接连接,实现简单高效的通信。

  相比之下,在客服业务场景中,我们选择Client-Server模式。所有客户端与中心网关建立连接,网关负责接收并转发司用与坐席或者服务端的请求。这种设计不仅便于记录通信过程,还为后续操作提供了灵活性。

  基本链路  

  会话前

  身份识别:会话开始前进行身份识别并生成JWT身份标识。JWT是一种无状态的身份验证方式,广泛应用于现代Web应用,具有跨平台支持的优势。通过JWT进行权限验证,确保信息传递的安全性。

  会话中

  会话建立:成功建立后,双方可立即开始通信。

  心跳检测:系统定期监控会话连接健康状态,并自动重连,确保交互完整流畅。

  消息发送:提供丰富的内容交互,支持客户端发送文本、表情、多媒体文件等。

  语音输入:利用ASR技术智能识别语音,帮助司用流畅表达想法,节省手动输入时间,特别适合司机在驾驶过程中使用。使更多司用轻松参与即时通讯。

  会话后

  会话结束:司用可主动结束会话,或系统自动结束。

  评价推送:结束后,系统会推送会话评价。

  后续处理:系统将进行后续处理,确保服务持续改进和提高司用满意度。

  设计原则:低耦合,高内聚  

  在IM系统设计的初期,我们考虑到随着业务的发展,系统将经历不断的升级与迭代。如果没有良好的系统架构,后续的维护成本将会不断增加。因此,我们采用“低耦合、高内聚”的设计原则,旨在提升系统的可维护性和扩展性,尤其是在敏捷开发和持续集成的环境中,能够快速响应变化并减少模块之间的依赖关系。

  模块化设计

  我们将IM系统拆分为多个独立模块,各模块通过API或消息队列(MQ)进行交互:

  IM网关服务:管理所有客户端的会话连接,包括司用端和坐席端。IM网关负责将通信请求转换为事件消息,并投送至事件消息队列。

  事件处理:处理会话过程中的消息事件。结合抽象工厂和模板方法设计模式,为每个事件提供独立的处理器,从而使细化的逻辑更加清晰。新增业务事件时,只需添加相应的事件处理器,降低开发复杂度。

  任务处理:处理与会话并无直接关联或时效性要求不高的任务。该模块允许通过分派任务的方式进行处理,例如异步将进入人工队列的会话分派给指定坐席,各个任务之间实现解耦。

  事件驱动架构

  我们采用事件总线和消息队列来解耦模块,消息的顺序性依据具体业务场景。对于IM系统的大部分场景而言,消息消费可以是无序的:

  事件MQ:记录会话生命周期中的所有事件,包括连接建立、会话注册、会话上线、消息发送、消息确认(ACK)等。

  任务MQ:由事件处理器产生,也可以扩展为其他触发方式,如定时任务触发,主要用于处理会话过程中非即时的逻辑。

  单一职责(SRP)

  每个模块专注于特定功能,职责明确,确保模块间的功能界限清晰。在微服务设计中,各模块可单独部署,依据系统运行情况提供不同的运行环境,实现独立自治。

  技术挑战与解决方案

  挑战一: 网关设计

  在IM系统中,网关设计至关重要,为了确保稳定运行,我们更多时候是多节点部署,处理Client和Server之间的WebSocket连接会话也是关键,这样才能保证通信畅通无阻,避免“交通堵塞”。在迭代过程中,我们尝试了多种解决方案,最终结合实际业务场景,选定了「本地存储+Redis存储」方案。这样一来,性能也有提升,全局映射表功能也变得触手可及!

  本地存储+Redis存储  

  挑战二:会话数据存储

  IM系统主要的数据是会话数据,其中会话数据如何存取以及数据格式如何设计,直接影响了系统的稳定性和性能,面对传统的DB存储,往往面临以下问题:

  优化前:

  数据存储方式仅使用MySQL,缺乏灵活性。

  数据读取性能较低,受限于MySQL的处理能力,造成性能瓶颈。

  合理的数据存储架构确保系统灵活可扩展,并提升数据访问速度,同时可以支撑业务高峰高并发量,确保系统在高负载情况下依然可靠运行,经过不断迭代升级,最终才能达到理性的效果。

  优化后:

  实现了冷热数据隔离存储,活跃会话数据实时处理,离线会话数据异步写入MySQL,减轻了数据库负担。

  数据读取性能显著提升,而且采用Redis丰富的数据结构,满足IM系统多样化存储需求。

  通过特定规则进行分片存储,提升了存储能力和读写性能。  

  挑战三:消息ACK

  消息ACK是IM系统中用于确认消息成功送达的机制,它通过向发送方反馈消息状态(如已接收、发送失败等),提高了司用对消息传递的信任感和体验。简而言之,ACK就是让你知道你的消息没有“平白无故地消失了”!

  主要流程:

  司用端发送消息。

  服务器处理消息并返回ACK。

  司用端接收ACK后更新消息状态。

  长时间未接收ACK,消息重新发送。

  对于服务端推送消息到司用端/坐席端也是同样道理。其中cmId用于确认消息唯一性,确保消息不会重复发送或接收。  

  挑战四:人工排队机制

  合理设计IM系统的人工排队机制能够显著提升司用体验,优化客服资源的分配,并改善服务流程,从而降低运营成本。为此,我们付出了大量努力,力求得到一个高效的解决方案。

  原有机制存在的问题:

  优先级规则单一:根据进人工队列时间排序,谁先进先分派坐席处理。

  排队等待不合理:多个渠道共用同个技能组队列池,而给客户端回应的排队数是当前渠道的排队情况,受同个技能组其他渠道排队数影响,实际排队数可能远大于回应的人数。

  坐席超派:并发分派场景下,可能出现分派的客户超出坐席接待上限。

  无效会话接待:司用进入人工队列,长时间离线,人工接待后无法及时有效进行沟通。  

  升级之后:

  丰富的优先级规则:结合星图平台提供的接口配置化能力,可根据业务场景动态配置优先级生成规则,最终通过API方式返回优先级,尽可能让急需解决问题的司用被优先接待。

  排队升级机制:长时间有效等待后,系统将自动提升优先级,尽快被坐席接待,提升司用体验。

  离线排队检测:自动移除无效等待的司用,提升坐席接待率。  

  系统演进之路

  自研IM系统的演进过程中,满足业务需求的挑战始终存在,我们需要不断地升级迭代,才能更好给司用提供服务,提升坐席接待效率。  

  收益分析  

  未来展望

  自助服务

  未来在线IM系统将通过融合流程编排配置化的自助服务,在聊天过程中引入动态表单功能,智能引导司用提交必要信息,以便更准确地描述问题,让司用无需与客服直接互动即可轻松获得所需信息和解决方案。在转接到人工客服时,系统将整理司用数据,帮助客服快速了解诉求,提高问题解决效率。  

  人机协作

  为提升人工接待效率并为司用提供更优质的体验,我们将引入人机协作的模式。在这种模式下,当客服同时接待多个司用时,智能客服助手将与客服协同工作,实时提供支持和信息。人机协作机制将相辅相成,高效地满足司用需求,确保服务的及时性和准确性,从而整体提升司用体验。  

  结论

  在线客服IM系统设计旨在提升司用体验,采用灵活的架构确保可扩展性和稳定性。同时,系统通过有效利用数据来优化服务流程,并集成自动化工具以提高客服效率。持续改进和迭代也是设计的重要环节,以适应不断变化的业务需求。最终,IM系统不仅促进高效沟通,还提升客户满意度,助力货拉拉的持续发展和竞争力。

1
相关文章