消息队列(0)- 背景知识

前言

消息队列,不知道大家是否陌生,如果说消息队列感到陌生的话, 有一个模型肯定大家都听说过, 那就是生产者-消费者模型, 消息队列就是在生产者 - 消费者模型的基础上 填写成一个程序, 来让大家使用

消息队列

消息队列的作用

①: 解耦合
解耦合的意思是: 一般我们的通信双方A,B是直接相互联系的, 这样的话,如果一方出现问题, 那么另一方也会跟着等待, 而消息队列相当于是一座桥梁链接了通信AB双方, 一方出现问题另一方也不会立马罢工

②: 削峰填谷
削峰填谷的意思是: 我们都知道 不同的服务器的性能不一样, 假设通信双方 A的服务器性能好 ,B的性能差一点, 如果某个时间段, 突然请求大量增加, 那么服务器A顶的住 , 服务器B不一定顶的住, 所以如果是直接相连的话, 那么很容易从A发送过来的请求把B给干崩了, 而消息队列的存在, 使得A发送过来的请求, 要先进入到消息队列中, 服务器B可以按它的工作模式,从消息队列中取数据,进行应答然后返回给服务器A, 这样服务器不会因为A的请求量一下增大, 而造成服务器B的罢工

常见的消息队列

市面上常见的消息队列有哪些呢?
有RabbitMQ
有Kafka
有RocketMQ

我们的主要目的是如何模拟实现一个消息队列

在这里插入图片描述

消息队列的核心概念

  1. 生产者(producer): 产生数据的一方
  2. 消费者(consumer):获取数据的一方
  3. 中间人(broker): 存储数据的一方
  4. 发布(publish): 生产者向中间人投递数据的过程
  5. 订阅(subscribe): 消费者向中间人打招呼,要获取数据的这个过程
  6. 消费(consumer):消费者从中间人这里取数据的这个过程

BrokerServer核心概念

BrokerServer 是中间人,也是一台服务器,它的核心概念有哪些呢?

  1. 虚拟主机: BrokeServer可以有多态虚拟主机, 虚拟主机的作用类似于管理工厂不同的流水线, 里面存放这不同的逻辑数据集合(可以类比于数据库的database,一个数据库里面有多个database ,一个database中有不同的数据集合)
  2. 交换机: 交换机是生产者将消息投递的对象, 类似于公司的前台,将你引到合适的位置, 再将交换机将数据给对应的消息队列
  3. 队列: 队列是真正用来存储处理消息的实体, 后序的消费者也是从队列中获取数据
  4. 绑定:是将交换机与对应的队列建立起关联关系,(交换机与队列之间是多对多的关系, 一个队列可能对应多个交换机, 一个交换机也可能被多个队列对应))
  5. 消息: 消息指的是服务器A给服务器B发送的请求 或是 服务器B给服务器A返回的响应(消息中数据是自定义的, 可以是字符串, 也可以是二进制数据)

消息队列的核心API

  1. 创建队列 (queueDeclare)
    此处不使用Create的含义是: create 只是单纯的创建, 而Declared的效果是如果存在该队列就不创建, 不存在就创建
  2. 销毁队列(queueDelete)
  3. 创建交换机(exchangeDeclare)
  4. 销毁交换机(exchangeDelete)
  5. 创建绑定(queueBind)
  6. 销毁绑定(queueUnbind)
  7. 发布消息(basicPublish)
  8. 订阅消息(basicConsume)
  9. 确认消息(basicACK)
    确认消息指的是消费者给中间人发送一个消息处理完毕的显示请求

消息队列与消费者之间的工作模式

  1. 第一种Push(推): Broke 将收到的数据主动发送给,订阅的消费者
  2. 第二种Poll(垃) : 消费者主动调动Broke的API来取数据

交换机的类型

在消息队列中,有着不同的交换机的类型, 用来指定不同的传递规则, 交换机在传递消息的时候, 是根据规则来确定给那个队列传递的

  1. Direct - 直接交换机: 指定目标队列的名字, 直接交换

可以将直接交换机理解为专属红包, 只有指定的人才能领

  1. Fanout - 扇出交换机: 将消息发送到每个此交换机绑定的队列中

理解为全体红包, 所有人都能领, 领的钱还一致

  1. Topic - 主题交换机 : 交换机与队列之间有个暗号(bindKey), 发送方通过暗号(routingKey)将消息传送到指定的队列中

理解为画图红包, 只有完成指定的动作才能领

  1. Header- 消息头交换机

消息队列的持久化

消息队列当然要持久化的,不然你重启下电脑,数据都丢失了怎么行
所以消息队列的存储方式,是内存一份,硬盘一份, 存储内存是为了快, 存储硬盘是为了数据不丢失

总结

一个消息队列的实现 : 需要实现生产者 - 消费者模型,生产者- 消费者对应的是客户端与服务器, 要给客户端提供一组API , 让其通过网络通信的方式远程调用Borker Server 提供的方法
实现Borker Server 要实现核心API与一些基本概念(队列等等)
最后将数据持久化, 怎么存储到硬盘中, 这个消息队列就实现好了

猜你喜欢

转载自blog.csdn.net/qq_56454895/article/details/131947557