分布式websocket即时通信(IM)系统保证消息可靠性【第八期】

这篇具有很好参考价值的文章主要介绍了分布式websocket即时通信(IM)系统保证消息可靠性【第八期】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

b站上面本期视频版本,观看视频食用更佳!点击即可跳转,找不到视频可以直接搜索我 目前叫 呆呆呆呆梦

目前已经写的文章有。并且有对应视频版本。
git项目地址 【IM即时通信系统(企聊聊)】点击可跳转
sprinboot单体项目升级成springcloud项目 【第一期】
前端项目技术选型以及页面展示【第二期】
分布式权限 shiro + jwt + redis【第三期】
给为服务添加运维模块 统一管理【第四期】
微服务数据库模块【第五期】
netty与mq在项目中的使用(第六期)】
分布式websocket即时通信(IM)系统构建指南【第七期】

前言

上一篇中说了一下项目的构成,比较枯燥,一些基本构造方面,这一片呢,一定会更加枯燥。这一篇讲报文协议。后端嘛,不像前端花里胡哨,就是更有内涵一点。为什么这块需要着重说呢,因为聊天系统中需要设计一套保证消息可靠的机制。否则消息都不知道发过去了没有。需要通过报文去保证这些。这些都是需要去设计的。具体设计思路如下。

1.如何保证两个用户之间消息可靠

主要有参考这个
IM消息送达保证机制实现
这篇文章有详细明确了一下消息可靠性的保证;

1.1 正常逻辑

分布式websocket即时通信(IM)系统保证消息可靠性【第八期】,分布式,websocket,网络协议
这个是正常的发送逻辑。客户A发送给服务器,服务器发送给客户B。这个是之前的逻辑,就是正常的发送逻辑;msg:A用于确认客户端消息发送到服务器。但是在这种逻辑中,客户A是不清楚客户B是否收到消息的;,所以由此引入一个确认机制。

1.2带有确认机制

client-B向im-server发送一个ack请求包,即ack:R
im-server在成功处理后,回复client-B一个ack响应包,即ack:A
则im-server主动向client-A发送一个ack通知包,即ack:N

你会发现,一条消息的发送,分别包含(上)(下)两个半场,即msg的R/A/N三个报文,ack的R/A/N三个报文。一个应用层即时通讯消息的可靠投递,共涉及6个报文,这就是im系统中消息投递的最核心技术(如果某个im系统不包含这6个报文,不要谈什么消息的可靠性)。

理论知识讲解完毕,下面是实战演练;

2.具体实践

分布式websocket即时通信(IM)系统保证消息可靠性【第八期】,分布式,websocket,网络协议

如果没有收到ack消息,涉及到消息的重发。
然后中间涉及到消息的重发,在报文中需要字段来确认是否是消息的重发。直接实操一遍看一下经过的报文吧。然后看具体的报文;

0 注册消息报文

{"type":7,"params":{"openid":"56C02DF0516B4B079ABFCEC08169E577","userName":"123","loginStatus":"1"}}

1 用户A:发送消息报文

{
	"type": 1,
	"params": {
		"msgid": "17301",
		"toMessageId": "1879878-NKCNO-NKNK",
		"message": "我要发消息啦",
		"fileType": 0,
		"isretry": false
	}
}

2 用户A:客户端确认

{
	"type": -1,
	"params": {
		"date": "Thu Jan 18 18:38:27 CST 2024",
		"msgid": "17301",
		"online": true,
		"message": "我要发消息啦",
		"isretry": "false"
	},
	"status": 200
}

3 用户B:收到消息

{
	"activeTime": 1705574308625,
	"from": "system",
	"messageId": "17301",
	"msg": {
		"type": 2,
		"params": {
			"fromUser": {
				"openid": "56C02DF0516B4B079ABFCEC08169E577",
				"loginStatus": "1",
				"userName": "123"
			},
			"message": "我要发消息啦",
			"fileType": "0"
		},
		"status": 200
	},
	"msgType": 1,
	"requestId": "08808d38-3d4c-4b80-9f9c-9c19dfe1163e",
	"sessionId": "192.168.56.1:8084_1879878-NKCNO-NKNK_20240118183556",
	"to": ["1879878-NKCNO-NKNK"],
	"trigger": 1
}

4 用户B:发送ACK

{"type":15,"params":{"from":"client","msgid":"17301","fromUser":"56C02DF0516B4B079ABFCEC08169E577","toUser":"1879878-NKCNO-NKNK"}}

5 用户B:收到服务器确认消息

{"type":16,"params":{"date":"Thu Jan 18 18:38:28 CST 2024","message":"17301"},"status":200}

6 用户A:客户端收到ack消息 流程结束

{
	"activeTime": 1705574308647,
	"from": "system",
	"messageId": "17301",
	"msg": {
		"type": 17,
		"status": 200
	},
	"msgType": 1,
	"requestId": "85a16365-6a1d-4ce1-8f99-c49a583ed1d0",
	"sessionId": "192.168.56.1:8084_56C02DF0516B4B079ABFCEC08169E577_20240118183655",
	"to": ["56C02DF0516B4B079ABFCEC08169E577"],
	"trigger": 1
}

7 消息落库报文

