分布式websocket IM聊天系统相关问题问答【第九期】

前言

上期视频讲解了自己关于聊天系统的设计的时候出现了一些不一样的声音。不了解情况的可以看上上期视频。这期主要是讨论。IM聊天系统设计方案多。我的先说明一下自己的技术背景互相之间才能更好的理解。
本期对应视频

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

回答问题一 消息可靠机制和接收方有什么关系。

回答这个童鞋的问题。咱们让GPT来回答一下。这个是我们公司正在使用的GTP4工具,感兴趣的话可以给小伙伴们分享一下。
在这里插入图片描述

在这里插入图片描述
我的系统中使用到了消息确认和消息重传。童鞋下图的也是一种设计思路,通过长轮询。不过我这里使用的是ws推送。你的模型相当于是拉取消息。我是推送。没有谁对谁错之分。都是对的。后面如果网友感兴趣我可以两种模型都分享一下。还有很多设计方案,还有数据不落库的等等。像微信聊天记录都是存储在本地的。
在这里插入图片描述

回答问题二 http 与ws在这里插入图片描述

在这里插入图片描述

WebSocket (WS) 协议

  • 全双工通信:WebSocket提供了全双工通信能力,允许服务器和客户端之间进行双向实时通信。
  • 持久连接:一旦WebSocket连接建立,它会保持开放状态,直到客户端或服务器明确地关闭连接。
  • 实时性:WebSocket非常适合需要实时通信的应用,如IM聊天系统,因为它可以立即将消息推送给用户B。
  • 消息发送流程:用户A发送消息 -> 服务器接收并处理消息(可能包括落库)-> 服务器通过WebSocket连接将消息推送给用户B。

HTTP 协议

  • 半双工通信:HTTP是基于请求-响应模式的,通常是客户端发送请求,服务器响应请求。
  • 非持久连接:HTTP/1.1虽然支持持久连接,但每个请求/响应交换后连接可能会关闭,而HTTP/2提供了多路复用。
  • 轮询/长轮询:在WebSocket出现之前,IM系统可能使用HTTP轮询或长轮询来模拟实时通信,但这会增加延迟和服务器负载。
  • 消息发送流程:用户A发送消息(HTTP请求)-> 服务器接收并处理消息(可能包括落库)-> 服务器响应用户A的请求 -> 用户B定期轮询服务器以获取新消息。

在IM聊天系统中,WebSocket协议通常是更好的选择,因为它提供了更低的延迟和更高效的服务器资源利用。HTTP轮询机制在没有WebSocket的情况下是一个备选方案,但它的实时性和效率通常不如WebSocket。

这个是关于http和ws的一个对比。

回答问题3 分布式情况下channel怎么共享。

在这里插入图片描述

在这里插入图片描述

在分布式系统中,Netty的Channel实例不能直接在不同的Netty服务器之间共享,因为Channel代表的是一个到具体客户端的活跃连接,它是与特定的JVM和网络套接字绑定的。不过,可以通过一些设计模式和中间件来实现类似“共享”的效果,以便在分布式Netty服务器之间传递消息。

以下是一些实现分布式Netty服务器间通信的策略:

  1. 消息队列(如RabbitMQ, Kafka):可以使用消息队列作为中间件来在不同服务器间传递消息。当一个Netty服务器接收到消息并需要将其传递给另一个服务器上的客户端时,它可以将消息发布到消息队列中。另一个服务器可以订阅这些消息,并将其发送到相应的客户端。

  2. 发布/订阅系统(如Redis Pub/Sub):类似于消息队列,发布/订阅系统允许服务器发布消息到一个通道,其他服务器订阅这个通道并接收消息,然后将消息转发给本地连接的客户端。

  3. 集群管理(如ZooKeeper, etcd):这些工具可以帮助管理分布式系统中的状态和配置,包括Netty服务器的信息。虽然它们不直接处理消息传递,但可以用来跟踪哪些客户端连接到哪个服务器,以及如何路由消息。

  4. 分布式缓存(如Hazelcast, Ignite):分布式缓存可以用来存储和共享数据,包括用户的会话信息和状态。这样,即使客户端连接到了集群中的不同服务器,相关的状态信息也可以被检索和同步。

  5. gRPC或REST API:Netty服务器可以通过gRPC或REST API与其他服务器通信。当需要将消息发送到另一个服务器时,可以通过API调用来完成。

  6. 自定义分布式通信协议:在某些情况下,可能需要实现一个自定义的分布式通信协议,用于在服务器之间同步状态和消息。

在所有这些情况下,关键是要有一个可靠的消息传递机制,确保消息能够从一个服务器传递到另一个服务器,并最终传递到正确的客户端。这通常涉及到消息的序列化和反序列化,以及网络传输。此外,还需要处理消息的顺序、重试逻辑、错误处理和可能的消息重复问题。

