带你全面认识RabbitMQ

1.1.MQ的概述

MQ全称Message Queue(消息队列),是在消息的传输过程中保存消息的容器.多用于分布式系统之间的通信.

1.2.MQ的优势

1.应用解耦
2.任务异步处理
3.消峰填谷

2.Rabbit入门

2.1简单模式

简单模式比较简单,一个生产者一个消费者,生产者发送的信息,然后消费者接受信息

2.2Work queues工作队列模式

Work Queues 与入门程序的 简单模式 相比,多了一个或一些消费端,多个消费端共同消费同一个队列中的消息。
应用场景:对于任务过重或任务较多情况使用工作队列可以提高任务处理d 速度。
小结:在一个队列中如果有多个消费者,那么消费者之间对于同一个消息的关系是竞争的关系。

2.3 发布与订阅模式

这个模式除了有生产者,消费者,消息队列还有一个重要的交换机
在这里插入图片描述
Exchange交换机,图中的X.一方面接受生产者发送的消息.另一方面,知道如何处理消息,例如递交给某个特别队列,递交给所有队列.或者将消息丢弃.到底如何操作,取决于Exchange的类型.Exchange有常见以下3种类型:

  • Fanout:广播,将消息交给所有绑定到交换机的队列
  • Direct:定向,将消息交给符合指定routing key的队列
  • Topic:通配符,将消息交给符合routing pattern的队列

Exchange只负责转发消息,不具备存储消息的能力,因此如果没有任何队列与Exchange绑定,或者没有符合规则的队列,那么消息会丢失!

总结:
RabbitMQ工作模式: 1、简单模式 HelloWorld 一个生产者、一个消费者,不需要设置交换机(使用默认的交换机)
2、工作队列模式 Work Queue 一个生产者、多个消费者(竞争关系),不需要设置交换机(使用默认的交换机)
3、发布订阅模式 Publish/subscribe 需要设置类型为fanout的交换机,并且交换机和队列进行绑定,当发送消息到交换机后,交换机会将消息发送到绑定的队列
4、路由模式 Routing 需要设置类型为direct的交换机,交换机和队列进行绑定,并且指定routing key,当发送消息到交换机后,交换机会根据routing key将消息发送到对应的队列
5、通配符模式 Topic 需要设置类型为topic的交换机,交换机和队列进行绑定,并且指定通配符方式的routing key,当发送消息到交换机后,交换机会根据routing key将消息发送到对应的队列

3.高级特性

3.1消息的可靠投递

在使用 RabbitMQ 的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景。RabbitMQ 为我们提供了两种方式用来控制消息的投递可靠性模式。
confirm 确认模式
return 退回模式
rabbitmq 整个消息投递的路径为:
producer—>rabbitmq broker—>exchange—>queue—>consumer
消息从 producer 到 exchange 则会返回一个 confirmCallback 。
消息从 exchange–>queue 投递失败则会返回一个 returnCallback 。
我们将利用这两个 callback 控制消息的可靠性投递

3.1.1 确认模式
消息从 producer 到 exchange 则会返回一个 confirmCallback
/**
* 确认模式:
* 步骤:
* 1. 确认模式开启:ConnectionFactory中开启publisher-confirms="true"
* 2. 在rabbitTemplate定义ConfirmCallBack回调函数
*/
@Test
public void testConfirm() {
	//2. 定义回调
	rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
	/**
	*
	* @param correlationData 相关配置信息
	* @param ack exchange交换机 是否成功收到了消息。true 成功,false代表失败
	* @param cause 失败原因
	*/
	@Override
	public void confirm(CorrelationData correlationData, boolean ack, String
	cause) {
		System.out.println("confirm方法被执行了....");
		if (ack) {
			//接收成功
			System.out.println("接收成功消息" + cause);
		} else {
			//接收失败
			System.out.println("接收失败消息" + cause);
			//做一些处理,让消息再次发送。
		}
	}
});
	//3. 发送消息
	rabbitTemplate.convertAndSend("test_exchange_confirm", "confirm", "message
	confirm....");
}
3.2.2退回模式

消息从 exchange–>queue 投递失败则会返回一个 returnCallback

/**
* 回退模式: 当消息发送给Exchange后,Exchange路由到Queue失败是 才会执行 ReturnCallBack
* 步骤:
* 1. 开启回退模式:publisher-returns="true"
* 2. 设置ReturnCallBack
* 3. 设置Exchange处理消息失败的模式:setMandatory
* 1. 如果消息没有路由到Queue,则丢弃消息(默认)
* 2. 如果消息没有路由到Queue,返回给消息发送方ReturnCallBack
*/
	@Test
	public void testReturn() {
		//设置交换机处理失败消息的模式
		rabbitTemplate.setMandatory(true);
		//2.设置ReturnCallBack
		rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
		/**
		*
		* @param message 消息对象
		* @param replyCode 错误码
		* @param replyText 错误信息
		* @param exchange 交换机
		* @param routingKey 路由键
		*/
		@Override
		public void returnedMessage(Message message, int replyCode, String
		replyText, String exchange, String routingKey) {
			System.out.println("return 执行了....");
			System.out.println(message);
			System.out.println(replyCode);
			System.out.println(replyText);
			System.out.println(exchange);
			System.out.println(routingKey);
			//处理
		}
	});
		//3. 发送消息
		rabbitTemplate.convertAndSend("test_exchange_confirm", "confirm234",
		"message confirm....");
		}

3.2.Consumer Ack

ack指Acknowledge,确认。 表示消费端收到消息后的确认方式。
有三种确认方式:
自动确认:acknowledge=“none”
手动确认:acknowledge=“manual”
根据异常情况确认:acknowledge=“auto”,(这种方式使用麻烦,不作讲解)
其中自动确认是指,当消息一旦被Consumer接收到,则自动确认收到,并将相应 message 从RabbitMQ 的消息缓存中移除。但是在实际业务处理中,很可能消息接收到,业务处理出现异常,那么该消息就会丢失。如果设置了手动确认方式,则需要在业务处理成功后,调用channel.basicAck(),手动签收,如果出现异常,则调用channel.basicNack()方法,让其自动重新发送消息。

TTL消息过期时间

1.time to live 消息存活时间
2.如果消息在存活时间内未被消费,则会被清除
3.RabbitMQ支持两种ttl设置
单独消息进行配置ttl
整个队列进行配置ttl(居多)

死信队列

死信队列,英文缩写:DLX 。Dead Letter Exchange(死信交换机),当消息成为Dead message后,可以被重新发送到另一个交换机,这个交换机就是DLX。

消息有哪几种情况成为死信:

  • 消费者拒收消息(basic.reject/ basic.nack) ,并且没有重新入队requeue=false
  • 消息在队列中未被消费,且超过队列或者消息本身的过期时间TTL(time-to-live)
  • 队列的消息长度达到极限
  • 结果:消息成为死信后,如果该队列绑定了死信交换机,则消息会被死信交换机重新路由到死信队列
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值