Jack Jiang

我的最新工程MobileIMSDK:http://git.oschina.net/jackjiang/MobileIMSDK
posts - 513, comments - 13, trackbacks - 0, articles - 1

2025年7月24日

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

1、引言

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

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

技术交流:

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

(本文已同步发布于:http://www.52im.net/thread-4860-1-1.html)

2、快速认识WebSocket

2.1 WebSocket 诞生背景

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

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

1

 

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

2

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

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

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

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

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

如:

ws://echo.websocket.org

wss://echo.websocket.org

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 之间的区别如下图所示:

3

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 模型的示意图(如下图所示)。

4

(图片引用自:https://www.networkingsphere.com/2019/07/what-is-osi-model.html

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

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

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

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

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

5

要理解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 的客户端/服务器关系:

6

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发送消息呢?

7

具体是:

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

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系统的实时性?


(本文已同步发布于:http://www.52im.net/thread-4860-1-1.html)

posted @ 2025-09-08 13:37 Jack Jiang 阅读(24) | 评论 (0)编辑 收藏

为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第46 期。

[- 1 -] 微信团队原创分享:Android版微信的臃肿之困与模块化实践之路

[链接] http://www.52im.net/thread-893-1-1.html

[摘要] 本文讲述微信 Android 版架构从分层到多进程、模块化的演进,及因代码膨胀重构模块化的过程与效果。


[- 2 -] 微信后台团队:微信后台异步消息队列的优化升级实践分享

[链接] http://www.52im.net/thread-801-1-1.html

[摘要] 本文分享了该组件2.0版本的功能特点及优化实践,希望能为类似业务(比如移动端IM系统等)的消息队列设计提供一定的参考。


[- 3 -] 微信团队原创分享:微信客户端SQLite数据库损坏修复实践

[链接] http://www.52im.net/thread-789-1-1.html

[摘要] 本文介绍微信客户端 SQLite 数据库损坏的原因,及优化空间占用、文件 sync 和备份 master 表以提升修复率的实践。


[- 4 -] 腾讯原创分享(一):如何大幅提升移动网络下手机QQ的图片传输速度和成功率

[链接] http://www.52im.net/thread-675-1-1.html

[摘要] 本文内容是由腾讯TMQ专项测试团队针对手机QQ图片上传速度和成功率问题,在各种复杂移动网络环境下的优化实践总结和整理而成。文章虽是针对手机QQ图片上传这一特定业务功能,但内容中大量涉及复杂移动网络环境下无线网络的特性、特点以及相关第一手测试数据,都是非常珍贵的,尤其值得移动端IM开发、消息推送这种深度依赖移动网络的应用开发者借鉴和参考。


[- 5 -] 腾讯原创分享(二):如何大幅压缩移动网络下APP的流量消耗(上篇)

[链接] http://www.52im.net/thread-696-1-1.html

[摘要] 该文讲述腾讯某产品因用户投诉背景流量高,经测试分析,通过优化将 24 小时流量降至 100KB 以下的过程。


[- 6 -] 腾讯原创分享(三):如何大幅压缩移动网络下APP的流量消耗(下篇)

[链接] http://www.52im.net/thread-697-1-1.html

[摘要] 本篇中将详细介绍我们的具体分析方法和实践优化思路,以及在优化过程中总结出来的法则等。


[- 7 -] 如约而至:微信自用的移动端IM网络层跨平台组件库Mars已正式开源

[链接] http://www.52im.net/thread-684-1-1.html

[摘要] 微信Mars到底有什么用呢?毫无疑问,微信Mars存在的前提就是为了更好的服务微信这个超级IM而存在,最适合干的活就是开发移动端IM了,当然由于提炼的很好,相信移动端推送技术等都是可以使用微信Mars作为网络层lib来使用,从而以微信的成果为起点开发出拥有更加优秀网络体验的移动端富网络应用。


[- 8 -] 微信Mars:微信内部正在使用的网络层封装库,即将开源

[链接] http://www.52im.net/thread-620-1-1.html

[摘要] 该文介绍微信 Mars 网络层封装库即将开源,涵盖其模块构成、特点、源起及跨平台开发经验。


[- 9 -]  开源libco库:单机千万连接、支撑微信8亿用户的后台框架基石 [源码下载]

[链接] http://www.52im.net/thread-623-1-1.html

[摘要] 该文介绍微信于 2013 年开源的 libco 库,其特性、背景、技术架构及对微信后台并发能力的提升作用。


[- 10 -] 微信新一代通信安全解决方案:基于TLS1.3的MMTLS详解

[链接] http://www.52im.net/thread-310-1-1.html

[摘要] 本文将详细介绍基于TLS 1.3的微信新一代通信安全协议mmtls。


[- 11 -] 微信团队原创分享:Android版微信后台保活实战分享(进程保活篇)

[链接] http://www.52im.net/thread-210-1-1.html

[摘要] 该文分享 Android 版微信进程保活实战,包括进程拆分、及时拉起及利用前台服务提升进程优先级等方案。


[- 12 -] 微信团队原创分享:Android版微信后台保活实战分享(网络保活篇) 

[链接] http://www.52im.net/thread-209-1-1.html

[摘要] 该文分享 Android 版微信网络保活实战,包括长连接心跳机制、动态心跳策略及保证消息实时的 notify 机制等。


[- 13 -] Android版微信从300KB到30MB的技术演进(PPT讲稿) [附件下载]

[链接] http://www.52im.net/thread-206-1-1.html

[摘要] ANDROID系统先天的弊端与产品需求研发过程的矛盾,推动着客户端架构演进史。这架车轮不断向前滚动,不断调整进化的架构,在为微信未来的高速成长保驾护航。我们一起来了解微信ANDROID客户端的架构演进过程。


[- 14 -] 微信团队原创分享:Android版微信从300KB到30MB的技术演进

[链接] http://www.52im.net/thread-205-1-1.html

[摘要] 该文讲述 Android 版微信从 300KB 到 30MB 的技术演进,分拓荒、成长、变革、进化、开放五阶段,介绍架构调整与问题解决。


[- 15 -] 如何解读《微信技术总监谈架构:微信之道——大道至简》

[链接] http://www.52im.net/thread-201-1-1.html

[摘要] 该文解读微信技术总监演讲,介绍微信以 “敏捷” 为核心,通过拆分系统、基础组件、监控等实现快速迭代与稳定服务。


👉52im社区本周新文:转转客服IM系统的WebSocket集群架构设计和部署方案,欢迎阅读!👈

我是Jack Jiang,我为自已带盐!https://github.com/JackJiang2011/MobileIMSDK/

posted @ 2025-09-04 12:59 Jack Jiang 阅读(17) | 评论 (0)编辑 收藏

1、引言

网络ping不通是网络中出现频率最高的故障之一,同时也是最让人抓狂的故障,谁没遇到过?今天就和你细说下ping不通的原因,看看能不能和你遇到的情况对上号。

技术交流:

cover-opti

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

本文已同步发布于:http://www.52im.net/thread-4857-1-1.html

2、系列文章

本文是系列文章中的第 20篇,本系列文章的大纲如下:

3、ping命令技术原理

了解ping命令原因,我们来通过一个实例来了解。

假定主机A的IP地址是 192.168.1.1 ,主机B的IP地址是 192.168.1.2 ,都在同一子网内,则当你在主机A上运行“Ping 192.168.1.2”后,都发生了些什么呢?

首先:Ping命令会构建一个固定格式的ICMP请求数据包,然后由ICMP协议将这个数据包连同地址“192.168.1.2”一起交给IP层协议(和ICMP一样,实际上是一组后台运行的进程)。

IP层协议将以地址“192.168.1.2”作为目的地址,本机IP地址作为源地址,加上一些其他的控制信息,构建一个IP数据包。并在一个映射表中查找出IP地址192.168.1.2所对应的物理地址(也叫MAC地址,这是数据链路层协议构建数据链路层的传输单元帧所必需的),一并交给数据链路层。

后者构建一个数据帧,目的地址是IP层传过来的物理地址,源地址则是本机的物理地址,还要附加上一些控制信息,依据以太网的介质访问规则,将它们传送出去。

1

主机B收到这个数据帧后,先检查它的目的地址,并和本机的物理地址对比,如符合则接收,否则丢弃。接收后检查该数据帧,将IP数据包从帧中提取出来,交给本机的IP层协议。

同样:IP层检查后,将有用的信息提取后交给ICMP协议,后者处理后,马上构建一个ICMP应答包,发送给主机A,其过程和主机A发送ICMP请求包到主机B一模一样。

直接说:就是利用网络上机器IP地址的唯一性,给目标IP地址发送一个数据包,再要求对方返回一个同样大小的数据包来确定两台网络机器是否连接相通,时延是多少。

上面的过程就是ping命令的原理:主机A收到了主机B的一个应答包,说明两台主机之间的去、回通路均正常,但也并不是所有网络都是正常的,下面我们来看ping不通的原因。

4、同网段ping不通的原因概述

ping命令不通,主要有两种情况:

  • 1)同网段内的ip地址ping不通;
  • 2)不同网段的ip地址ping不通。

各个情况不一样,我们首先来看同网段ping不通的两种情况。

5、同网段ping不通的情况1:“无法访问目标主机”

目的ip和源ip是同一网段的,ping的结果是“无法访问目标主机”,属于ping的请求没有发出。

我们来看下,ping同网段不存的ip地址:

2

ping的请求发出后,返回显示“无法访问目标主机"。

什么原因呢?说明此时ping的需求并没有成功发出。

这时要检查:

  • 1)对方是否开机?ip是否存在?
  • 2)有跨交换机vlan的话,检查对应的中间trunk链路是否导通?
  • 3)走直连路由是否正确?是否应该走默认路由,而走了直连路由;
  • 4)子网掩码是否错误;
  • 5)默认网关是否填写正确。

