RabbitMQ:Exchange的Direct类型的介绍和使用

1.声明

当前内容用于本人学习和复习RabbitMQ的使用,当前内容主要用于分析和使用Exchange的Direct类型,发现其中的使用方式和具体操作

2.Direct Exchange的介绍

这里主要参考:RabbitMQ的Direct Exchange

直接交换基于消息路由密钥将消息传递到队列。直接交换是消息单播路由的理想选择(尽管它们也可以用于多播路由)。下面是它的工作原理:

  1. 队列使用路由密钥K绑定到交换机
  2. 当具有路由键R的新消息到达直接交换时,如果K = R,则交换会将其路由到队列

直接交换通常用于以轮循方式在多个工作程序(同一应用程序的实例)之间分配任务。这样做时,重要的是要了解,在AMQP 0-9-1中,消息在使用者之间而不是队列之间进行负载均衡。

通过这个和前面的默认的exchange(""的exchange)发现(由于这个类型就是Direct)看出来了,前面的:默认的exchange分析

使用的时候必须通过routing key=queue name的方式才能发送消息,确实和RabbitMQ一致,这也是为什么不指定routing key的时候不能被路由的原因

分析消息可以在使用者之间负载均衡

查看官方图解
RabbitMQ:Exchange的Direct类型的介绍和使用_第1张图片

3.测试当前的负载均衡

通过这句话消息在使用者之间而不是队列之间进行负载均衡

1.将当前的消息接收者复制三份:分别为消费者1消费者2消费者3

public class MessageReceiverApplication3 {
	private final static String QUEUE_NAME = "hello";

	public static void main(String[] args) throws Exception {
		RabbitMqUtils mqUtils = new RabbitMqUtils();
		mqUtils.reciver(QUEUE_NAME, (consumerTag, delivery) -> {
			System.out.println("【消费者3】==>"+new String(delivery.getBody(), "utf-8"));
		});
	}

}

创建生产者,进行发送10条消息

public class MessageSenderApplication {
	private final static String QUEUE_NAME = "hello";

	@Test
	public void testSender() {
		RabbitMqUtils mqUtils = new RabbitMqUtils();
		for (int i = 0; i < 10; i++) {
			mqUtils.send("", QUEUE_NAME, ("你好,世界!" + i));
		}

	}

}

2.启动所有的消费者
RabbitMQ:Exchange的Direct类型的介绍和使用_第2张图片

3.查看控制台结果
RabbitMQ:Exchange的Direct类型的介绍和使用_第3张图片
RabbitMQ:Exchange的Direct类型的介绍和使用_第4张图片
RabbitMQ:Exchange的Direct类型的介绍和使用_第5张图片

发现测试成功

消费者1 ==> 0 | 3 | 6 | 9
消费者2 ==> 1 | 4 | 7 |
消费者3 ==> 2 | 5 | 8 |

发现是按照一定的顺序发送的消息,实现了负载均衡!

原理:创建多个消费者同时绑定一个queue,并指定同一个exchange,并且使用的exchange type为direct类型,这个时候由于路由key都是同一个queue所以出现了负载均衡的情况

4.总结

1.使用Direct Exchange的时候,可以实现特定的负载均衡,需要Routing key=Queue name,采用K=R

2.由于Direct Exchange使用的是K=R的方式,所以我们在使用的时候,可以发送到特定的queue中用于实现特定的消息管道

3.以上纯属个人见解,如有问题请联系本人!

你可能感兴趣的:(消息队列)