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

news2024/9/25 3:23:27

前言

上期视频讲解了自己关于聊天系统的设计的时候出现了一些不一样的声音。不了解情况的可以看上上期视频。这期主要是讨论。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.coloradmin.cn/o/1403801.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小白初探架构模式—常用的设计模式

目录 1.前言 2. 主从架构 2.1 主从架构的优点 2.2 主从架构的应用场景 2.3 主从架构的实现 2.4 主从架构的示例 3. 主从架构设计的延伸 3.1 主备模式 3.2 主从复制 3.3 集群分片 3.4 异地多活 4. 总结 1.前言 作为一个架构设计小白,我们通常用了很多种工具&…

Java和Redis实现一个简单的热搜功能

1. 前言 我们有一个简单的需求: 搜索栏展示当前登陆的个人用户的搜索历史记录,删除个人历史记录。用户在搜索栏输入某字符,则将该字符记录下来 以zset格式存储的redis中,记录该字符被搜索的个数以及当前的时间戳 (用…

4_机械臂运动学基础向量空间

在了解机械臂正解推导的过程中,几个问题一直困扰着我: 1、为什么3*3矩阵可以描述姿态?矩阵更进一步的意义是什么?姿态是否有其他的描述方式,如果有是什么? 2、机械臂法兰中心相对于基座的坐标,6…

开始学习vue2基础篇(初体验)

一、什么是VUE(官网 :https://cn.vuejs.org/) 官方给出的概念 :Vue (读音 /vju ː/ ,类似于 view) 是一套用 于构建用户界面的前端框架 渐进式的 JavaScript 框架 二、VUE的特点 易用 :基础只需HTML、CSS、…

[小程序]页面事件

一、下拉刷新 1.开启和配置 小程序中开启下拉刷新的方式有两种: ①全局开启下来刷新 在app.json的window节点中,设置enablePullDownRefresh设为ture。 ②局部开启下来刷新 在页面对应的json文件的的window节点中,设置enablePullDownRefresh设…

yolov5 opencv dnn部署 github代码

yolov5 opencv dnn部署 github代码 源码地址实现推理源码中作者的yolov5s.onnx推理条件python部署(因为python比较简单就直接介绍了)c部署 参考链接 源码地址 yolov5官网还提供的dnn、tensorrt推理链接本人使用的opencv c github代码,代码作者非本人,也是上面作者推…

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

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

【EI会议征稿通知】2024年第四届人工智能、自动化与高性能计算国际会议(AIAHPC 2024)

2024年第四届人工智能、自动化与高性能计算国际会议(AIAHPC 2024) 2024 4th International Conference on Artificial Intelligence, Automation and High Performance Computing 2024第四届人工智能、自动化与高性能计算国际会议(AIAHPC 2024)将于20…

不建Vivado工程,也能看Device视图

不建Vivado工程,也能看Device视图 在FPGA设计与开发中,Device视图和Package视图发挥着重要的作用。 在Device视图下: 可以查看FPGA芯片可用资源 例如:LUT、FF、BRAM、DSP、URAM等的个数; 可以查看关键资源的分布情…

搭建redis服务器

memcached MongoDB Redis 先把数据存储在内存里,如何定期把内存里数据存储在硬盘,一个Key一个Values redis集群存储数据在内存里面 mysql集群存储数据在硬盘里 netstat -utnlp | grep redis-server 查看端口tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 1970/redis-server 1 …

性能优化(CPU优化技术)-NEON指令介绍

「发表于知乎专栏《移动端算法优化》」 本文主要介绍了 NEON 指令相关的知识,首先通过讲解 arm 指令集的分类,NEON寄存器的类型,树立基本概念。然后进一步梳理了 NEON 汇编以及 intrinsics 指令的格式。最后结合指令的分类,使用例…

thinkadmin上传excel导入数据库

<div class="layui-form-item layui-inline"><button class="layui-btn layui-btn-primary">

正则化逻辑回归实战

一、题目 在正则化逻辑回归的练习中&#xff0c;我们将利用正则化的逻辑回归来预测来自制造工厂的微芯片是否通过了质量保证&#xff08;QA&#xff09;。在质量保证期间&#xff0c;每个微芯片都要经过各种测试&#xff0c;以确保其能够正常工作。假设您是该工厂的产品经理&am…

yolov8 opencv dnn部署 github代码

源码地址 本人使用的opencv c github代码,代码作者非本人 实现推理源码中作者的yolov8s.onnx 推理条件 windows 10 Visual Studio 2019 Nvidia GeForce GTX 1070 opencv4.7.0 (opencv4.5.5在别的地方看到不支持yolov8的推理&#xff0c;所以只使用opencv4.7.0) c部署 环境…

【MySQL】最左匹配原则

最左匹配原则 0x1 简单说下什么是最左匹配原则 顾名思义&#xff1a;最左优先&#xff0c;以最左边的为起点任何连续的索引都能匹配上。同时遇到范围查询(>、<、between、like&#xff09;就会停止匹配。 例如&#xff1a;b 2 如果建立(a&#xff0c;b&#xff09;顺序…

MySQL 索引优化:深入探索自适应哈希索引的奥秘

在数据库管理系统中&#xff0c;索引优化是提高查询性能的关键所在。MySQL 作为最流行的开源关系型数据库管理系统之一&#xff0c;提供了多种索引类型以满足不同查询场景的需求。其中&#xff0c;自适应哈希索引&#xff08;Adaptive Hash Index&#xff0c;AHI&#xff09;是…

Flink实战之DataStream API

接上文&#xff1a;Flink实战之运行架构 Flink的计算功能非常强大&#xff0c;提供的应用API也非常丰富。整体上来说&#xff0c;可以分为DataStreamAPI&#xff0c;DataSet API 和 Table与SQL API三大部分。 其中DataStream API是Flink中主要进行流计算的模块。 DateSet API是…

鸿蒙开发-UI-布局-栅格布局

鸿蒙开发-UI-布局 鸿蒙开发-UI-布局-线性布局 鸿蒙开发-UI-布局-层叠布局 鸿蒙开发-UI-布局-弹性布局 鸿蒙开发-UI-布局-相对布局 文章目录 前言 一、基本概念 二、格栅容器组件 1.栅格系统断点 2.布局的总列数 3.排列方向 4.子组件间距 三、格栅容器子组件 1.span 2.offset 3.…

【Unity小技巧】3D人物移动脚步和跳跃下落音效控制

文章目录 单脚步声多脚步声&#xff0c;跳跃落地音效播放不同材质的多脚步声完结 单脚步声 public AudioClip walkingSound; public AudioClip runningSound;//移动音效 public void MoveSound() {// 如果在地面上并且移动长度大于0.9if (isGround && moveDirection.s…

命令模式介绍

目录 一、命令模式介绍 1.1 命令模式定义 1.2 命令模式原理 1.2.1 命令模式类图 1.2.2 模式角色说明 二、命令模式的应用 2.1 需求说明 2.2 需求实现 2.2.1 抽象命令接口 2.2.2 订单类 2.2.3 厨师类 2.2.4 服务员类 2.2.5 具体命令类 2.2.6 测试类 三、命令模式总…