RabbitMQ 是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。它的并发最高可以支持一万并发,且它出身于金融行业。
RabbitMQ核心概念
Producer:生产者 Consumer:消费者 Broker:消息中间件的服务节点 。 Virtual Host:等同于namespace Channel:频道或信道,是建立在Connection连接之上的一种轻量级的连接。 RoutingKey:路由键。生产者将消息发给交换器的时候,一般会指定一个 RoutingKey,用来指定这个消息的路由规则。 Exchange:交换器,生产者将消息发送到 Exchange (交换器,通常也可以用大写的“X”来表示),由交换器将消息路由到一个或者多个队列中。如果路由不到,或返回给生产者,或直接丢弃。 Queue:队列,是RabbitMQ的内部对象,用于存储消息。 Binding:绑定,RabbitMQ 中通过绑定将交换器与队列关联起来,在绑定的时候一般会指定一个绑定键( BindingKey ) ,这样 RabbitMQ 就知道如何正确地将消息路由到队列了。
生产者发送消息的过程:
1、生产者连接到 RabbitMQ Broker,建立一个连接( Connection) ,开启一个信道 (Channel) 2、生产者声明一个交换器 ,并设置相关属性,比如 交换机类型、是否持久化等 3、生产者声明 一个队列井设置相关属性,比如是否排他、是否持久化、是否自动删除等 4、生产者通过路由键将交换器和队列绑定起来 5、生产者发送消息至RabbitMQ Broker,其中包含路由键、交换器等信息 6、相应的交换器根据接收到的路由键查找相匹配的队列 7、如果找到,则将从生产者发送过来的消息存入相应的队列中 8、如果没有找到,则根据生产者配置的属性选择丢弃还是回退给生产者 9、关闭信道、关闭连接
消费者接收消息的过程:
1、生产者连接到RabbitMQ Broker,建立一个连接( Connection) ,开启一个信道 (Channel) 2、消费者向RabbitMQ Broker 请求消费相应队列中的消息,可能会设置相应的回调函数,以及做一些准备工作 3、等待RabbitMQ Broker 回应并投递相应队列中的消息, 消费者接收消息 4、消费者确认 (ack) 接收到的消息 5、RabbitMQ 从队列中删除相应己经被确认的消息 6、关闭信道、关闭连接
RabbitMQ的优点
开源,可靠性,高可用,多语言客户端,灵活的路由,插件机制,管理界面,消息集群,多种协议,跟踪机制,文档丰富
下面对上述重要的特点进行展开讲述
可靠性
1.ack机制(推荐) 2.channel事务(不推荐) 3.重发机制 4.支持持久化 5.死信队列(1.消息过期,2.消息被拒绝,3.队列满了),说白了就是没有被消费的消息移到死信队列
高可用
rabbitmq支持集群部署,分为普通模式和镜像模式,普通模式不好用,最好用镜像模式
灵活的路由
灵活体现在它的交换器Exchange RabbitMQ 常用的交换器类型有fanout、direct、topic、headers 这四种
插件机制
插件丰富多样,且安装简单,比如rabbitmq的management管理插件
管理界面
可以通过安装插件的方式,就可以拥有管理web页面。
缺点:
不支持消息的顺序消费,除非所有消息都放到一个队列,只有一个消费者去消费才可以实现顺序消费