首先思考几个问题:
- 什么是消息队列?消息队列可以解决什么问题?
- RabbitMQ可以做什么?
- RabbitMQ可以实现消息的过期失效吗?
- RabbitMQ可以实现延迟队列吗?
- RabbitMQ为何消息堆积越多,性能越大幅度下降?
- RabbitMQ的可靠性体现在哪几方面?分别是如何实现的?
什么是消息队列
提供了以松散耦合的灵活方式集成应用程序的一种机制,为我们提供了基于存储和转发的应用程序之间的异步发送,用于异步、解耦、削峰。
- 生产者:投递消息的一方
- 消费者:接收消息的一方
- 虚拟机:用于权限控制
- 队列:消息的存储容器
- 交换机:用于将消息路由到一个或多个队列中
- 路由键:用于规定消息的路由规则,和交换机类型联合使用实现消息的分发
- 信道:建立在连接上的虚拟链接,每条指令都通过信道来完成(这里的连接为TCP连接,多个信道使用同一个TCP连接,多路复用)
AMQP协议
RabbitMQ就是AMQP协议的Erlang实现,我们使用 php-amqplib 扩展和RabbitMQ服务端交互都是靠发送AMQP命令实现的。AMQP协议分为三层:
- Module Layer:位于协议的最高层,定义供客户端调用的命令,比如:声明交换机(Exchange.Declare)、声明队列(Queue.Declare)、发送消息(Basic.Publish)
- Session Layer:位于中间层,主要负责将客户端的命令发送给服务器,再将服务端的响应返回给客户端,主要为客户端和服务器之间通信提供可靠的同步机制和错误处理
- Transport Layer:位于最底层,主要传输二进制数据
三种常用交换机原理和实现
RabbitMQ的消息有效期(TTL)和队列有效期(expires)
RabbitMQ死信队列原理并实现延迟队列
通过存储机制和队列结构理解为什么RabbitMQ会随着队列堆积吞吐量降低
RabbitMQ消息队列的可靠性