1.声明
当前内容用于本人学习和复习RabbitMQ的使用,当前内容主要用于分析和使用Exchange的Direct类型,发现其中的使用方式和具体操作
2.Direct Exchange的介绍
这里主要参考:RabbitMQ的Direct Exchange
直接交换基于消息路由密钥将消息传递到队列。直接交换是消息单播路由的理想选择(尽管它们也可以用于多播路由)。下面是它的工作原理:
队列使用路由密钥K绑定到交换机
当具有路由键R的新消息到达直接交换时,如果K = R,则交换会将其路由到队列
直接交换通常用于以轮循方式在多个工作程序(同一应用程序的实例)之间分配任务。这样做时,重要的是要了解,在AMQP 0-9-1中,消息在使用者之间而不是队列之间进行负载均衡。
通过这个和前面的默认的exchange(""的exchange)发现(由于这个类型就是Direct)看出来了,前面的:默认的exchange分析
使用的时候必须通过routing key=queue name
的方式才能发送消息,确实和RabbitMQ一致,这也是为什么不指定routing key的时候不能被路由的原因
分析消息可以在使用者之间负载均衡
查看官方图解
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.启动所有的消费者
3.查看控制台结果
发现测试成功
消费者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.以上纯属个人见解,如有问题请联系本人!