引言
在快速变化的商业环境中,我们迫切需要高效的即时通讯工具来满足日益增长的沟通需求。尽管传统的第三方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系统不仅促进高效沟通,还提升客户满意度,助力货拉拉的持续发展和竞争力。