找回密码
 会员注册
查看: 23|回复: 0

转转客服IM的WebSocket集群部署方案

[复制链接]

7

主题

0

回帖

22

积分

新手上路

积分
22
发表于 2024-9-20 06:50:28 | 显示全部楼层 |阅读模式
一、背景二、WebSocket集群2.1WebSocket协议2.2WebSocket服务的集群式部署2.3消息发送流程2.4断线重连三、总结一、背景转转作为国内头部的二手闲置交易平台,拥有上亿的用户。用户在使用转转app遇到问题时,一般可以通过在线客服、热线电话等方式联系转转客服并解决问题。客服IM系统是转转自研的在线客服系统,是用户和转转客服沟通的重要工具,主要包括机器人客服、人工客服、会话分配、技能组管理等功能。在这套系统中,我们使用了很多开源框架和中间件,今天讲一下WebSocket在客服IM系统中的应用。二、WebSocket集群2.1WebSocket协议IM是实时通信(InstantMessaging)的简称,实时是IM系统的基本要求。在客服系统中,用户和客服实时收发消息,是最基础、最重要的功能。WebSocket(以下简称ws)是一种在单个TCP连接上进行全双工通信的协议,允许服务端主动向客户端推送数据。能够以较小的开销,实现更强的实时性。因此客服IM系统采用了ws协议,实现了服务端同时接收与发送数据的能力。2.2WebSocket服务的集群式部署在实际生产环境中,我们不可能使用单台服务器做ws服务,一旦出现问题就是毁灭性的,所以我们会使用集群式部署ws服务。ws协议是全双工通信协议,可以双向通信的,部署多台机器后,如图所示,不同用户会分别和不同的机器连接,A如何向C发送消息呢?首先,我们在nginx配置中,将ws服务的负载均衡策略设置为ip_hash,保证用户在IP不变的情况,一直分配在一个固定服务器上。用户与ws服务建立连接后,获取当前机器hostname,将用户uid与机器hostname关系存储在redis中。每个ws服务都维护了一个独立的consumer,采用广播消费模式,仅消费属于自己tag的消息,tag即为当前机器hostname。2.3消息发送流程用户A在向用户C发送消息时,用户A将消息发送给ws-1服务器,ws-1服务接收消息后,从redis中获取用户C的连接信息;ws-1服务器拿到用户C和ws-2的关系后,设置mq消息tag="ws-2",直接将用户消息通过mq发送出去ws-2服务器的consumer接收到对应mq消息后,即可通过ws连接将消息推送用户C至此,我们就完成了一条消息的发送与接收。2.4断线重连网络环境错综复杂,难免会有网络掉线、网络环境切换的情况,都会导致用户和ws服务的连接发生变化。一个比较典型的场景就是C端用户网络在4G和wifi之间进行切换,会导致ip变化,从而可能到导致用户和另外的ws服务再次建立连接。这种情况可能会导致消息重复发送、以及额外的资源消耗,所以要尽量避免。处理方式如下:即时清理。用户与ws服务建立连接时,当前ws服务查询redis中存储的用户连接信息。当连接信息与当前ws服务不一致时,当前ws服务更新redis存储信息、并发出广播mq消息,通知其他ws服务关闭与当前用户的连接通道。定时清理。除此之外,还需要前端同学配合,定时向连接的ws服务发送心跳消息,ws服务定时检测用户连接的心跳情况,关闭废弃的用户连接。三、总结以上就是我们在客服IM系统中使用WebSocket协议实现的消息收发的主要流程。要实现一个完整的IM系统,不仅要保证消息的实时性,消息的一致性、顺序性也很重要,还有网络异常等情况下的重连、用户心跳检测等,这些功能需要客户端同学一起协作才能完成。作者简介 李帅,转转履约中台研发工程师想了解更多转转公司的业务实践,欢迎点击关注下方公众号:
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2024-12-26 12:06 , Processed in 0.336282 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表