netty多节点群发消息

单节点发送

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S0yfBCdv-1678007703358)(/Users/a1/Library/Application Support/typora-user-images/image-20230305171239637.png)]

最基本的通讯方式

存在问题

  1. server单点
  2. 并发受限
  3. 不支持扩容

架构图

在这里插入图片描述

协议制定

from_uid   发送者id
to_uid     接收者id:集合,1v1和选中聊天
room_id    群聊时房间号
msg_type   消息类型:ping/pong/ack/登录信息/聊点信息
chat_type  聊天类型:群聊,1V1,选中聊天
timestamp  发送时间
content    内容

发送消息流程

  1. client启动成功后,连接注册中心,获取netty-server列表地址。(参考hadoop的namenode和datanode,nacos,eureka,rocketmq)
    1. https://blog.csdn.net/Nuan_Feng/article/details/108237385
  2. 用户发送消息后,client通过策略【如负载均衡】获取挑选netty-server。
    1. 这里可参考【路由策略】 https://blog.csdn.net/Nuan_Feng/article/details/115619448
  3. client初次连接,netty-server将client和channel等信息封装成session,并存储sessionMap,以及redis中。
    1. sessionMap,key = uid,value => session
  4. netty-server发送消息
    1. 1v1,从sessionMap查询出to_uid,查询出则发送接受者。查询不出来,则从redis中通过to_uid作为key拉取用户信息。通过消息队列推送。可通过redis发布订阅,以及mq推送。
    2. 群聊,通过房间号作为key,拉取房间所有uid信息(这里可能一个房间号有几百个人,通过client传输就比较耗时)。通过uid集合,从sessionMap查询,查询的到则直接发送。查询不到则通过uid作为key拉取用户信息。在进行推送。
    3. 选中聊天,同群聊。
  5. netty-server通知客户端发送成功。

注册中心

服务剔除

服务注册

心跳检测

Netty-server

心跳检测:间歇发送ping给client。netty中IdeaStateHandler支持。

超时剔除:清除会话以及redis信息

用户连接:存储会话到进程和redis

用户退出:清除会话以及redis信息。channelInactive方法实现

server退出:注册钩子函数清除redis

client

用户连接

断线重连

心跳发送

用户退出

其他情况

离线消息

接收者不在线,处理流程如下

在这里插入图片描述

  1. 当用户B上线时,拉取A发送的消息。
  2. server从db拉取
  3. 服务器返回给用户B离线消息
  4. 用户B接收到后,向服务端发送ack
  5. server从db删除

存在问题:用户B存在很多好友,登录时需要拉取所有好友消息。

优化一:一次性拉取各个好友的离线消息数量,然后界面显示每个好友的消息数量。用户B进入某个好友的时,在按需拉取信息。

优化二:只拉取当前页面的好友的发送消息数量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值