6、同网段ping不通的情况2:“超时(time out)”

目的ip和源ip是同一网段的,ping的结果是“超时或者time out” ,属于ping的请求已经成功发出了,但目标主机没有回复。

ping的请求发出后,返回显示“超时":

3

什么原因呢?这种情况是ping已经成功发出了,到达了主机,但是没有得到响应

要检查:

  • 1)检查下防火墙,防火墙禁止了对ping的回应;
  • 2)子网掩码的设置错误,导致不在同一个网段;
  • 3)设备硬件故障,导致设备没有对应的mac地址,无法生成路由表,而走默认路由;
  • 4)ip冲突,或ip地址与直联路由不在同一个网段;
  • 5)网关没有设置好。

7、 跨网段ping不通的原因概述

不同网段ping不通,通常的表现有“无法访问目标主机”、“time out”,但具体分析起来其实可能的原因是比较多的,我们还是一起来看下跨网段常见的原因吧。

8、 跨网段ping不通的情况1:“无法访问目标主机”

跨网段出现无法访问目标主机,说明请求没有成功发出,获取不了目的ip地址与mac地址。

4

可能出现的原因是:

  • 1)目的ip地址不存在;
  • 2)检查路由表是否有缺省的路由;
  • 3)检查arp表是否有网关的mac地址;
  • 4)有网关设置错误;
  • 5)走了默认路由。

