目录
一、什么是消息队列
二、需求分析
🍅1、核心概念
🍅2、核心API
🍅3、交换机类型
🍅 4、持久化
🍅5、网络通信
🍅6、应答模式
三、模块划分
四、测试用例设计
五、总结
一、什么是消息队列
消息队列(Message Queue ,MQ),就是将阻塞队列的数据结构,提取成了一个程序,独立进行部署。也就是实现一个生产者消费模型。
有关生产者消费者模型,参考多线程 — 阻塞队列_多线程阻塞队列_️藿香正气水的博客-CSDN博客这里就不多说。
阻塞队列的生产者消费者模型,实在一个进程内部进行的,而消息队列的生产者消费者模型是进程和进程之间,服务和服务之间进行的。它是一个分布式系统,是由一组服务器构成的“集群”。
一些知名的MQ:* RabbitMQ,* Kafka,* RocketMQ,ActiveMQ
这里实现的消息队列是基于RabbitMQ进行编写的。
二、需求分析
🍅1、核心概念
核心概念
1.生产者(Producer)
2.消费者(Consumer)
3.中间人(Brocker)
4.发布(Publish) 生产者向中间人投递消息的过程
5.订阅(Subscribe)哪些消费者从中间人取数据,称为“订阅”
6.消费 (Consume)消费者从中间人手里取出数据
一对一:消费者和生产者
多对多:消费者和生产者
关于BrockerServer涉及到的相关概念:
1. 虚拟机(Virtual Host),类似于MySQL中的database,是一个“逻辑上”的数据集合
2. 交换机(Exchange),生产者把消息投递给BrokerServer,实际上是先把消息交给了Brocker Server上的某个交换机,再由交换机把消息转发给对应的队列
3. 队列(Queue), 真正用来存储处理消息的实体,后续消费者也是从队列中取出数据。一个消息队列中,可以由很多具体的小队列。
4. 绑定(Binding),将交换机和队列联系起来,主要是“多对多”这样的关系。一个交换机可以对应到多个队列,一个队列也可以被多个交换机对应。
5. 消息(Message),也就是服务器A发给B的请求,然后通过MQ转发。服务器B给A的响应,通过MQ来转发也是一个消息。
🍅2、核心API
* 创建队列(queueDelare)
* 销毁队列(queueDelete)
* 创建交换机(exchangeDeclare)
* 创建绑定(queueBind)
* 解除绑定(queueUnbind)
* 发布消息(basicPublish)
* 订阅消息(basicConsume)
* 确认消息(basicAck)保证了消息的处理没有遗漏
🍅3、交换机类型
交换机再转发消息的时候,是有一套转发规则的,以下是几种不同的交换机类型,描述了不同的转发规则:主要有四种
* Direct 直接交换机
* Fanout 扇出交换机
* Topic 主题交换机
* Header消息交换机
项目中主要使用了前三种。
🎊Direct 直接交换机
生产者发送消息的时候,会指定一个“目标队列的名字”,交换机收到之后,然后查看绑定的队列中是否含有匹配的队列,如果有,就直接转发过去;如果没有,就直接丢弃。
🎊Fanout 扇出交换机
给每个队列都转发:
🎊Topic主题交换机
(1)bindingKey:把队列和交换机绑定的时候,指定一个单词(暗号)
(2)routingKey:生产者发送消息的时候,也指定一个单词。
当bindingKey和routingKey之间能够对上暗号(单词),就可以将这个个消息发给对应的队列了。
🍅 4、持久化
将数据在内存和硬盘中各自都存储一份。
以内存为主,硬盘为辅。
在内存中存储的原因:
在内存中组织数据,效率回避在硬盘上要高很多。对于MQ来说,高效的转发和处理数据是很关键的指标。
在硬盘上存储的原因:
为了防止内存中的数据随着进程的重启或者主机的重启二而丢失。
🍅5、网络通信
使用 TCP + 自定义的应用层协议 实现生产者 / 消费者 / BrockerServer之间的交互工作。
自定义的协议主要工作是让客户端通过网络,调用brocker server提供的编程接口。
🍅6、应答模式
自动应答: 消费者取走了消息,就算应答了
手动应答:basicAcK方法属于手动应答(消费者主动调用该api进行应答)
三、模块划分
服务器模块:
内存管理:高效的支撑API实现
硬盘管理:持久化存储,重启以后不丢失信息
文件管理:主要用于管理消息。
数据库管理:存储的是元数据,使用数据库提供的增删改查管理数据。
消息转发:前面提到的交换机类型对应的准发规则
API实现:前面写的八种API。
公共模块:
通信协议:为了实现客户端和服务器之间的通信来完成的逻辑,基于TCP实现的自定义的应用层协议,通过该协议,完成客户端 / 服务器的远程调用方法。
序列化 / 反序列化:通过网络传输对象,把对象存储到硬盘上。
序列化:把对象 => 二进制的数据序列
反序列化:把而简直数据序列 => 对象
四、测试用例设计
五、总结
具体工作:
1.需要实现生产者,broker server,消费者三个部分
2.针对生产者消费者,主要编写客户端和服务器的网络通信部分
给客户端提供一组api,让客户端的业务代码来调用,从而通过网络通信的方式远程调用broker server上面的方法
3.实现Broker Server以及broker server内部的一些基本概念和核心的api。
4.持久化,数据的存储
这里的MQ不支持分布式部署,只是一个单机的,能够给多个生产者消费者提供服务。文章来源:https://www.toymoban.com/news/detail-615134.html
源码:https://pan.baidu.com/s/1gOaG4TrrtTAbIU7DRzRY5Q?pwd=1234文章来源地址https://www.toymoban.com/news/detail-615134.html
到了这里,关于项目实战 — 消息队列(1) {需求分析}的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!