消息队列-RabbitMQ基础
RabbitMQ?
RabbitMQ是基于AMQP基础实现,可支持多种开发语言客户端,如:JAVA、Python等
RabbitMQ是Erlang语言编写的开源消息队列,本身支持很多协议:AMQP,XMPP,SMTP,STOMP。实现了Broker构架。
RabbitMQ特点?
- 可靠性:持久化、传输确认及发布确认等机制
- 灵活的路由:通过交换器来路由消息,可自由搭配,可以通过插件自制
- 扩展性:多个RabbitMQ节点可以组成一个集群
- 高可用性:队列可以在集群中设置镜像,部分节点出现问题的情况下仍可用
- 多种协议:支持多种协议,AMQP,XMPP,SMTP,STOMP协议
- 多语言客户端:RabbitMQ几乎支持所有常用语言,比如Java、Python等等
- 管理界面:RabbitMQ提供了一个易用的用户界面
- 插件机制:提供了许多插件,以实现从多方面扩展
RabbitMQ核心概念?
RabbitMQ整体上是一个生产者与消费者模型,主要负责接收、存储和转发消息。
RabbitMQ的整体模型架构如下:
Producer(生产者)和Consumer(消费者)
- Producer:生产消息的一方
- Consumer:消费消息的一方
消息一般由2部分组成:
- 消息头:可选属性组成。如routing-key(路由键)、priority(消息的优先权)、delivery-mode(持久化标识)
- 消息体:消息主体
Exchange(交换器)
在RabbitMQ中,消息先传递到Exchange(交换器),Exchange(交换器)把消息再分配到对应的Queue(消息队列)。
Exchange(交换器)用来接受生产者发送的消息并将这些消息路由给服务器中的队列中,如果路由不到,或返回给Producer或直接丢弃掉
Exchange(交换器)有4种类型,不同的类型对应不同的路由策略:direct(默认)、fanout、topic和headers。
生产者将消息发给交换器的时候,一般会指定一个RoutingKey(路由键),用来指定消息的路由类型,RoutingKey需要与交换器类型和BindingKey(绑定键)联合使用才能生效。
RabbitMQ通过Binding(绑定)将Exchange(交换器)与Queue(消息队列)关联起来,在绑定的时候一般会指定一个BindingKey(绑定键)。这样RabbitMQ就知道如何正确将消息路由到队列了。Exchange和Queue的绑定可以是多对多的关系。
生产者将消息发送给交换器时,需要一个RoutingKey,当BindingKey和RoutingKey相匹配时,消息会被路由到对应的队列中。BindingKey允许相同,但并不一定会生效,需要依赖于交换器类型。例如fanout无效
Queue(消息队列)
Queue(消息队列)用来保存消息直到发送到消费者,是消费者的容器。一个消息可投入到一个或多个队列。等待消费者连接到这个队列将其取走。
RabbitMQ中消息只存储到队列中,这一点和Kafka这种消息中间件相反。Kafka将消息存储到topic(主题)这个逻辑层面,而相对应的队列只是topic实际存储文件中的位移标识。
多个消费者可以订阅同一个队列,这时队列的消息会被平均分摊(Round-Robin,即轮询)给多个消费者处理,不是每个消费者都能收到,避免重复消费。
RabbitMQ不支持队列层面的广播消费,如果需要,则需要二次开发,不建议。
Broker(消息中间件的服务节点)
RabbitMQ Broker可以简单地看做一个RabbitMQ服务节点,或者RabbitMQ服务示例。大多数情况下也可以将一个RabbitMQ Broker看作一台RabbitMQ服务器。
- 点赞
- 收藏
- 关注作者
评论(0)