9、 跨网段ping不通的情况2:“time out”

若显示 time out,表示 ping 的 request 消息已经发出,目的ip的网关已经获取到目的ip的mac地址,但是目的主机没有回复,或源主机无法收到。

这些应该检查回程路由和节点回程路由。

5

可能的原因有:

  • 1)检查下防火墙,是否拦截了ping的请求消息;
  • 2)检查经过节点的路由是否正确,或者是否有回程路由;
  • 3)回程路由的硬件网卡出口和ping的request的入口网卡不是同一个;
  • 4)交换机vlan对应的接口全部down了,导致vlan状态down,vlan的对应路由没有生成。

10、本文小结

当我们网络ping不通时,首先要看ping显示的结果是”无法访问目标主机“还是”超时“,再看是同网段,还是不同网段,采取相应的分析方法。

另外在分析与解决网络故障时,我们要熟练的了解ping、arp、tracert、route这几个命令的用法,可以快速的定位ping不通的原因。

尤其是这arp、tracert、route这三个命令的用法,解决故障非常方便。

11、参考资料

[1] 史上最通俗的集线器、交换机、路由器功能原理入门

[2] 通俗讲解,有了IP地址,为何还要用MAC地址?

[3] 外行也能读懂的网络硬件设备功能原理速成

[4] 每天都在用的Ping命令,它到底是什么?

[5] 能Ping通,TCP就一定能连接和通信吗?

[6] 什么是公网IP和内网IP?NAT转换又是什么鬼?

[7] 假如你来设计网络,会怎么做?

[8] 你真的了解127.0.0.1和0.0.0.0的区别?

[9] 一文搞懂localhost和127.0.0.1

