1 章节介绍
2 消息通知模块的设计原理
- 数据库设计
- 消息和用户是一对一的关系
- MySQL无法支撑海量数据存储
- 使用MongoDB存储消息记录
- message存储消息主体
- message_ref存储接收人
- 消息的推送与收取
3 RabbitMQ入门
- 支持同步和异步两种模式
- 比其他MQ产品更可靠
- 利用Docker安装
docker pull rabbitmq:3.9.7
docker run -d -p 5672:5672 -p 15672:15672 --name st_rabbitmq rabbitmq:3.9.7
docker run -id --name=st_rabbit \
-p 5671:5671 -p 5672:5672 -p 4369:4369 -p 15672:15672 -p 25672:25672 \
rabbitmq:3.9.7
docker ps
docker exec -it 镜像ID /bin/bash
rabbitmq-plugins enable rabbitmq_management
- 五种队列模式
- 简单模式
- Work模式
- 发布/订阅模式
- 路由模式
- 主题模式
- 支持消息持久化
4 消息模块数据模型设计
- MongoDB的ORM很简单
- 定义Message和MessageRef映射类
- 特殊属性
- readFlag代表该条消息是否已读
- lastFlag代表消息是最新接收的
- 学习MongoDB的联合查询
- MongoDB不支持表连接
- aggregate函数将两个集合连接在一起
5 消息模块数据模型设计
db.message.insert({
_id:ObjectId("600bea9ab5bafb311f147506"),
uuid:"bfcb7c47-5886-c528-5127-ce285bc2322a",
senderId:0,
senderPhoto:"https://static-1258386385.cos.ap-beijing.myqcloud.com/img/System.jpg",
senderName:"Emos系统",
msg:"HelloWord",
sendTime:ISODate("2021-01-23T17:21:30Z")
});
db.message_ref.insert({
_id:ObjectId("600beaf0d6310000830036f3"),
messageId:"600bea9ab5bafb311f147506",
receiverId:1,
readFlag:false,
lastFlag:true
});
db.message.aggregate(
//数据类型转换,将Oject转成String去连接
{
//set定义变量
$set:{
//临时变量Id
"id":{$toString:"$_id"}
}
},
//
{
$lookup:{
//连接message_ref,message出Id,跟message_ref的messageId连接
from:"message_ref",
localField:"id",
foreignField:"messageId",
//从message_ref取出来的数据保存在ref
as:"ref"
}
},
//寻找receiverId=1的消息内容,match为查询条件
{ $match:{"ref.receiverId":1} },
//按照发送时间降序
{ $sort:{sendTime:-1} },
//从0开始往后取50条数据
{ $skip:0 },
{ $limit:50 }
);
6 设计消息模块的持久层(一)
编写后端代码
- 业务接口
- 刷新消息模块
- 获取分页消息
- 根据ID查询消息
- 把未读消息更新成已读
- 删除消息
- 定义线程任务类
- 注册后发送系统消息
- 登陆后接收系统消息
- 首页定时轮询接收消息
7 设计消息模块的持久层(二)
8 设计消息模块的业务层
9 设计消息模块的Web层
10 利用RabbitMQ实现消息投递削峰填谷(一)
com.rabbitmq
amqp-client
5.12.0
org.springframework.boot
spring-boot-starter-amqp
11 利用RabbitMQ实现消息投递削峰填谷(二)
12 执行系统消息异步收发(一)
13 执行系统消息异步收发(二)
14 设计系统消息列表页面
15 系统消息列表页面加载分页数据
16 实现系统消息页面(一)
17 实现系统消息页面(二)
18 章节总结