{
	"activeTime": 1705574309525,
	"from": "system",
	"messageId": "17301",
	"msg": {
		"type": 18,
		"status": 200
	},
	"msgType": 1,
	"requestId": "4ad1af60-56e4-4718-a668-8d94243a2173",
	"sessionId": "192.168.56.1:8084_56C02DF0516B4B079ABFCEC08169E577_20240118183655",
	"to": ["56C02DF0516B4B079ABFCEC08169E577"],
	"trigger": 1
}

基本步骤如上.文章来源地址https://www.toymoban.com/news/detail-815192.html

到了这里,关于分布式websocket即时通信(IM)系统保证消息可靠性【第八期】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【分布式websocket】聊天系统消息加密如何做

    前言 先介绍一下对称加密算法,在介绍一下加密流程,然后是介绍一下查询加密消息的策略。然后结合现有技术架构然后去选型。 决定采用客户端解密。简而言之就是采用对称服务端加密。然后将加密内容存储到消息表的content字段。然后客户拉取content字段 然后解密。拉取

    2024年04月14日
    浏览(32)
  • 分布式WebSocket消息推送系统设计与实现

    作者:禅与计算机程序设计艺术 现如今,随着物联网、云计算、移动互联网、大数据等新技术的兴起,分布式系统成为越来越多企业面临的挑战。在分布式系统中,服务间通信是一个重要且复杂的课题,基于TCP/IP协议族的传输层协议之上的应用层协议比如HTTP协议、RPC(Remo

    2024年02月05日
    浏览(35)
  • [Etcd]分布式系统中如何使用乐观锁保证Mysql和Etcd数据最终一致性

    在写业务代码时,很多时候需要保证数据存储在不同中间件中的一致性。以笔者为例,就遇到了需要将mysql中已存储的数据转存到etcd中,同时还要考虑到并发场景下如何保证数据最终一致性的问题。 该问题形象地表示的话,可以将时间线展开如下 服务A1更新db数据为 {\\\"key1\\\":

    2024年02月02日
    浏览(44)
  • Dobbo---分布式系统通信方式

    RMI ( Remote Method Invocation 远程方法调用) 图1.1 客户端-服务端通信方式 客户端将要调用的方法及参数,打包为辅助对象,通过网络socket,发送给服务端辅助对象。服务端接收后,会进行解包,找出真正被调用的方法,然后将执行结果,依次再返回回去。服务端辅助对象进行打包

    2024年01月17日
    浏览(46)
  • 自研分布式IM-HubuIM RFC草案

    基本协议 评估标准 【性能】协议传输效率,尽可能降低端到端的延迟,延迟高于200ms用户侧就会有所感知 【兼容】既要向前兼容也要向后兼容 【存储】减少消息包的大小,降低空间占用率,一个字节在亿级别并发之下也是一亿个字节 【计算】减少编解码时造成的CPU使用率的

    2024年02月11日
    浏览(53)
  • 如何保证分布式系统中服务的高可用性:应对 ZooKeeper Leader 节点故障的注册处理策略

    作者:zhaokk 在现代分布式系统中,高可用性是一个至关重要的。分布式系统中的各个组件需要保证在各种异常情况下仍然能够正常工作,确保系统的稳定性和可靠性。ZooKeeper(以下简称为zk)作为一种常用的分布式协调服务,为分布式系统中的各种任务提供了基础支持

    2024年02月11日
    浏览(58)
  • 分布式系统消息通信技术:MOM与RPC

    中间件(Middleware)是处于操作系统和应用程序之间的软件,也有人认为它应该属于操作系统中的一部分。人们在使用中间件时,往往是一组中间件集成在一起,构成一个平台(包括开发平台和运行平台),但在这组中间件中必须要有一个通信中间件,即中间件+平台+通信,这

    2024年02月11日
    浏览(32)
  • IM即时通讯-N-如何保证消息的可靠性展示

    客户端如何在推拉结合的模式下保证消息的可靠性展示? 原则: server拉取的消息一定是连续的 原则: 端侧记录的消息的连续段有两个作用: 1. 记录消息的连续性, 即起始中间没有断层, 2. 消息连续, 同时意味着消息是最新的,消息不是过期的。 同步协议过载(SyncGapOv

    2023年04月09日
    浏览(39)
  • 去中心化分布式即时通讯引擎tim v2.0.1 发布

    Tim即时通讯引擎的去中心化分布式架构具有去中心化、分布式数据存储、支持大规模用户、即时通讯、安全性和隐私保护、高可用性和容错性以及可扩展性和灵活性等特点。能够有效地解决大规模分布式系统的设计和实现问题,并提高系统的性能、可用性和扩展性。 tim v2.0

    2024年01月23日
    浏览(34)
  • 分布式项目14 使用dubbo进行系统之间的通信,不用jsonp

    使用jsonp技术,前端的ajax需要把方法的datatype写成jsonp,并且在controller类中返回值类型是jsonPObject,这个是特有的java的api,用于jsonp技术。 分布式项目可以使用dubbo框架。 第一步:导入dubbo依赖 第二步: 编辑服务provider,在公共模块创建dubbo接口 在jt-common中创建: 第三步:在

    2024年02月08日
    浏览(80)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包