RabbitMQ【五种基本模式】

基本的五种模式

1.简单队列

P:消息生产者 C:消息消费者 红块:队列

生产者将消息发送到队列,消费者从队列中获取消息

//导入依赖
<dependency>
   <groupId>com.rabbitmq</groupId>
   <artifactId>amqp-client</artifactId>
   <version>3.4.1</version>
</dependency>

1.1创建一个获取MQ的链接

1.2生产者发送消息到队列

1.3消费者获取消息

 网页端可以查看消息

点击队列名称可以进入详细

 Get messages栏目可以查看消息

2.Work模式

1个生产者、2个消费者。 一个消息只能被一个消费者获取。

#生产者:向队列中发送20条消息

#消费者1

 #消费者2

●消费者1和消费者2获取到的消息内容是不同的,同一个消息只能被一个消费者获取。

●消费者1和消费者2获取到的消息的数量是相同的,一个是消费奇数号消息,一个是偶数。

2.2二个概念

轮询分发:使用任务队列的优点之一就是可以轻易的并行工作。如果我们积压了好多工作,我们可以通过增加工作者(消费者)来解决这一问题,使得系统的伸缩性更加容易。在默认情况下,RabbitMQ将逐个发送消息到在序列中的下一个消费者(而不考虑每个任务的时长等等,且是提前一次性分配,并非一个一个分配)。平均每个消费者获得相同数量的消息。这种方式分发消息机制称为Round-Robin(轮询)。

公平分发:虽然上面的分配法方式也还行,但是有个问题就是:比如:现在有2个消费者,所有的奇数的消息都是繁忙的,而偶数则是轻松的。按照轮询的方式,奇数的任务交给了第一个消费者,所以一直在忙个不停。偶数的任务交给另一个消费者,则立即完成任务,然后闲得不行。而RabbitMQ则是不了解这些的。这是因为当消息进入队列,RabbitMQ就会分派消息。它不看消费者为应答的数目,只是盲目的将消息发给轮询指定的消费者。

2.3 Work的 能者多劳 模式

打开上述代码的注释

// 同一时刻服务器只会发一条消息给消费者 channel.basicQos(1);


//开启这行 表示使用手动确认模式 channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);

同时改为手动确认:

// 监听队列,false表示手动返回完成状态,true表示自动 channel.basicConsume(QUEUE_NAME, false, consumer);

则消费者1比消费者2获取的消息更多。

2.4消息的确认模式

自动确认模式与手动模式两种

自动确认:只要消息从队列中获取,无论消费者获取到消息后是否成功消息,都认为是消息已经成功消费。

手动确认:消费者从队列中获取消息后,服务器会将该消息标记为不可用状态,等待消费者的反馈,如果消费者一直没有反馈,那么该消息将一直处于不可用状态。

3.订阅模式

思路:

1、1个生产者,多个消费者

2、每一个消费者都有自己的一个队列

3、生产者没有将消息直接发送到队列,而是发送到了交换机

4、每个队列都要绑定到交换机

5、生产者发送的消息,经过交换机,到达队列,实现,一个消息被多个消费者获取的目的

注意:一个消费者队列可以有多个消费者实例,只有其中一个消费者实例会消费

#消息的生产者 向交换机中发送消息

注意:消息发送到没有队列绑定的交换机时,消息将丢失,因为,交换机没有存储消息的能力,消息只能存在在队列中。

 #消费者1号

 #消费者2号

 同一个消息被多个消费者获取。一个消费者队列可以有多个消费者实例,只有其中一个消费者实例会消费到消息。

#队列和交换机的绑定情况

 4.路由模式

#生产者

 #消费者1号

 #消费者2号

 5.主题模式

同一个消息被多个消费者获取。一个消费者队列可以有多个消费者实例,只有其中一个消费者实例会消费到消息。

#生产者

 #消费者1号

 #消费者2号

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值