[10] 深入操作系统,彻底搞懂127.0.0.1本机网络通信

[11] 冰山之下,一次网络请求背后的技术秘密

[12] 得物自研移动端弱网诊断工具的技术实践分享


(本文已同步发布于:http://www.52im.net/thread-4857-1-1.html)

posted @ 2025-08-28 11:51 Jack Jiang 阅读(27) | 评论 (0)编辑 收藏

1、基本介绍

1

RainbowTalk是一套基于开源即时通讯讯IM框架 MobileIMSDK 的产品级鸿蒙NEXT端IM系统。纯ArkTS编写、全新开发,没有套壳、也没走捷径,每一行代码都够“纯血”。与姊妹产品RainbowChatRainbowChat-Web 技术同源,历经考验。

☞ 详细介绍:http://www.52im.net/thread-4822-1-1.html
☞ 运行截图:http://www.52im.net/thread-4824-1-1.html (运行视频
☞ 下载体验:http://www.52im.net/thread-4825-1-1.html

2、MobileIMSDK开源工程

2

MobileIMSDK 是一套专门为移动端开发的开源IM即时通讯框架,超轻量级、高度提炼,一套API优雅支持UDP 、TCP 、WebSocket 三种协议,支持iOS、Android、H5、小程序、Uniapp、标准Java平台,服务端基于Netty编写。

工程同步开源地址:

开源仓库目录说明:

 proj_dir

MobileIMSDK框架由以下部分组成:

 3

MobileIMSDK框架的架构原理图:

4

v2.4 版更新内容

此版更新内容更多历史更新日志):

  • 1)[优化] 解决了聊天界面中语音消息下载、图片消息上传时消息气泡ui会闪烁的问题;
  • 2)[优化] 解决深色模式下聊天消息文字看不清的问题;
  • 3)[新增] 新增了大文件消息(支持断点续传、下载、查看文件内容等)。

部分新增功能运行截图(更多截图运行视频):

6

posted @ 2025-08-20 10:14 Jack Jiang 阅读(32) | 评论 (0)编辑 收藏

1、基本介绍

RainbowChat是一套基于MobileIMSDK通信框架的产品级移动端IM系统。RainbowChat源于真实运营的产品,不同于市面上某些开源或淘宝售卖的demo级代码,RainbowChat的产品前身已被成千上万真实的客户使用过,解决了大量的屏幕适配、细节优化、机器兼容问题。

RainbowChat可能是市面上唯一一款同时支持TCP、UDP两种通信协议的全源码IM产品(且核心通信层也是自主开发的)。RainbowChat是RainbowChat-Web 和鸿蒙NEXT产品RainbowTalk 的姊妹产品。

2、品质说明

❶ 源自真正运营的商业产品:RainbowChat的技术源于真实运营的商业产品。

❷ 它不是个Demo:不同于市面上某些开源或淘宝的demo级代码,RainbowChat已被成千上万真实的客户使用过,解决了大量的屏幕适配、细节优化、机器兼容问题。

❸ 简洁、精炼、优化、原生:
RainbowChat为了最小化开发者2次开发时的兼容性、可读性、可维护性难度,把框架的依赖、工具的依赖、各种库版本的依赖、运行环境的依赖都尽最大努力降到最低,极大降低开发者的开发环境和部署环境搭建的成本,达到最简洁、最精炼的目标。

* 截止目前:RainbowChat已全面深度适配最新Android系统,确保更佳的用户体验效果。

3、运行演示与安装体验

❶ 运行截图,详见:《Android端全部功能截图iOS端全部功能截图
❷ 下载体验,详见:《RainbowChat下载体验

4、功能简介

1、支持文本消息、语音留言消息、图片消息、大文件消息(支持断点续传)、短视频消息、个人名片、群名片、位置消息、Emoji表情、消息撤回、消息转发、消息引用、“@”功能、“扫一扫”功能等;
2、支持一对一陌生人聊天模式;
3、支持一对一正式好友聊天模式;
4、支持多对多群聊聊天模式,且自动防刷屏(仅限专业版)
5、完善的群组信息管理:建群、退群、解散、转让、邀请、踢人、群公告等 (仅限专业版)
6、完整的注册、登陆、密码找回等功能闭环;
7、个人中心功能:改基本信息、改个性签名、改头像、改密码等;
8、支持个人相册、个人语音介绍;
9、完整的礼物发送和积分管理子系统;
10、完整的离线消息/指令拉取机制;
11、完整的本地消息/指令缓存机制,节省网络流量;
12、完整的富媒体文件(语音、大文件、图片、短视频)缓存机制,节省网络流量;
13、完整的好友关系管理:查找好友、发出请求、处理请求、删除好友、好友备注等;
14、全功能实时语音聊天(完全自主开发,现在就可体验);
15、全功能实时视频聊天(完全自主开发,现在就可体验);
16、内置一完整“商城”模块,目前仅用于演示产品的完整性;
17、其它未提及的功能和特性请自行下载体验。

