02 消息系统设计

Wu Jun 2019-12-25 15:59:03
08 系统设计 > 2 业务设计

一、消息类型

分析需求,将消息分为三类

1.提醒(Remind)

谁对一样属于谁的事物做了什么操作

节省资源,适合Pull

2.私信(Message)

谁对谁发送什么内容

实时性要求,适合Push

3.公告(Announce)

系统全体公告

接收者太多,适合Pull

二、消息逻辑

1.生产端

不同触发条件创建三种消息

2.中间连接

“推”的方式,创建消息同时创建用户消息

“拉”的方式通过“订阅”延迟创建用户消息

3.消费端

用户不时从用户消息获取三种消息

三、消息实体

1.消息(Notice)

生产端,提醒、私信和公告三类合一,公告设计为带内容的提醒

字段名 类型 含义 备注
id Long 消息id
content String 消息内容 公告和私信
type Integer 消息类型 消息类型,1: 提醒,2:私信,3: 公告
targetId Long 目标ID 公告和提醒
targetType String 目标类型 公告和提醒
action String 操作类型 公告和提醒
senderId Long 发送者ID 0为系统
createTime Datetime 创建时间
2.用户消息(UserNotice)

消费端,绑定用户与消息

字段名 类型 含义 备注
id Long 用户消息id
userId Long 用户id
noticeId Long 消息id
isRead Byte 是否已读 0否1是
createTime Datetime 创建时间
3.订阅(Subscription)

中间连接,维护“拉”的消息列表

字段名 类型 含义 备注
id Long 订阅id
userId Long 用户id
targetId Long 目标id
targetType String 目标类型
action String 操作类型
isDeleted Byte 是否删除 0否1是
createTime Datetime 创建时间

四、方法设计

1.订阅
2.创建Notice

3.拉取Notice/Notice数量

4.查询UserNotice
5.阅读UserNotice

五、业务流程

1.提醒和公告
1)订阅消息
2)创建提醒
3)拉取消息

新登陆或其他策略,从消息表(消息队列)拉取属于用户的提醒,并创建用户提醒消息

4)查询消息

查询用户消息队列,获取消息

2.私信
1)创建私信

消息发送,创建私信消息,并直接创建接收方私信消息

2)查询消息

查询用户消息队列

六、kafka

1.创建订阅
字段名 类型 含义 备注
content String 消息内容 公告和私信
type Integer 消息类型 消息类型,1: 提醒,2:私信,3: 公告
targetId Long 目标ID 公告和提醒
targetType String 目标类型 公告和提醒
action String 操作类型 公告和提醒
senderId Long 发送者ID 0为系统
2.创建消息
字段名 类型 含义 备注
id Long 订阅id
userId Long 用户id
targetId Long 目标id
targetType String 目标类型
action String 操作类型

TODO

分页加载

若未读数量过多,只加载部分,剩下的再请求时再生成

缓生成

从消息表拉取消息的时候,只统计数量,点击查询消息的时候再生成用户消息

订阅设置

订阅设置,通知策略

消息聚合

提醒时,多条相同target的通知和合并为一条,“sender1、sender2……action了你的target”