rabbitMQ 基础概念介绍

摘要:摘要: rabbitMQ 基础概念介绍

传统的队列消息服务,有三个概念,生产者,消费者,队列;rabbitMQ在概念上多做了一层抽象,在发消息者和队列之间,加入了交换器。

消息是先发到交换器,由交换器再根据调度策略再把消息给队列;

rabbitMQ重要概念:

1 (35).jpg

 

虚拟主机(Virtual Host):

相当于mini版的rabbitMQ服务,每个虚拟机中都包含交换机、对接、绑定。

创建用户并分配对应的虚拟机以达到权限控制,不同的用户之间不会相互影响。

 

交换机(Exchange):

根据策略及路由键发送消息到对应的队列,如果没有绑定队列,则直接丢弃掉发过来的消息;

 

路由键(routing key):

作为交换机发送消息到队列的key,根据路由键+交换机策略,将消息发送至对应的队列;

 

绑定(Binding):

队列需要和交换机进行绑定,多对多的关系;

 

Exchange分发策略: direct:

完全匹配模式,即路由键与队列名称完全匹配,交换机会把消息发送给与路由键名字一致的队列;

fanout:

多播模式,不处理路由键,会发送给所有绑定了该交换机的队列;

 

topic:

模糊匹配模式,路由键、队列名都以"."标识符分隔,以“*”,“#”进行匹配,“*”表示一个,“#”表示0或多个;

 

我们准备发送关于动物的消息。消息会附加一个选择键包含3个标识符(两个点隔开)。

第一个标识符描述动物的速度,第二个标识符描述动物的颜色,第三个标识符描述动物的物种:<speed>.<color>.<species>。

我们创建3个绑定键:Q1与*.orange.*绑定Q2与*.*.rabbit和lazy.#绑定。

可以简单的认为:

Q1对所有的橙色动物感兴趣。

Q2想要知道关于兔子的一切以及关于懒洋洋的动物的一切。

quick.orange.rabbit的选择键的消息将会被转发到两个队列。

lazy.orange.elephant的消息也会被转发到两个队列。

quick.orange.fox只会被转发到Q1。

lazy.brown.fox将会被转发到Q2。

lazy.pink.rabbit虽然与两个绑定键匹配,但是也只会被转发到Q2一次。

quick.brown.fox不能与任何绑定键匹配,所以会被丢弃。

发送一个或者四个标识符的选择键,类似:orange,quick.orange.male.rabbit,这些选择键不能与任何绑定键匹配,所以消息将会被丢弃。

另一方面,lazy.orange.male.rabbit,虽然是四个标识符,也可以与lazy.#匹配,从而转发至Q2。

注:主题类型的转发器非常强大,可以实现其他类型的转发器。

当一个队列与绑定键#绑定,将会收到所有的消息,类似fanout类型转发器。

当绑定键中不包含任何#与*时,类似direct类型转发器。

 

 

消息确认机制:

生产者确认机制:

在使用rabbitMQ过程中,可以使用消息持久化操作来解决因为服务器的异常导致信息丢失。但生产者消息发送出去后,默认情况下是生产者是不清楚消息是否真正到达队列的。rabbitMQ提供了两种方式解决;

通过事务机制实现:

使用txSelect(),txCommit(),txRollback()方法;但该方式耗时较长

通过将交换机设置成confirm模式实现:

设置exange为confirm模式,当消息被投递到匹配的队列之后,就会发送一个确认给生产者;如果消息是可持久化的,那么确认消息会在写入磁盘之后发出。confirm模式最大的好处在于他是异步的,生产者可以通过回调方法来处理该确认消息,如果因为rabbitMQ自身内部原因导致丢失,会发送一条nack消息,同样可以在回调方法中处理;

消费者确认机制:

消费者在声明队列时,可以指定toack参数,为true,则是自动应答;false手动应答;

自动应答就是当消息被消费后,即RabbitMQ会进行删除消息;如果当消息处理过程中出现宕机或者其他原因导致该消息没有处理完毕,则该消息就丢失了。

手动应答,则是需要显示发挥ack信号,如消息被消费后,消费端并没有发回ack信号且消费者断开,则rabbitMQ会将消息重新进入队列等待下一个消费者;

这样就能保证每个消息都能正常处理了;