IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 消息系统设计 -> 正文阅读

[大数据]消息系统设计

目录

存储消息

发件箱

收件箱

消息结构

消息类型

拓展

校验内容

拉取消息


PS:

最近在做一些消息相关的内容,对消息做了一下总结,包括发送、接收、存储等,记录一下,欢迎大家交流拓展。

存储消息

redis临时存储,数据结构zset

kafka异步持久化到db,由于消息表数据量比较大,msg表按照createdTime分区。

发件箱

sendBox? redis zset实现。

zadd nx,key:固定前缀+senderId,score:msgId,member:clientId

发件箱的作用?

  1. 发件箱根据雪花算法生成统一的msgId。
  2. 主要作用是为了防止同一条消息重复发送。
    1. 客户端发送消息时,有clientId,防止弱网导致客户端显示发送失败,但实际上服务端成功处理的情况。
    2. 相同clientId的消息不会发到receiver的收件箱。

最大消息限制

最多保留100条消息,zremrangebyrank

收件箱

inBox:redis zset实现。

zadd,key:固定前缀+receiverId,score:msgId,member:msg

发送消息最终是添加到receiver的收件箱,这样拉取消息时,每个人拉取自己的收件箱即可。

最大消息限制

最多保留最近一个月的消息,zremrangbyscore

消息结构

消息类型

发消息设计的数据结构需要支持文本、语音、图片、视频等格式。

可以统一定义一个字段为msgType,然后区分不同类型,定义枚举,每一种类型对应一种结构。

如msgType为“text”,对应结构为:

“text": {

??? "value": "发送文本消息"

}

如msgType为”image“,对应结构为:

”image": {

??? "url": "https://xxxxxxxx",

??? "width": 80,

??? "height": 80

}

其他类型同理。

最终类似于这种:

type Message struct {

    Id int64 `json:"id"`

    ClientId string `json:"clientID"`

    MsgType string `json:"msgType"`

    Text *Text `json:"text,omitempty"`

    Image *Image `json:"image,omitempty"`

    Audio *Audio `json:"audio,omitempty"`

    Video *Video `json:"video,omitempty"`

    ....

}

拓展

发送消息肯定不止这几种类型,其它一些特殊样式的如卡片、系统提示信息、问卷、跳转等等。

上面的结构也是易于拓展的,只要定义不同的msgType及其对应的结构,前后端统一结构即可。

校验内容

敏感词服务校验,接口调用判定。

资金来往、索要联系方式等风险提示。

风险用户提示,审核服务,接口调用判定。

拉取消息

  1. 客户端根据since和limit来拉取消息,每次取本地最新消息的msgId作为since。
  2. 服务端从zset中拉取msgId大于since的消息(zrangeByScore),小于since的消息会从zset中删除。
    1. 大于since且在limit之间的消息不能删除,因为不能判定客户端正常收到这些消息。
    2. 每次删除since之前的消息,能保证删除的消息,一定是被客户端收到的(不然since不可能传过来)。
  3. 触发拉取消息时机:
    1. 收到普通push、静默push。厂商提供的push接口。
    2. 每间隔5s拉取消息

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-11-25 08:11:03  更:2021-11-25 08:13:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:23:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码