上期视频讲解了自己关于聊天系统的设计的时候出现了一些不一样的声音。不了解情况的可以看上上期视频。这期主要是讨论。IM聊天系统设计方案多。我的先说明一下自己的技术背景互相之间才能更好的理解。
本期对应视频
目前已经写的文章有。并且有对应视频版本。
git项目地址 【IM即时通信系统(企聊聊)】点击可跳转
sprinboot单体项目升级成springcloud项目 【第一期】
前端项目技术选型以及页面展示【第二期】
分布式权限 shiro + jwt + redis【第三期】
给为服务添加运维模块 统一管理【第四期】
微服务数据库模块【第五期】
netty与mq在项目中的使用(第六期)】
分布式websocket即时通信(IM)系统构建指南【第七期】
分布式websocket即时通信(IM)系统保证消息可靠性【第八期】
回答这个童鞋的问题。咱们让GPT来回答一下。这个是我们公司正在使用的GTP4工具,感兴趣的话可以给小伙伴们分享一下。
我的系统中使用到了消息确认和消息重传。童鞋下图的也是一种设计思路,通过长轮询。不过我这里使用的是ws推送。你的模型相当于是拉取消息。我是推送。没有谁对谁错之分。都是对的。后面如果网友感兴趣我可以两种模型都分享一下。还有很多设计方案,还有数据不落库的等等。像微信聊天记录都是存储在本地的。
WebSocket (WS) 协议
HTTP 协议
在IM聊天系统中,WebSocket协议通常是更好的选择,因为它提供了更低的延迟和更高效的服务器资源利用。HTTP轮询机制在没有WebSocket的情况下是一个备选方案,但它的实时性和效率通常不如WebSocket。
这个是关于http和ws的一个对比。
在分布式系统中,Netty的Channel实例不能直接在不同的Netty服务器之间共享,因为Channel代表的是一个到具体客户端的活跃连接,它是与特定的JVM和网络套接字绑定的。不过,可以通过一些设计模式和中间件来实现类似“共享”的效果,以便在分布式Netty服务器之间传递消息。
以下是一些实现分布式Netty服务器间通信的策略:
消息队列(如RabbitMQ, Kafka):可以使用消息队列作为中间件来在不同服务器间传递消息。当一个Netty服务器接收到消息并需要将其传递给另一个服务器上的客户端时,它可以将消息发布到消息队列中。另一个服务器可以订阅这些消息,并将其发送到相应的客户端。
发布/订阅系统(如Redis Pub/Sub):类似于消息队列,发布/订阅系统允许服务器发布消息到一个通道,其他服务器订阅这个通道并接收消息,然后将消息转发给本地连接的客户端。
集群管理(如ZooKeeper, etcd):这些工具可以帮助管理分布式系统中的状态和配置,包括Netty服务器的信息。虽然它们不直接处理消息传递,但可以用来跟踪哪些客户端连接到哪个服务器,以及如何路由消息。
分布式缓存(如Hazelcast, Ignite):分布式缓存可以用来存储和共享数据,包括用户的会话信息和状态。这样,即使客户端连接到了集群中的不同服务器,相关的状态信息也可以被检索和同步。
gRPC或REST API:Netty服务器可以通过gRPC或REST API与其他服务器通信。当需要将消息发送到另一个服务器时,可以通过API调用来完成。
自定义分布式通信协议:在某些情况下,可能需要实现一个自定义的分布式通信协议,用于在服务器之间同步状态和消息。
在所有这些情况下,关键是要有一个可靠的消息传递机制,确保消息能够从一个服务器传递到另一个服务器,并最终传递到正确的客户端。这通常涉及到消息的序列化和反序列化,以及网络传输。此外,还需要处理消息的顺序、重试逻辑、错误处理和可能的消息重复问题。
回答:以上 ,基本是想要是直接在服务器之间同步需要自定义通信协议等。看情况吧。我目前使用的是分布式缓存记录住用户信息,然后使用mq进行不同服务之间推送。
有问题欢迎讨论,有不足的地方指正。chatgpt说的也不一定对,提供一个参考,欢迎讨论。