RainbowChat线上版本目前仅作演示和研究之用,运行环境配置最小化(仅1核1G和1MB带宽),请客观评估。

5、技术亮点 

1)持续打磨和升级至今(历经时间考验和大量客户面辐射的代码,可靠性、兼容性一定优于短时间内堆砌功能的产品);
2)底层算法库到上层功能,完全自主开发,技术资产可控;
3)同时支持TCP、UDP两种通信协议(可能是市面上能买到的唯一一款);
4)独有的UDP协议支持, 能更好地适应卫星网、移动弱网、嵌入式物联网等场景;
5)即时通讯核心层基于MobileIMSDK 工程,保证了业务代码与通信核心的高度分层(经验不足的IM产品是做不到这一点的);
6)支持完整的消息送达保证(QoS)机制,保证送达率,理论丢包率约为0.0001%;
7)独有的UDP协议无连接特性保证在高延迟、跨洲际、不同网络制式的恶恶劣环境中能稳定、可靠地运行;
8)基于 MobileIMSDK 工程的自有协议,未来的流量压缩对于APP端的节电控制和流量控制、服务端的网络吞吐等都有完全的控制能力;
9)完善的网络状况自动检测、断网重连等服务自动治愈能力;
10)核心算法和实现均为自主原创(历经8年,并非开源拼凑),保证了技术的持续改进、升级、扩展;
11)聊天协议兼容:实现了与RainbowChat-Web产品、鸿蒙NEXT产品RainbowTalk完全兼容的协议模型;
12)消息收发互通:实现了与RainbowChat-Web产品、鸿蒙NEXT产品RainbowTalk的无缝消息互通。

6、注册、登录和“个人中心”等

 

7、好友聊天功能

8、实时语音聊天功能

9、实时视频聊天功能

10、群聊功能

 

11、视频消息功能

12、位置消息功能

13、“大文件”消息(支持断点续传)

 

14、“扫一扫”功能

15、“搜索”功能

16、消息转发功能

17、消息引用功能

18、“@”功能

posted @ 2025-08-19 14:17 Jack Jiang 阅读(31) | 评论 (0)编辑 收藏

     摘要: 本文引用了后台技术汇一枚少年郎“大模型应用之:SSE流式响应”的内容,下文有修订和重新排版。1、引言文章介绍了SSE(Server-Sent Events)技术在大模型流式响应中的应用,包括其发展历程、ChatGPT流式输出原理、SSE技术特点及与WebSocket的对比,并提供了两种流式响应落地方案。* 相关阅读:《全民AI时代,大模型客户端和服务端的实时通信到...  阅读全文

posted @ 2025-08-14 14:31 Jack Jiang 阅读(47) | 评论 (0)编辑 收藏

     摘要: 本文由携程技术Butters分享,原题“干货 | 日均流量200亿,携程高性能全异步网关实践”,下文有修订和重新排版。1、引言本文分享的是携程API网关全异步改造的实践分享,包括从Zuul 1.0同步架构升级为基于Netty的全异步架构,通过RxJava实现业务流程异步化,结合流式转发、ZGC等技术显著提升性能,并构建控制面实现多协议统一治理与模块化编排。 &nb...  阅读全文

posted @ 2025-08-07 12:01 Jack Jiang 阅读(54) | 评论 (0)编辑 收藏

本文由转转平台业务负责人王计宽分享,原题“转转push系统的演进之路”,下文有修订和重新排版。

1、引言

顾名思义,push就是就是借助厂商通道把消息发送给用户的一种方式,一般用于用户的召回和活动触达,和即时通讯IM在业务上稍有区别,但技术逻辑上是相通的,不在此处赘述。

