概述
系统通知是一个很常见且必要的需求,当发生点赞、关注、评论操作的时候,系统就会给相应的用户发送通知。
对于流量巨大的社交网站,系统通知的需求是非常庞大的,那如果只是和私信或者发帖功能一样单纯地用 Ajax 做个异步,显然是远远不够的。所以为了保证系统的性能,这里非常有必要使用消息队列(消息队列三大作用:解耦、异步、消峰),Echo 中选用的是 Kafka。
整体来看就两个需求,发送系统通知和显示系统通知:
1)发送系统通知:
- A 给 B 点赞,给 B 发送 点赞 类型的系统通知(
TOPIC_LIKE
) - A 给 B 点赞,给 B 发送 关注 类型的系统通知(
TOPIC_FOLLOW
) - A 给 B 点赞,给 B 发送 评论 类型的系统通知(
TOPIC_COMMNET
)
整体逻辑就是,当发生比如点赞操作的时候,就会触发消息队列的点赞事件,然后消费者消费这个事件,具体的消费逻辑就是往系统通知表里面插入一条数据(系统通知也使用私信那张表 message
,不过系统通知的 from_id
在代码里写死了为 1,表示是系统发送出来的,所以这也就是为什么说大家在部署的时候一定要注意在 user 表中事先存储一个 id = 1 的用户)。
2)显示系统通知:
- 系统通知列表(显示点赞、评论、关注三种类型的通知)
- 系统通知详情(分页显示某一类型所包含的系统通知)
- 显示未读消息数量
封装事件对象
各位不妨想一想,消费者想要通过消费这个消息实现往数据库表 message 中插入一条记录的目的,那么这个消息或者说事件是不是就应该具备 message 表中的所有字段,或者说从消息中能够推出这些字段,对吧。
另外,Kafka 是发布订阅模型,一对多,消息以 Topic(主题)进行分类,生产者将消息发布到某个Topic 中,消费者可以订阅该 Topic。以点赞事件为例,看下图: