即时消息技术剖析与实战
袁武林
微博研发中心技术专家
24187 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 25 讲
即时消息技术剖析与实战
15
15
1.0x
00:00/00:00
登录|注册

21 | 期末实战:为你的简约版IM系统,加上功能

ACK机制
应用层心跳
消息自动更新
未读数提示
消息存储设计
简单的文本消息收发
用户登录
增加了应用层心跳、ACK机制等新功能
使用基于WebSocket的长连接
期末实战优化了IM系统设计的功能
服务端响应心跳包
客户端定时发送心跳包
通过定时器进行消息重推
服务端等待客户端ACK包
发送消息后通过Redis发布订阅进行消息推送
WebSocketRouterHandler处理消息接收
服务端使用Java NIO框架Netty来实现
使用WebSocket对象的send方法发送消息
支持客户端断线后的自动重连
支持客户端的心跳机制和双端的idle超时断连
支持消息推送的ACK机制和重推机制
消息收发均通过长连接进行通信
支持基于WebSocket的长连接
加入高级功能
使用WebSocket的长连接
针对消息收发进行功能优化
采用基于HTTP短轮询的方式来实现消息的实时性
实现层面相对简单
增加了基本功能
实现了简易版的聊天系统
小结
应用层心跳
消息推送的ACK
核心消息收发逻辑处理
WebSocket长连接
功能介绍
期末实战
期中实战
作者:袁武林
标题:期末实战:为你的简约版IM系统,加上功能
参考文章

该思维导图由 AI 生成,仅供参考

你好,我是袁武林。
在期中实战中,我们一起尝试实现了一个简易版的聊天系统,并且为这个聊天系统增加了一些基本功能。比如,用户登录、简单的文本消息收发、消息存储设计、未读数提示、消息自动更新等。
但是期中实战的目的,主要是让你对 IM 系统的基本功能构成有一个直观的了解,所以在功能的实现层面上比较简单。比如针对消息的实时性,期中采用的是基于 HTTP 短轮询的方式来实现。
因此,在期末实战中,我们主要的工作就是针对期中实战里的消息收发来进行功能优化。
比如,我们会采用 WebSocket 的长连接,来替代之前的 HTTP 短轮询方式,并且会加上一些课程中有讲到的相对高级的功能,如应用层心跳、ACK 机制等。
希望通过期末整体技术实现上的升级,你能更深刻地体会到 IM 系统升级前后,对使用方和服务端压力的差异性。相应的示例代码我放在了GitHub里,你可以作为参考来学习和实现。

功能介绍

关于这次期末实战,希望你能够完成的功能主要包括以下几个部分:
支持基于 WebSocket 的长连接。
消息收发均通过长连接进行通信。
支持消息推送的 ACK 机制和重推机制。
支持客户端的心跳机制和双端的 idle 超时断连。
支持客户端断线后的自动重连。

功能实现拆解

确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