回答:以上 ,基本是想要是直接在服务器之间同步需要自定义通信协议等。看情况吧。我目前使用的是分布式缓存记录住用户信息,然后使用mq进行不同服务之间推送。

结尾

有问题欢迎讨论,有不足的地方指正。chatgpt说的也不一定对,提供一个参考,欢迎讨论。
请添加图片描述

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/423250.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PLAN方法:解决 GAN 生成医学图像 Latent 空间中的隐私保护方法

PLAN方法:解决 GAN 生成医学图像 Latent 空间中的隐私保护方法 PLAN 原理StyleGAN 生成视网膜图k-SALSA 生成视网膜图PLAN方法 生成视网膜图 总结 PLAN 原理 论文:https://arxiv.org/abs/2307.02984 代码:https://github.com/perceivelab/P…

Ps:直线工具

使用直线工具 Line Tool,可以绘制直线或带箭头的直线,可以是矢量形状,或者是基于像素的形状,或者是路径(形状轮廓)。 快捷键:U ◆ ◆ ◆ 常用操作方法与技巧 1、按住 Shift 键拖拽&#xff0c…

Element组件完整引入、按需引入、样式修改(全局、局部)、简单安装less以及npm命令证书过期等

目录 一、npm 安装二、完整引入三、按需引入四、样式修改1.按需加载的全局样式修改2. 局部样式修改1. 在 css 预处理器如 less scss 等直接使用::v-deep2. 只能用在原生 CSS 语法中:/deep/ 或者 >>> 五、 拓展:npm 安装less报错,提示证书过期六…

Java-泛型与通配符

泛型基础 泛型示例 泛型的作用 泛型的语法 注意事项 1.泛型只能用引用类型实例化而非基本类型 自定义泛型 自定义泛型类 2中数组不能初始化是因为不知道要开辟多大的空间 3 类加载是会加载静态方法 此时泛型的具体类型并没有被确定 因为对象没有被 声明或实例化 自定义泛…

Sqoop与Flume的集成:实时数据采集

将Sqoop与Flume集成是实现实时数据采集和传输的重要步骤之一。Sqoop用于将数据从关系型数据库导入到Hadoop生态系统中,而Flume用于数据流的实时采集、传输和处理。本文将深入探讨如何使用Sqoop与Flume集成,提供详细的步骤、示例代码和最佳实践&#xff0…

Nginx 基础使用

目录结构 进入Nginx的主目录我们可以看到这些文件夹 client_body_temp conf fastcgi_temp html logs proxy_temp sbin scgi_temp uwsgi_temp其中这几个文件夹在刚安装后是没有的,主要用来存放运行过程中的临时文件 client_body_temp fastcgi_temp proxy_temp scg…

定向减免!函数计算让轻量 ETL 数据加工更简单,更省钱

作者:澈尔、墨飏 业内较为常见的高频短时 ETL 数据加工场景,即频率高时延短,一般均可归类为调用密集型场景。此场景有着高并发、海量调用的特性,往往会产生高额的计算费用,而业内推荐方案一般为攒批处理,业…

eNSP学习——配置通过FTP进行文件操作

原理概述: FTP(File Transfer Protocol,文件传输协议)是在TCP/IP网络和Internet上最早使用的协议之一,在TCP/IP协议族中属于应用层协议,是文件传输的Internet标准。主要功能是向用户提供本地和远程主机…

一篇文章带你了解 什么是u(ustd)带你了解他的前世今生

在数字货币的繁荣世界中,USDT无疑是其中一位重要的角色。它的前世今生,是一个从无到有,从小到大,经历了种种波折和争议的故事。 2014年11月下旬,一个名为Realcoin的注册地为马恩岛和香港的公司决定改变自己的名字&…

【test】ubuntu系统盘制作

u盘:16G 系统:win11 工具:rufus 镜像版本:ubuntu20.04 Rufus 是一款格式化和创建 USB 启动盘的辅助工具。 本软件适用于以下场景: 需要将可引导 ISO (Windows、Linux、UEFI 等) 刻录到 USB 安装媒介的情况 需要处理未安装操作系统…

Flutter 自定义AppBar实现滚动渐变

1、使用ListView实现上下滚动。 2、使用Stack:允许将其子部件放在彼此的顶部,第一个子部件将放置在底部。所以AppBar,写在ListView下面。 3、MediaQuery.removePadding:当使用ListView的时候发现,顶部有块默认的Padd…

macbookpro怎么恢复出厂设置

如果你的MacBook Pro出现了一些系统问题,或者你想将其出售或转让,恢复出厂设置是一个好的选择。下面是一些步骤,告诉你如何恢复你的MacBook Pro到出厂设置: 步骤一:备份 在恢复出厂设置之前,好的习惯是备…