本文将从0开始讲讲转转千万级用户量消息推送系统的架构演进和迭代过程,以及遇到的常见问题的解法,希望能带给你启发。

 
 

2、术语解释

以下是本文涉及到的一些技术术语的解释:

  • 1)业务属性:运营、业务、功能类推送;
  • 2)推送范围: 月活、全量、定向推送、个性化推送;
  • 3)目标端:一般是安卓、ios客户端;
  • 4)通道:小米、华为、魅族、apns等手机厂商的常驻连接;
  • 5)token: 用于设备的唯一标识,由APP本身生成;
  • 6)devicetoken:用于推送的唯一标识,一般由厂商提供;
  • 7)推送量:推送消息的数量;
  • 8)到达率:消息到达手机的数量/推送量;
  • 9)点击率:用户点击量/推送量。

3、当前架构概览

现有的架构支持后台推送、业务推送以及个性化推荐推送。

以下是相关推送业务的特点:

  • 1)后台推送:一般会有标准的格式,特点是时间短、推送量大,比如8点秒杀活动;
  • 2)业务推送 :一般都是业务触发,特点是实时性强、优先级高,如订单支付消息;
  • 3)个性化推送:经常会和用户画像相关,特点是策略复杂、内容多样,需要有风控管理,如猜你喜欢等推荐策略。

4、技术背景——PM想推送运营活动

步骤:

  • 1)PM从大数据平台上导出一部分用户集合;
  • 2)RD写程序调用push接口。

问题:

  • 1)N个PM都有需求,RD..........;
  • 2)8点有一个突发情况,9点来一波;
  • 3)每周末都要活动,推送。

解决方案:

  • 1)搭建一个后台,支持根据用户ID上传,解放开发资源;
  • 2)支持按照时间推送,支持文案可配;
  • 3)支持安卓、IOS分端推送。

遗留的问题:PM上传了一个浏览过手机类目用户的数据集合,数据量太大,上传超时。PS:用户量大概在1000w左右+,大约300M左右的文件。

提示:

  • 1)上传的时间大约在1分钟左右, 需要联系运维设置最长的链接时间,否则nginx会主动断开;
  • 2)上传由同步上传,改成进度条的方式,让上传者可以看到进度;
  • 3)上传和数据处理分开(我们当时是边上传,边解析文件比较慢)。

5、希望重大节日能够即时通知到活跃用户

5.1 实时推

问题描述:重大节日,推送全量用户、月活、周活数据,每次仅是文案不同,PM都需要跑大数据系统,效率太低,当天数据不可获得,平均推送需要1个多小时。

要求:

  • 1)1亿的数据能够在一小时内推送完毕;
  • 2)要覆盖到某一个周期内的用户(比如一个月);
  • 3)支持预览,支持暂停。

分析-数据量(以2000w月活为例):

  • 1) 全量用户认定为近3个月(90天)内访问过转转的用户;
  • 2) 预估所有设备数量在5000w左右;
  • 3) 预计占用的空间为5G。

分析-性能(以2000w月活为例):

  • 1) 老系统push的平均QPS是2000;
  • 2) 2000W/2000/60/2=83~=1小时20分钟,希望能够在12分钟内推送完毕(一个小时推送1亿的指标)。

难点分析:

  • 1) 数据做到准实时,怎么算准实时;
  • 2)2000千万的数据12分钟内推送完毕,QPS~=2.7w, 如何让性能提升13.5倍(2k提升到2.7w的并发)。

解决方案:

  • 1) 数据的准实时:实时接收kafka日志消息,每分钟把清洗的数据进行合并;
  • 2)需要存储的数据要素:用户的token信息(注意不是devicetoken);此token的活跃时间(时间戳);
  • 3)用户数据存储选型。

最终选择redis的zset进行存储。

5.2 如何提高发送性能

首先分析之前之所以慢的原因:

  • 1) 单线程发送;
  • 2) 受到厂商通道的限制,单接口耗时100ms+(IOS通道)。

解决方案:

  • 1)区分安卓、IOS单独发送,原始程序只负责从redis拿到数据后拼装成固定结构(简单拼接操作速度很快);
  • 2)把数据推送到MQ中(可以不用MQ吗?);
  • 3)多个消费订阅者,进行消费(容易扩展),通过厂商 通道推送出去。