在本文中,作者详细介绍了如何在期末实战中为简约版IM系统增加功能,重点是对消息收发功能进行优化。文章首先介绍了期中实战中实现的简易聊天系统,并介绍了其基本功能。随后,对期末实战需要完成的功能进行了详细介绍,包括支持长连接、消息推送的ACK机制和重推机制、客户端的心跳机制等。作者还重点介绍了WebSocket长连接的实现,包括客户端JS的实现和服务端的实现,并给出了相关的示例代码。此外,文章还介绍了消息推送的ACK机制和应用层心跳的实现。通过这些内容,读者可以深入了解IM系统的技术升级和实现过程。整体而言,本文为读者提供了对WebSocket长连接实现的详细指导和示例代码,有助于读者深入理解IM系统的技术升级和实现过程。文章还提出了思考题,引发读者思考和讨论。通过本文,读者可以获得对IM系统设计和优化的全面认识,为技术实践提供了有益的指导。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《即时消息技术剖析与实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(19)

  • 最新
  • 精选
  • 墙角儿的花
    有个大佬给我讲,用websocket在弱网下因为网络阻塞,tcp滑动窗口,不断断网重连,websocket自己又有自己的心跳机制,导致服务端压力很大,云云,我还没搞明白究竟什么意思。难道tcp本身不也是这样?

    作者回复: 网络阻塞和滑动窗口都是底层传输层的事情呀,和上层的websocket没啥关系,如果有由于传输内容大导致拥塞的问题需要解决的是websocket封装的业务内容是否足够精简,是否需要进一步压缩,和websocket本身无关。websocket自带的心跳机制浏览器很多并不自动支持,所以一般都是自己应用层来实现,自带的心跳机制只要服务端过滤掉也并不会影响连接本身的稳定性。所以最好还是通过双端抓包来具体分析,也有可能是由于链路中间的反向代理等服务导致的。

    2019-10-14
    7
  • lecy_L
    咨询个问题,望解答。 网关机记录用户和链接的信息,finnal在jvm里面的。现在我有一个这样的场景,一个房间(类似群聊)有N个用户,按照上面的说法我要怎么链接到同一个服务器(多应用情况),或者是怎么通知其他链接?在线等,急

    作者回复: 直播那一章课程里有讲到哈,简单的话就用redis的发布订阅就可以。所有网关机订阅所有房间消息,各网关机认领本机维护的房间用户信息并下推。

    2019-10-14
    2
    4
  • 墙角儿的花
    回答问题,关闭清除客户端连接和待ACK列表

    作者回复: 👍

    2019-10-14
    4
  • 铁柱
    ack机制里提到“服务端会在这个连接维度的存储里,初始化一个起始值为 0 的序号(tid)”,但是老师您的代码里实际上所有的channel是公用一个websockethandler,也就是使用同一个对象,那么这个concurrenhashmap实际上是被所有连接共享的吧,这样设计难道不会造成ack消息确认被覆盖吗(eg:channel1中tid为1的ack被channel2中tid为1的ack确认覆盖了)

    作者回复: 嗯,看了一下确实存在这个问题,感谢反馈,最新代码已经修复这个问题啦,把待ack列表放入到channel的attr里面了,避免复用导致混乱的问题。

    2019-10-28
    2
  • yangzi
    回答问题:如果多次下推仍然没有成功,关闭客户端连接,将未回执的消息存储为离线消息。

    作者回复: 有点小问题:离线消息建议在消息存储完后就存上,这样离线buffer里的消息是连续的,便于后续检查获取。另外还需要清除 待ack列表中这条消息。

    2019-10-14
    2
  • 不焦躁的程序员
    老师,咨询个问题。为啥代码中,即使用了消息发送,也使用了下推消息(发送redis topic,然后监听到了topic之后,下推消息),那这样客户端岂不是会收到两遍消息?

    作者回复: 针对发送方设备,不需要回推这条消息,但是需要能更新最新一条消息的“版本号”或者“时间戳”,因为这个是在服务端才生成的,这样发送方设备就就能正确更新本地的消息“版本号”了。

    2020-01-21
    1
  • rachel.li
    老师你好,我电脑redis已经启动,但是项目启动的时候报错启动不了redis。debug查看了错误说creating server tcp..........no such file or directory,然后谷歌了按网上的办法重新按顺序重新连接redis,启动项目还是报那个错,但是我其他项目是正常的。您有什么思路不

    作者回复: 你说的这个是示例代码运行的问题吗?示例代码默认会通过embedded 的方式在jvm里自动启动一个兼容redis协议的模拟redis供使用。如果本机还额外起了redis的话需要看下端口是否存在冲突。

    2019-11-06
    3
  • joylee109
    老师,你好。websocket 想服务器传送数据的时候, sender_id 是明文传送嘛?现在用户已经登录了网站,认证方式可能是:session ,或者 jwt 方式,或者其他方式。既然用户已经登录,为什么还要在传送数据到后端的时候,将sender_id 明文带上呢?感觉明文传送 sender_id 到后端不安全。

    作者回复: 对于经过认证的用户,实现上可以不需要再带上发送方uid,这里是想网关机不依赖认证信息,实现上网关机从session获取完全没问题。另外这里只是个演示demo,线上的话起码会走tls的wss协议。

    2019-10-14
  • yuanjm
    咨询个问题,望解答。 ack重推时,通过线程池的延迟任务执行,如果5秒内有大量消息,放入延迟队列会不会导致OOM,如果重推失败了,休眠2秒占用了线程池的线程,导致其他在该执行的时间点的需要重推的消息排队等待,导致延迟队列越来越长,而且导致重试时间一直延长。 有没有更贴近生产环境的设计方案啊,现在在为ack重传问题发愁。
    2021-04-30
    2
    2
  • Niud
    老师,websocket和mqtt开发即时通讯,这两种技术优缺点可以说一下吗?在做技术选型
    2020-08-24
    2
收起评论
显示
设置
留言
19
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部