一、消息类型
分析需求,将消息分为三类
1.提醒(Remind)
谁对一样属于谁的事物做了什么操作
- sender:触发者
- target:事物
- action:触发操作
- targetOwner:事物所有者(通过订阅维护)
节省资源,适合Pull
2.私信(Message)
谁对谁发送什么内容
- sender:发送者
- receiver:接收者
- content:内容
实时性要求,适合Push
3.公告(Announce)
系统全体公告
- sender:发送者
- content:内容
接收者太多,适合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.订阅
- subscribe(userId, targetId, targetType, …actions)
- 遍历actions,每个动作新插一条Subscription
- unsubscribe(userId, targetId ,targetType)
- 删除对应Subscription
2.创建Notice
- createRemind(type,targetId, targetType, action, senderId, content)
- 新插一条提醒Notice/公告Notice
- createMessage(content, senderId, receiverId)
- 新插一条私信Notice
- 新插一条UserNotice,并关联新建的Notice
3.拉取Notice/Notice数量
- pullNotice(userId)
- 根据Subscription查询更新提醒Notice/公告Notice
- (拉取Notice)新插一条UserNotice,并关联查询出来的提醒Notice
- (Notice数量)查询更新提醒Notice,返回数量,不新建UserNotice
4.查询UserNotice
- getUserNotice(userId)
- 查询UserNotice
5.阅读UserNotice
- read(userNoticeIds)
- 更新UserNotice,isRead设为true
五、业务流程
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”