从零开始实现交友网站+推荐系统之聊天模块

1 篇文章 0 订阅

从零开始实现交友网站+推荐系统之聊天模块架构分析

需求分析

我们需要实现的功能主要有两大部分,第一部分是在线的用户可以实时的发送消息,第二部分是如果用户不在线,我们需要将消息离线存储起来。当用户上线时,我们需要向用户推送消息。
前端界面主要参考了野火im的网页前端页面
在这里插入图片描述

  • 左边部分聊天列表,主要内容是:发送者资料、未读消息条数、最近一条消息内容、最近一条消息发送时间、消息全局流水号ID。
  • 右边聊天内容,主要有聊天内容,发送时间

系统架构

在这里插入图片描述
用户上线:

  1. 用户上线时,通过websocket与netty服务器建立连接
  2. 更新用户在线状态
  3. netty服务器将用户上线信息发布到消息队列的上线主题中
  4. 逻辑服务器监听用户上线主题,得知用户上线信息
  5. 从数据库拉取消息列表,通过netty服务器推送至用户端

用户发送消息:

  1. netty服务器判断用户是否在线
  2. 如果用户在线,将用户消息直接转发至用户对应所在netty服务器channel,并且向消息队列发布存储用户信息消息
  3. 用户不在线,直接向消息队列发布存储用户信息消息,并且标记未未读消息,更新用户未读消息条数。这么做的原因是IM消息的发送属于高吞吐场景,直接操纵DB很容易就把DB搞挂了,所以离线消息在落地入库前,可以先扔到MQ消息队列中,再由单独部署的消费者来有节奏地存储到DB中;
  4. 通过订阅更新用户消息主题来异步更新数据库,减轻数据库压力

客户端拉取消息方法

总共有三种模式

  1. 推模式:指的是新消息时服务器主动推给所有端
  2. 拉模式:由前端主动发起拉取消息的请求
  3. 推拉结合模式:有新消息时服务器会先推一个有新消息的通知给前端,前端接收到通知后就向服务器拉取消息

推模式是指服务器通过websocket向客户端推送消息,但有可能出现的问题就是用户可能此时已经不在线了,但是服务器仍然认为客户端在线并且推送消息。虽然netty有心跳机制来解决这样的问题,但还是可能丢失一个心跳周期内的消息
拉模式一般请求非即时性消息,类似于用户历史聊天记录消息
推拉模式用户发新消息时服务器推送一个通知,然后前端请求最新消息列表。这种模式就可以解决有可能出现的数据丢失问题

参考文章
从新手到专家:如何设计一套亿级消息量的分布式IM系统
【IM产品开发系列之Redis发布订阅】SpringBoot2.0中使用redis的发布订阅模式
https://blog.csdn.net/netease_im/article/details/83387420

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沉默终止

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值