项目实战 — 消息队列(1) {需求分析}

一、什么是消息队列

消息队列(Message Queue ,MQ),就是将阻塞队列的数据结构,提取成了一个程序,独立进行部署。也就是实现一个生产者消费模型。

有关生产者消费者模型,参考多线程 — 阻塞队列_多线程阻塞队列_‍️藿香正气水的博客-CSDN博客这里就不多说。

阻塞队列的生产者消费者模型,实在一个进程内部进行的,而消息队列的生产者消费者模型是进程和进程之间,服务和服务之间进行的。它是一个分布式系统,是由一组服务器构成的“集群”。

一些知名的MQ:* RabbitMQ,* Kafka,* RocketMQ,ActiveMQ

这里实现的消息队列是基于RabbitMQ进行编写的。

二、需求分析


1、核心概念

        核心概念

                1.生产者(Producer)

                2.消费者(Consumer)

                3.中间人(Brocker)

                4.发布(Publish)   生产者向中间人投递消息的过程

                5.订阅(Subscribe)哪些消费者从中间人取数据,称为“订阅”

                6.消费 (Consume)消费者从中间人手里取出数据

一对一:消费者和生产者 

项目实战 — 消息队列(1) {需求分析}_第1张图片多对多:消费者和生产者 

 项目实战 — 消息队列(1) {需求分析}_第2张图片

 关于BrockerServer涉及到的相关概念:

        1. 虚拟机(Virtual Host),类似于MySQL中的database,是一个“逻辑上”的数据集合

        2. 交换机(Exchange),生产者把消息投递给BrokerServer,实际上是先把消息交给了Brocker Server上的某个交换机,再由交换机把消息转发给对应的队列

        3. 队列(Queue), 真正用来存储处理消息的实体,后续消费者也是从队列中取出数据。一个消息队列中,可以由很多具体的小队列。

        4. 绑定(Binding),将交换机和队列联系起来,主要是“多对多”这样的关系。一个交换机可以对应到多个队列,一个队列也可以被多个交换机对应。

        5. 消息(Message),也就是服务器A发给B的请求,然后通过MQ转发。服务器B给A的响应,通过MQ来转发也是一个消息。

项目实战 — 消息队列(1) {需求分析}_第3张图片


 2、核心API

        * 创建队列(queueDelare)

        * 销毁队列(queueDelete)

        * 创建交换机(exchangeDeclare)

        * 创建绑定(queueBind)

        * 解除绑定(queueUnbind)

        * 发布消息(basicPublish)

        * 订阅消息(basicConsume)

        * 确认消息(basicAck)保证了消息的处理没有遗漏


3、交换机类型

交换机再转发消息的时候,是有一套转发规则的,以下是几种不同的交换机类型,描述了不同的转发规则:主要有四种

* Direct 直接交换机

* Fanout 扇出交换机

* Topic 主题交换机

* Header消息交换机

项目中主要使用了前三种。

Direct 直接交换机

生产者发送消息的时候,会指定一个“目标队列的名字”,交换机收到之后,然后查看绑定的队列中是否含有匹配的队列,如果有,就直接转发过去;如果没有,就直接丢弃。

 Fanout 扇出交换机

给每个队列都转发:

项目实战 — 消息队列(1) {需求分析}_第4张图片

Topic主题交换机

 (1)bindingKey:把队列和交换机绑定的时候,指定一个单词(暗号)

 (2)routingKey:生产者发送消息的时候,也指定一个单词。

当bindingKey和routingKey之间能够对上暗号(单词),就可以将这个个消息发给对应的队列了。

项目实战 — 消息队列(1) {需求分析}_第5张图片


4、持久化

将数据在内存和硬盘中各自都存储一份。

以内存为主,硬盘为辅。

在内存中存储的原因:

        在内存中组织数据,效率回避在硬盘上要高很多。对于MQ来说,高效的转发和处理数据是很关键的指标。

在硬盘上存储的原因:

        为了防止内存中的数据随着进程的重启或者主机的重启二而丢失。


5、网络通信 

使用 TCP + 自定义的应用层协议 实现生产者 / 消费者 / BrockerServer之间的交互工作。

自定义的协议主要工作是让客户端通过网络,调用brocker server提供的编程接口。

项目实战 — 消息队列(1) {需求分析}_第6张图片


6、应答模式

        自动应答: 消费者取走了消息,就算应答了

        手动应答:basicAcK方法属于手动应答(消费者主动调用该api进行应答)

三、模块划分

项目实战 — 消息队列(1) {需求分析}_第7张图片 

服务器模块:

        内存管理:高效的支撑API实现

        硬盘管理:持久化存储,重启以后不丢失信息

        文件管理:主要用于管理消息。

        数据库管理:存储的是元数据,使用数据库提供的增删改查管理数据。

        消息转发:前面提到的交换机类型对应的准发规则

        API实现:前面写的八种API。

公共模块:

        通信协议:为了实现客户端和服务器之间的通信来完成的逻辑,基于TCP实现的自定义的应用层协议,通过该协议,完成客户端 / 服务器的远程调用方法。

        序列化 / 反序列化:通过网络传输对象,把对象存储到硬盘上。

        序列化:把对象 => 二进制的数据序列

        反序列化:把而简直数据序列 => 对象

四、总结

具体工作:

        1.需要实现生产者,broker server,消费者三个部分

        2.针对生产者消费者,主要编写客户端和服务器的网络通信部分

        给客户端提供一组api,让客户端的业务代码来调用,从而通过网络通信的方式远程调用broker server上面的方法

        3.实现Broker Server以及broker server内部的一些基本概念和核心的api。

        4.持久化,数据的存储

这里的MQ不支持分布式部署,只是一个单机的,能够给多个生产者消费者提供服务。 

你可能感兴趣的:(项目,中间件)