EMOS个人教程-第9章 实现系统通知模块

1 章节介绍

2 消息通知模块的设计原理

  • 数据库设计
    • 消息和用户是一对一的关系
    • MySQL无法支撑海量数据存储
    • 使用MongoDB存储消息记录
      • message存储消息主体
      • message_ref存储接收人
  • 消息的推送与收取
    • 发送全站公告消息的问题
      • 瞬间要写入海量记录
      • 数据库正常CRUD受到影响
    • 利用消息队列实现削峰填谷

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实现消息投递削峰填谷(一)

        <dependency>
            <groupId>com.rabbitmq</groupId>
            <artifactId>amqp-client</artifactId>
            <version>5.12.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

11 利用RabbitMQ实现消息投递削峰填谷(二)

12 执行系统消息异步收发(一)

13 执行系统消息异步收发(二)

14 设计系统消息列表页面

15 系统消息列表页面加载分页数据

16 实现系统消息页面(一)

17 实现系统消息页面(二)

18 章节总结

posted @ 2021-11-05 11:11  小沈曰  阅读(220)  评论(0编辑  收藏  举报