21 | 期末实战:为你的简约版IM系统,加上功能
该思维导图由 AI 生成,仅供参考
功能介绍
功能实现拆解
- 深入了解
- 翻译
- 解释
- 总结
在本文中,作者详细介绍了如何在期末实战中为简约版IM系统增加功能,重点是对消息收发功能进行优化。文章首先介绍了期中实战中实现的简易聊天系统,并介绍了其基本功能。随后,对期末实战需要完成的功能进行了详细介绍,包括支持长连接、消息推送的ACK机制和重推机制、客户端的心跳机制等。作者还重点介绍了WebSocket长连接的实现,包括客户端JS的实现和服务端的实现,并给出了相关的示例代码。此外,文章还介绍了消息推送的ACK机制和应用层心跳的实现。通过这些内容,读者可以深入了解IM系统的技术升级和实现过程。整体而言,本文为读者提供了对WebSocket长连接实现的详细指导和示例代码,有助于读者深入理解IM系统的技术升级和实现过程。文章还提出了思考题,引发读者思考和讨论。通过本文,读者可以获得对IM系统设计和优化的全面认识,为技术实践提供了有益的指导。
《即时消息技术剖析与实战》,新⼈⾸单¥59
全部留言(19)
- 最新
- 精选
- 墙角儿的花有个大佬给我讲,用websocket在弱网下因为网络阻塞,tcp滑动窗口,不断断网重连,websocket自己又有自己的心跳机制,导致服务端压力很大,云云,我还没搞明白究竟什么意思。难道tcp本身不也是这样?
作者回复: 网络阻塞和滑动窗口都是底层传输层的事情呀,和上层的websocket没啥关系,如果有由于传输内容大导致拥塞的问题需要解决的是websocket封装的业务内容是否足够精简,是否需要进一步压缩,和websocket本身无关。websocket自带的心跳机制浏览器很多并不自动支持,所以一般都是自己应用层来实现,自带的心跳机制只要服务端过滤掉也并不会影响连接本身的稳定性。所以最好还是通过双端抓包来具体分析,也有可能是由于链路中间的反向代理等服务导致的。
2019-10-147 - lecy_L咨询个问题,望解答。 网关机记录用户和链接的信息,finnal在jvm里面的。现在我有一个这样的场景,一个房间(类似群聊)有N个用户,按照上面的说法我要怎么链接到同一个服务器(多应用情况),或者是怎么通知其他链接?在线等,急
作者回复: 直播那一章课程里有讲到哈,简单的话就用redis的发布订阅就可以。所有网关机订阅所有房间消息,各网关机认领本机维护的房间用户信息并下推。
2019-10-1424 - 墙角儿的花回答问题,关闭清除客户端连接和待ACK列表
作者回复: 👍
2019-10-144 - 铁柱ack机制里提到“服务端会在这个连接维度的存储里,初始化一个起始值为 0 的序号(tid)”,但是老师您的代码里实际上所有的channel是公用一个websockethandler,也就是使用同一个对象,那么这个concurrenhashmap实际上是被所有连接共享的吧,这样设计难道不会造成ack消息确认被覆盖吗(eg:channel1中tid为1的ack被channel2中tid为1的ack确认覆盖了)
作者回复: 嗯,看了一下确实存在这个问题,感谢反馈,最新代码已经修复这个问题啦,把待ack列表放入到channel的attr里面了,避免复用导致混乱的问题。
2019-10-282 - yangzi回答问题:如果多次下推仍然没有成功,关闭客户端连接,将未回执的消息存储为离线消息。
作者回复: 有点小问题:离线消息建议在消息存储完后就存上,这样离线buffer里的消息是连续的,便于后续检查获取。另外还需要清除 待ack列表中这条消息。
2019-10-142 - 不焦躁的程序员老师,咨询个问题。为啥代码中,即使用了消息发送,也使用了下推消息(发送redis topic,然后监听到了topic之后,下推消息),那这样客户端岂不是会收到两遍消息?
作者回复: 针对发送方设备,不需要回推这条消息,但是需要能更新最新一条消息的“版本号”或者“时间戳”,因为这个是在服务端才生成的,这样发送方设备就就能正确更新本地的消息“版本号”了。
2020-01-211 - rachel.li老师你好,我电脑redis已经启动,但是项目启动的时候报错启动不了redis。debug查看了错误说creating server tcp..........no such file or directory,然后谷歌了按网上的办法重新按顺序重新连接redis,启动项目还是报那个错,但是我其他项目是正常的。您有什么思路不
作者回复: 你说的这个是示例代码运行的问题吗?示例代码默认会通过embedded 的方式在jvm里自动启动一个兼容redis协议的模拟redis供使用。如果本机还额外起了redis的话需要看下端口是否存在冲突。
2019-11-063 - 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-3022
- Niud老师,websocket和mqtt开发即时通讯,这两种技术优缺点可以说一下吗?在做技术选型2020-08-242