Knewone提醒设置
所以我们需要再维护一个表:SubscriptionConfig,来存放用户的提醒设置。
并且,当用户没有提醒设置的时候,可以使用系统提供的一套默认设置:defaultSubscriptionConfig
聚合
如果我发布了一篇文章《XXX》,在我不在线的时候,被评论了10遍,当我一上线的时候,应该是收到十条信息类似于:「谁谁谁评论了你的文章《XXX》」?
还是应该收到一条信息:「甲、乙、丙、丁...评论了你的文章《XXX》」?
知乎在聚合上做的很优秀,要知道他们要实现这个还是挺有技术的:
知乎的消息机制,在技术上如何设计与规划?
网站的消息(通知)系统一般是如何实现的?
关于这部分功能,我们还没有具体的实现方法,暂时也无法讲得更加详细。⊙﹏⊙
五个实体
通过上面的分析,大概知道做这个消息系统,需要哪些实体类:
- 用户消息队列 UserNotify
- 用户 User
- 订阅 Subscription
- 订阅设置 SubscriptionConfig
- 消息 Notify
- 通告 Announce
- 提醒 Remind
- 信息 Message
行为分解
说了这么多,整理一下整个消息流程的一些行为:
- 系统或者管理员,创建消息
- createNotify (make announce | remind | message)
- 用户,订阅消息,取消订阅
- subscribe, cancelSubscription
- 用户管理订阅设置
- getSubscriptionConfig, updateSubscriptionConfig
- 用户,拉取消息
- pullNotify (pull announce | remind | message | all)
- 用户,查询消息队列
- getUserNotify(get announce | remind | message | all)
- 用户阅读消息
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
模型设计
Notify
id : {type: 'integer', primaryKey: true},
Save Remind
消息表,我们需要target
、targetType
字段,来记录该条提醒所关联的对象。而action
字段,则记录该条提醒所关联的动作。
比如消息:「小明喜欢了文章」
则:
target = 123,
Save Announce and Message
当然,Notify还支持存储公告和信息。它们会用到content
字段,而不会用到target
、targetType
、action
字段。
UserNotify
id : {type: 'integer', primaryKey: true},
我们用UserNotify来存储用户的消息队列,它关联一则提醒(Notify)的具体内容。
UserNotify的创建,主要通过两个途径:
- 遍历订阅(Subscription)表拉取公告(Announce)和提醒(Remind)的时候创建
- 新建信息(Message)之后,立刻创建。
Subscription
target : {type: 'integer', required: true},
订阅,是从Notify表拉取消息到UserNotify的前提,用户首先订阅了某一个目标的某一个动作,在此之后产生这个目标的这个动作的消息,才会被通知到该用户。
如:「小明关注了产品A的评论」,数据表现为:
target: 123,
这样,产品A下产生的每一条评论,都会产生通知给小明了。
SubscriptionConfig
action: {type: 'json', required: true},
不同用户可能会有不一样的订阅习惯,在这个表中,用户可以统一针对某种动作进行是否订阅的设置。而默认是使用系统提供的默认配置:
defaultSubscriptionConfig: { 'comment' : true,
在这套模型中,targetType
、action
是可以根据需求来扩展的,例如我们还可以增加多几个动作的提醒:hate
被踩、update
被更新....诸如此类。
配置文件 NotifyConfig
服务层 NotifyService
NotifyService拥有以下方法:
- createAnnounce(content, sender)
- createRemind(target, targetType, action, sender, content)
- createMessage(content, sender, receiver)
- pullAnnounce(user)
- pullRemind(user)
- subscribe(user, target, targetType, reason)
- cancelSubscription(user, target ,targetType)
- getSubscriptionConfig(userID)
- updateSubscriptionConfig(userID)
- getUserNotify(userID)
- read(user, notifyIDs)
各方法的处理逻辑如下:
createAnnounce(content, sender)
- 往Notify表中插入一条公告记录
createRemind(target, targetType, action, sender, content)
- 往Notify表中插入一条提醒记录
createMessage(content, sender, receiver)
- 往Notify表中插入一条信息记录
- 往UserNotify表中插入一条记录,并关联新建的Notify
pullAnnounce(user)
- 从UserNotify中获取最近的一条公告信息的创建时间:
lastTime
- 用
lastTime
作为过滤条件,查询Notify的公告信息
- 新建UserNotify并关联查询出来的公告信息
pullRemind(user)
- 查询用户的订阅表,得到用户的一系列订阅记录
- 通过每一条的订阅记录的
target
、targetType
、action
、createdAt
去查询Notify表,获取订阅的Notify记录。(注意订阅时间必须早于提醒创建时间)
- 查询用户的配置文件SubscriptionConfig,如果没有则使用默认的配置DefaultSubscriptionConfig
- 使用订阅配置,过滤查询出来的Notify
- 使用过滤好的Notify作为关联新建UserNotify
subscribe(user, target, targetType, reason)
- 通过reason,查询NotifyConfig,获取对应的动作组:
actions
- 遍历动作组,每一个动作新建一则Subscription记录
cancelSubscription(user, target ,targetType)
- 删除
user
、target
、targetType
对应的一则或多则记录
getSubscriptionConfig(userID)
- 查询SubscriptionConfig表,获取用户的订阅配置
updateSubscriptionConfig(userID)
- 更新用户的SubscriptionConfig记录
getUserNotify(userID)
- 获取用户的消息列表
read(user, notifyIDs)
- 更新指定的notify,把isRead属性设置为true
时序图
提醒的订阅、创建、拉取
提醒的订阅、创建、拉取
我们可以在产品创建之后,调用NotifyService.subscribe
方法,
然后在产品被评论之后调用NotifyService.createRemind
方法,
再就是用户登录系统或者其他的某一个时刻调用NotifyService.pullRemind
方法,
最后在用户查询消息队列的时候调用NotifyService.getUserNotify
方法。
公告的创建、拉取
公告的创建、拉取
在管理员发送了一则公告的时候,调用NotifyService.createAnnounce
方法,
然后在用户登录系统或者其他的某一个时刻调用NotifyService.pullAnnounce
方法,
最后在用户查询消息队列的时候调用NotifyService.getUserNotify
方法。
信息的创建
信息的创建
信息的创建,只需要直接调用NotifyService.createMessage
方法就可以了,
在下一次用户查询消息队列的时候,就会查询这条信息。
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
相关文章
相关视频
网友评论
文明上网理性发言,请遵守 新闻评论服务协议
我要评论