注意:iOS通道,我们用的pushy开源工具,特定情况下无法持续推送消息,需要定时检查,重新创建通道。

最后的效果:push推送的QPS达到3w+,推送能力提升的同时,也引发了以下问题。

5.3 业务服务器扛不住瞬时流量

问题描述:当push的推送能力上去了之后, 用户的瞬时访问问题随之而来

  • 1)瞬时的流量高峰,导致超时增多;
  • 2)部分请求到达性能瓶颈,超时增多,页面打不开~,见下图。

push落地效果:

解决办法:

  • 1)最简单的办法:加机器;
  • 2)业务接口多线程、服务治理,消峰(ratelimit);
  • 3)app核心功能增加缓存,保证不会出现白屏的情况;
  • 4)减少活动路径。(一般push都会落地到某一个活动页面。但是正常打开push,都会先进入首页,在跳转到活动页面。给push的消息增加特殊埋点,如果是此类push消息,就直接 跳转到特定页面,减少中间环节。)

6、AB实验室

问题描述:有一天晚上9点推送了一个运营类的push,发现居然点击率超级高,是文案优秀?还是流量高峰?

要求:存在多个推送文案,系统能够择优选择点击率最好的进行推送?

解决方式:加入AB测的能力,先进行少量用户推送,根据AB的效果,择优推送.

7、整合全部手机厂商级ROOM推送通道

新的问题:之前安卓的通道我们仅有小米通道+个推(个推达到率一般,做托底), 如果我们向华为手机推送消息,也是通过小米通道是很难到达的。

要求:

  • 1)希望能够把大厂的厂商通道都接进来;
  • 2)推送的消息能够根据用户最后登录的通道进行优化推送;
  • 3)速度不能慢下来。

解决方式:

  • 1) 搭建tokens服务,能够批量判定devicetoken的最后使用的厂商(需要依赖转转客户端上报);
  • 2) 分库分表的方式进行存储;
  • 3) 数据热备到缓存中。

效果:当年统计能够提高10%的达到率。

8、消息送达监控

一般的监控维度包含:

  • 1)产品线:转转、找靓机等等;
  • 2)客户端:安卓、IOS;
  • 3)指标:发送、到达、点击的数量和比例;
  • 4)数据对比:模板、周期;
  • 5)通道:小米、华为、vivo、apns。

9、 本文小结

现状:

  • 1) 推送月活10分钟;
  • 2) 支持暂停、预览,实时查看推送数据量;
  • 3) 支持提前AB看效果;
  • 4) 支持不在线,微信通知;
  • 5) 支持防打扰;
  • 6) 支持优先级和厂商高优通道。

提高速度:预加载+缓存+多线程+合理的数据结构+批量处理+合理布局+特殊埋点。

折中方案:异步上传、限流控制、降级处理、分层解耦、补偿通知。

10、 参考资料

[1] 极光推送系统大规模高并发架构的技术实践分享

[2] 魅族2500万长连接的实时消息推送架构的技术实践分享

[3] 专访魅族架构师:海量长连接的实时消息推送系统的心得体会

[4] 基于WebSocket实现Hybrid移动应用的消息推送实践(含代码示例)

[5] 一个基于长连接的安全可扩展的订阅/推送服务实现思路

[6] 实践分享:如何构建一套高可用的移动端消息推送系统?

[7] Go语言构建千万级在线的高并发消息推送系统实践(来自360公司)

[8] 腾讯信鸽技术分享:百亿级实时消息推送的实战经验

[9] 京东京麦商家开放平台的消息推送架构演进之路

[10] 技术干货:从零开始,教你设计一个百万级的消息推送系统

[11] 爱奇艺WebSocket实时推送网关技术实践

[12] 喜马拉雅亿级用户量的离线消息推送系统架构设计实践

[13] 消息推送技术干货:美团实时消息推送服务的技术演进之路

[14] 揭秘vivo百亿级厂商消息推送平台的高可用技术实践

[15] 得物从零构建亿级消息推送系统的送达稳定性监控体系技术实践

[16] B站千万级长连接实时消息系统的架构设计与实践

(本文已同步发布于:http://www.52im.net/thread-4852-1-1.html)

posted @ 2025-07-24 15:58 Jack Jiang 阅读(58) | 评论 (0)编辑 收藏

Jack Jiang的 Mail: jb2011@163.com, 联系QQ: 413980957, 微信: hellojackjiang