这里写目录标题
- 前言
- 消息队列
- 消息队列的作用
- 常见的消息队列
- 消息队列的核心概念
- BrokerServer核心概念
- 消息队列的核心API
- 消息队列与消费者之间的工作模式
- 交换机的类型
- 消息队列的持久化
- 总结
前言
消息队列,不知道大家是否陌生,如果说消息队列感到陌生的话, 有一个模型肯定大家都听说过, 那就是生产者-消费者模型, 消息队列就是在生产者 - 消费者模型的基础上 填写成一个程序, 来让大家使用
消息队列
消息队列的作用
①: 解耦合
解耦合的意思是: 一般我们的通信双方A,B是直接相互联系的, 这样的话,如果一方出现问题, 那么另一方也会跟着等待, 而消息队列相当于是一座桥梁链接了通信AB双方, 一方出现问题另一方也不会立马罢工
②: 削峰填谷
削峰填谷的意思是: 我们都知道 不同的服务器的性能不一样, 假设通信双方 A的服务器性能好 ,B的性能差一点, 如果某个时间段, 突然请求大量增加, 那么服务器A顶的住 , 服务器B不一定顶的住, 所以如果是直接相连的话, 那么很容易从A发送过来的请求把B给干崩了, 而消息队列的存在, 使得A发送过来的请求, 要先进入到消息队列中, 服务器B可以按它的工作模式,从消息队列中取数据,进行应答然后返回给服务器A, 这样服务器不会因为A的请求量一下增大, 而造成服务器B的罢工
常见的消息队列
市面上常见的消息队列有哪些呢?
有RabbitMQ
有Kafka
有RocketMQ
我们的主要目的是如何模拟实现一个消息队列
消息队列的核心概念
- 生产者(producer): 产生数据的一方
- 消费者(consumer):获取数据的一方
- 中间人(broker): 存储数据的一方
- 发布(publish): 生产者向中间人投递数据的过程
- 订阅(subscribe): 消费者向中间人打招呼,要获取数据的这个过程
- 消费(consumer):消费者从中间人这里取数据的这个过程
BrokerServer核心概念
BrokerServer 是中间人,也是一台服务器,它的核心概念有哪些呢?
- 虚拟主机: BrokeServer可以有多态虚拟主机, 虚拟主机的作用类似于管理工厂不同的流水线, 里面存放这不同的逻辑数据集合(可以类比于数据库的database,一个数据库里面有多个database ,一个database中有不同的数据集合)
- 交换机: 交换机是生产者将消息投递的对象, 类似于公司的前台,将你引到合适的位置, 再将交换机将数据给对应的消息队列
- 队列: 队列是真正用来存储处理消息的实体, 后序的消费者也是从队列中获取数据
- 绑定:是将交换机与对应的队列建立起关联关系,(交换机与队列之间是多对多的关系, 一个队列可能对应多个交换机, 一个交换机也可能被多个队列对应))
- 消息: 消息指的是服务器A给服务器B发送的请求 或是 服务器B给服务器A返回的响应(消息中数据是自定义的, 可以是字符串, 也可以是二进制数据)
消息队列的核心API
- 创建队列 (queueDeclare)
此处不使用Create的含义是: create 只是单纯的创建, 而Declared的效果是如果存在该队列就不创建, 不存在就创建 - 销毁队列(queueDelete)
- 创建交换机(exchangeDeclare)
- 销毁交换机(exchangeDelete)
- 创建绑定(queueBind)
- 销毁绑定(queueUnbind)
- 发布消息(basicPublish)
- 订阅消息(basicConsume)
- 确认消息(basicACK)
确认消息指的是消费者给中间人发送一个消息处理完毕的显示请求
消息队列与消费者之间的工作模式
- 第一种Push(推): Broke 将收到的数据主动发送给,订阅的消费者
- 第二种Poll(垃) : 消费者主动调动Broke的API来取数据
交换机的类型
在消息队列中,有着不同的交换机的类型, 用来指定不同的传递规则, 交换机在传递消息的时候, 是根据规则来确定给那个队列传递的
- Direct - 直接交换机: 指定目标队列的名字, 直接交换
可以将直接交换机理解为专属红包, 只有指定的人才能领
- Fanout - 扇出交换机: 将消息发送到每个此交换机绑定的队列中
理解为全体红包, 所有人都能领, 领的钱还一致
- Topic - 主题交换机 : 交换机与队列之间有个暗号(bindKey), 发送方通过暗号(routingKey)将消息传送到指定的队列中
理解为画图红包, 只有完成指定的动作才能领
- Header- 消息头交换机
消息队列的持久化
消息队列当然要持久化的,不然你重启下电脑,数据都丢失了怎么行
所以消息队列的存储方式,是内存一份,硬盘一份, 存储内存是为了快, 存储硬盘是为了数据不丢失
总结
一个消息队列的实现 : 需要实现生产者 - 消费者模型,生产者- 消费者对应的是客户端与服务器, 要给客户端提供一组API , 让其通过网络通信的方式远程调用Borker Server 提供的方法
实现Borker Server 要实现核心API与一些基本概念(队列等等)
最后将数据持久化, 怎么存储到硬盘中, 这个消息队列就实现好了