消息队列
发展历史
- 操作系统消息队列:解决进程间通信问题。
- TIB(The Information Bus):最早的消息中间件,高盛在解决金融交易场景下诞生,基于发布订阅模式。
- MSMQ:微软消息中间件。
- JMS(Java Message Service):sun公司提出的消息标准,提出了接口标准用于解决不同中间件的互通。
- ActiveMQ:Apache协议开源的消息中间件。
- AMQP:摩根大通和其他公司提出的标准,是行业广泛使用的消息中间件标准。
- RabbitMQ:基于 AMQP 协议的。
- Kafka:特点是高吞吐、高并发。由linkin开源,解决 ActiveMQ 消息阻塞,无法支持高并发的问题。
- RocketMQ:阿里研发解决双11,解决高并发下的高可靠、一致性等问题。
- Pulsar:存储计算分离,多租户等。
分阶段看:
- 第一阶段:
- 解决异步和解耦
- 代表产品:activemq、rabbitmq
- 第二阶段:
- 解决吞吐量和一致性
- 代表产品:kafka、rocketmq
- 第三阶段:
- 解决平台化和云原生
- 代表产品:puslar
AMQP
AMQP是Advanced Message Queuing Protocal,高级消息队列协议。
包含了AMQ模型和网络协议。
概念
- Exchange(交换机):接收消息,并根据路由键转发消息到绑定的队列。
- Queue(队列):存储消息直到发送给消费者。
- Binding(绑定):用于将Exchange和Queue按照路由规则绑定起来。
- Virtual Host(虚拟主机):一个虚拟主机持有一组交换机、队列和绑定,用于多租户隔离。
- Broker(消息代理):消息中间件程序。
- Connection(连接):网络连接,比如TCP连接。
- Channel(信道):多路复用连接中的一条独立的双向数据流通道。信道是建立在真实的TCP连接内的虚拟连接
- Consumer(消费者):接收消息的程序。
- Publisher(生产者):发送消息的程序。
Exchange
- 类型:
- Direct(直连):根据路由键进行匹配。
- 队列绑定到交换机时需指定路由键的值。
- 交换机收到消息时会读取路由键的值,遍历绑定列表,找到所有匹配的队列。
- Fanout(扇出):将接收到的消息广播到所有绑定的队列。
- 队列绑定到交换机时无需指定路由键的值。
- 交换机收到消息时会直接将消息转发到所有绑定的队列。
- Topic(主题):根据通配符匹配路由键。
- 队列绑定到交换机时需指定路由键的通配符模式。
- 交换机收到消息时会读取路由键的值,遍历绑定列表,根据模式找到所有匹配的队列。
- Headers(头):根据消息的头部信息匹配。
- 队列绑定到交换机时需指定多个header。
- 消息携带header与x-match参数,当参数为any时表示任何一个header匹配即可,all表示需全部匹配。
- 默认交换机:
- 只要创建的队列没有绑定交换机,都会自动绑定到默认交换机。
- 路由键与队列名相同。
- 属性:
- Name:名称。
- Type:类型,直连或扇出等。
- Durable:持久化标志,非持久化broker重启丢失。
- AutoDelete:自动删除标志,最后一个绑定被解除后是否自动删除。
- Arguments:可选参数。
Queue
- 属性:
- Name:名称。
- Durable:持久化标志,非持久化broker重启丢失。
- Exclusive:排他性标志,仅创建者可以使用的私有队列,断开后自动删除。
- AutoDelete:自动删除标志,最后一个消费者断开后是否自动删除。
- Arguments:可选参数。
- 创建:
- 先声明再使用,如果声明时不存在则创建。
- 如果已存在并且属性相同则无影响,如属性不同则产生通道级异常。
- 持久化:
- 持久化队列在broker后仍然存在。
- 消息的持久化完全取决于消息本身的持久化模式,与队列持久化无关。
Consumer
- 获取消息方式:
- 推:broker推送给消费者。
- 拉:消费者主动拉取消息。
- 多个消费者监听同一个队列,消息只会被其中一个消费者消费。
Binding
- 属性:
- Source:源,只能是交换机。
- Destination:目标,可以是队列或交换机。
- DestinationType:目标类型,queue或exchange。
- RoutingKey:路由键,直连交换机时使用。
- Arguments:路由参数。
- 交换机路由过程:
- 遍历Binding数组,找到Source为自身的Binding。
- 判断消息是否满足RoutingKey或Arguments的设置。
Message
- AMQP传输数据的基本结构时帧,分类:
- 方法帧:携带RPC请求或响应。
- 内容头帧:具体业务消息的头部。
- 内容帧:具体业务消息。
- 心跳帧:维持TCP连接的帧。
- 发布消息时包含哪些帧:
- 方法帧Basic.Publish。
- 内容头帧。
- 内容帧,一个或多个。
- 消费消息时包含哪些帧:
- 方法帧Basic.Deliver。
- 内容头帧。
- 内容帧,一个或多个。