栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

带你全面认识RabbitMQ

带你全面认识RabbitMQ

带你全面认识RabbitMQ
    • 1.1.MQ的概述
    • 1.2.MQ的优势
    • 2.Rabbit入门
      • 2.1简单模式
      • 2.2Work queues工作队列模式
      • 2.3 发布与订阅模式
    • 3.高级特性
      • 3.1消息的可靠投递
        • 3.1.1 确认模式
        • 3.2.2退回模式
      • 3.2.Consumer Ack
      • TTL消息过期时间
      • 死信队列

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
@Test
public void testConfirm() {
	//2. 定义回调
	rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
	
	@Override
	public void confirm(CorrelationData correlationData, boolean ack, String
	cause) {
		System.out.println("/confirm/i方法被执行了....");
		if (ack) {
			//接收成功
			System.out.println("接收成功消息" + cause);
		} else {
			//接收失败
			System.out.println("接收失败消息" + cause);
			//做一些处理,让消息再次发送。
		}
	}
});
	//3. 发送消息
	rabbitTemplate.convertAndSend("test_exchange_/confirm/i", "/confirm/i", "message
	/confirm/i....");
}
3.2.2退回模式

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

	@Test
	public void testReturn() {
		//设置交换机处理失败消息的模式
		rabbitTemplate.setMandatory(true);
		//2.设置ReturnCallBack
		rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
		
		@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/i", "/confirm/i234",
		"message /confirm/i....");
		}
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)
  • 队列的消息长度达到极限
  • 结果:消息成为死信后,如果该队列绑定了死信交换机,则消息会被死信交换机重新路由到死信队列
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/355139.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号