rabbitMQ第五篇好博客:
https://www.cnblogs.com/LipeiNet/category/896408.html
RabbitMQ三种类型交换器 Fanout,Direct,Topic
https://www.cnblogs.com/LipeiNet/category/896408.html
AMQP当中有四个概念非常重要:
virtualhost 虚拟主机
exchange 交换机
queue 队列
binding 绑定一个虚拟主机持有一组交换机、队列和绑定。
三.消息回执 Message acknowledgment(ACK)
在实际应用中,可能会发生消费者收到Queue中的消息,但没有处理完成就宕机(或出现其他意外)的情况,这种情况下就可能会导致消息丢失。为了避免这种情况发生,我们可以要求消费者在消费完消息后发送一个回执给RabbitMQ,RabbitMQ收到消息回执(Message acknowledgment)后才将该消息从Queue中移除;如果RabbitMQ没有收到回执并检测到消费者的RabbitMQ连接断开,则RabbitMQ会将该消息发送给其他消费者(如果存在多个消费者)进行处理。这里不存在timeout概念,一个消费者处理消息时间再长也不会导致该消息被发送给其他消费者,除非它的RabbitMQ连接断开。
这里会产生另外一个问题,如果我们的开发人员在处理完业务逻辑后,忘记发送回执给RabbitMQ,这将会导致严重的bug——Queue中堆积的消息会越来越多;消费者重启后会重复消费这些消息并重复执行业务逻辑。
四.消息持久化
如果我们希望即使在RabbitMQ服务重启的情况下,也不会丢失消息,我们可以将Queue与Message都设置为可持久化的(durable),这样可以保证绝大部分情况下我们的RabbitMQ消息不会丢失。但依然解决不了小概率丢失事件的发生(比如RabbitMQ服务器已经接收到生产者的消息,但还没来得及持久化该消息时RabbitMQ服务器就断电了),如果我们需要对这种小概率事件也要管理起来,那么我们要用到
事务或者
confirm 机制。
4.1 事务
对事务的支持是AMQP协议的一个重要特性。假设当生产者将一个持久化消息发送给服务器时,因为consume命令本身没有任何Response返回,所以即使服务器崩溃,没有持久化该消息,生产者也无法获知该消息已经丢失。如果此时使用事务,即通过txSelect()开启一个事务,然后发送消息给服务器,然后通过txCommit()提交该事务,即可以保证,如果txCommit()提交了,则该消息一定会持久化,如果txCommit()还未提交即服务器崩溃,则该消息不会服务器就收。当然Rabbit MQ也提供了txRollback()命令用于回滚某一个事务。
4.2 Confirm机制
使用事务固然可以保证只有提交的事务,才会被服务器执行。但是这样同时也将客户端与消息服务器同步起来,这背离了消息队列解耦的本质。Rabbit MQ提供了一个更加轻量级的机制来保证生产者可以感知服务器消息是否已被路由到正确的队列中——Confirm。如果设置channel为confirm状态,则通过该channel发送的消息都会被分配一个唯一的ID,然后一旦该消息被正确的路由到匹配的队列中后,服务器会返回给生产者一个Confirm,该Confirm包含该消息的ID,这样生产者就会知道该消息已被正确分发。对于持久化消息,只有该消息被持久化后,才会返回Confirm。Confirm机制的最大优点在于异步,生产者在发送消息以后,即可继续执行其他任务。而服务器返回Confirm后,会触发生产者的回调函数,生产者在回调函数中处理Confirm信息。如果消息服务器发生异常,导致该消息丢失,会返回给生产者一个nack,表示消息已经丢失,这样生产者就可以通过重发消息,保证消息不丢失。Confirm机制在性能上要比事务优越很多。但是Confirm机制,无法进行回滚,就是一旦服务器崩溃,生产者无法得到Confirm信息,生产者其实本身也不知道该消息吃否已经被持久化,只有继续重发来保证消息不丢失,但是如果原先已经持久化的消息,并不会被回滚,这样队列中就会存在两条相同的消息,系统需要支持去重。
五.预存数量 Prefetch count
前面我们讲到如果有多个消费者同时订阅同一个Queue中的消息,Queue中的消息会被平摊给多个消费者。这时如果每个消息的处理时间不同,就有可能会导致某些消费者一直在忙,而另外一些消费者很快就处理完手头工作并一直空闲的情况。我们可以通过设置prefetchCount来限制Queue每次发送给每个消费者的消息数,比如我们设置prefetchCount=1,则Queue每次给每个消费者发送一条消息;消费者处理完这条消息后Queue会再给该消费者发送一条消息。
六.交换机 Exchange
生产者将消息投递到Queue中,实际上这在RabbitMQ中这种事情永远都不会发生。实际的情况是,生产 者将消息发送到Exchange,由Exchange将消息路由到一个或多个Queue中(或者丢弃)。
RabbitMQ中的Exchange有四种类型,不同的类型有着不同的路由策略。
6.1 路由key routing key
生产者在将消息发送给Exchange的时候,一般会指定一个routing key,来指定这个消息的路由规则,而这个routing key需要与Exchange Type及binding key联合使用才能最终生效。
在Exchange Type与binding key固定的情况下(在正常使用时一般这些内容都是固定配置好的),我们的生产者就可以在发送消息给Exchange时,通过指定routing key来决定消息流向哪里。
RabbitMQ为routing key设定的长度限制为255 bytes。
6.2 交换机种类 Exchange Types
RabbitMQ常用的Exchange Type有fanout、direct、topic、headers下面分别进行介绍。
6.2.1 fanout
fanout类型的Exchange路由规则非常简单,它会把所有发送到该Exchange的消息路由到所有与它绑定的Queue中。
6.2.2 direct
direct类型的Exchange路由规则也很简单,它会把消息路由到那些binding key与routing key完全匹配的Queue中。
6.2.3 topic
前面讲到direct类型的Exchange路由规则是完全匹配binding key与routing key,但这种严格的匹配方式在很多情况下不能满足实际业务需求。topic类型的Exchange在匹配规则上进行了扩展,它与direct类型的Exchage相似,也是将消息路由到binding key与routing key相匹配的Queue中。
6.2.4 headers
headers类型的Exchange不依赖于routing key与binding key的匹配规则来路由消息,而是根据发送的消息内容中的headers属性进行匹配。
在绑定Queue与Exchange时指定一组键值对;当消息发送到Exchange时,RabbitMQ会取到该消息的headers(也是一个键值对的形式),对比其中的键值对是否完全匹配Queue与Exchange绑定时指定的键值对;如果完全匹配则消息会路由到该Queue,否则不会路由到该Queue。
分享到:
相关推荐
### RabbitMQ基本概念与应用 #### 一、引言 RabbitMQ作为一款高效且可靠的开源消息代理系统,被广泛应用于各种应用场景之中,比如数据传输、非阻塞操作、推送通知、发布与订阅以及异步处理等场景。本文旨在深入...
RabbitMQ是一个消息代理,核心原理:发送消息,接收消息...首先通过一个非常简单的”helloworld“例子介绍如何使用RabbitMQ,然后再介绍其涉及的基本概念并对交换机和队列多做点介绍。本例非常简单——发送一个消息”h
1. **RabbitMQ基本概念** - **Broker**: RabbitMQ就是消息队列的broker,负责接收、存储和转发消息。 - **Exchange**: 交换器是RabbitMQ的核心组件,它根据预定义的路由规则将消息分发到不同的队列。 - **Queue**...
**RabbitMQ基本概念:** - **节点(Node)**:RabbitMQ服务器的实例称为节点,可以是单机部署或集群部署。 - **队列(Queue)**:消息的存储区域,多个消费者可以从同一个队列中消费消息,但每个消息只被消费一次。 ...
**一、RabbitMQ基本概念** 1. **消息队列**:消息队列是RabbitMQ的核心组件,用于存储待处理的消息。当生产者发送消息到队列时,消费者可以随时消费这些消息,无需同时在线。 2. **交换机(Exchange)**:交换机...
3. **RabbitMQ基本概念**:熟悉RabbitMQ的基本概念,如交换机(Exchanges)、队列(Queues)和绑定(Bindings)是必要的。这些组件共同决定了消息的路由方式。 4. **AMQP协议理解**:AMQP是RabbitMQ的核心协议,...
1. **RabbitMQ基本概念** - **Broker**: RabbitMQ服务器,负责接收、存储和转发消息。 - **Exchange**: 交换机,根据预定义的路由规则将消息分发到不同的队列。 - **Queue**: 队列,存储消息的容器,多个消费者...
**RabbitMQ基本概念** 1. **队列(Queue)**: 消息的存储位置,生产者发送消息到队列,消费者从队列中接收消息。 2. **交换机(Exchange)**: 负责根据路由规则将消息分发到不同的队列。 3. **绑定(Binding)**:...
### RabbitMQ基本概念 - **Broker**:RabbitMQ服务器实体。 - **Exchange**:消息交换机,用于接收消息并将消息路由到一个或多个队列。 - **Queue**:消息队列,存储消息直到被消费者消费。 - **Binding**:绑定是...
**RabbitMQ基本概念** 1. **节点(Node)**:RabbitMQ集群中的每个服务器实例称为节点,可以独立工作,也可以通过网络组成集群。 2. **交换器(Exchange)**:消息进入RabbitMQ时首先到达交换器,根据预设的绑定...
7. **rabbitMQ基本概念**:包括“队列”(Queue)、“交换机”(Exchange)、“路由键”(Routing Key)和“绑定”(Binding)。队列存储消息,交换机根据路由键将消息路由到对应的队列,绑定则定义了交换机和队列...
1. **RabbitMQ基本概念**:交换机、队列、生产者和消费者。 2. **AMQP协议**:RabbitMQ基于此协议进行消息传输。 3. **Java客户端库**:`amqp-client`,用于与RabbitMQ服务器交互。 4. **连接工厂**:`...
**RabbitMQ基本概念与使用** - **节点**:RabbitMQ由一个或多个节点组成,每个节点都是Erlang虚拟机上的进程。 - **队列**:消息的容器,所有消息都将被路由到队列,消费者可以从队列中获取消息。 - **交换器**:...
1. **RabbitMQ基本概念** - **消息**:在RabbitMQ中,消息是传递的基本单元,它包含了要传输的数据。 - **队列**:所有消息都会被路由到一个或多个队列中。队列是消息的临时存储,直到被消费者消费。 - **交换机*...
RabbitMQ基本概念** - **Broker**: RabbitMQ的核心组件,负责接收、存储和转发消息。 - **Exchange**: 交换器是RabbitMQ内部的一个组件,它决定了消息应该如何路由到队列。交换器根据预定义的路由规则(绑定)将...
**RabbitMQ基本概念** 1. **节点(Node)**: RabbitMQ服务器实例被称为节点,可以是单机部署,也可以是集群模式,提供高可用性。 2. **交换机(Exchange)**: 交换机负责将生产者发送的消息路由到正确的队列,根据...
2. **RabbitMQ基本概念** - **Exchange**: 交换器负责将生产者发送的消息路由到适当的队列。有多种类型的交换器,如Direct、Fanout、Topic和Header,每种类型有不同的路由策略。 - **Queue**: 队列是存储消息的...