赞
踩
RabbitMQ有五种工作模式,分别是简单模式、工作模式、发布订阅模式、路由模式和主题模式
关于交换机的不同和工作模式的不同,它们之间的主要区别在于:
交换机:决定了消息的路由方式。不同类型的交换机提供了不同的消息分发机制,例如广播、路由、匹配等。
工作模式:定义了消息的生产和消费方式。不同的工作模式适用于不同的应用场景,例如简单模式适用于一对一的消息传递,而发布订阅模式适用于一对多的消息传递。
总的来说,RabbitMQ的交换机和工作模式共同构成了其强大的消息传递和处理能力,可以根据具体的应用需求进行选择和配置。
许多场景中,这是期望的行为,因为每个队列的消费者可能负责处理消息的某个特定方面或将其发送到不同的系统或服务。
例如,假设您有一个日志系统,您可能希望将每条日志消息都发送到多个队列中,以便进行不同的处理或存储。一个队列可能用于实时分析,另一个队列可能用于归档,还有一个队列可能用于警报系统。在这种情况下,您会期望每个消费者都从其队列中接收到所有日志消息,并相应地处理它们。
然而,如果在您的应用程序中,多个消费者处理相同的消息会导致问题(例如,重复处理或数据不一致),那么您就需要考虑使用其他类型的交换机(如直连交换机或主题交换机)以及路由键来更精细地控制消息的路由。
总之,扇出交换机的广播行为本身并不一定会导致bug,这取决于您的应用程序如何处理这些消息。在设计消息传递系统时,您应该仔细考虑您的需求,并选择最适合您场景的交换机类型和路由策略。
参考:https://blog.csdn.net/qq_45173404/article/details/121687489
在RabbitMQ中,不同的消息传递模式确实与不同类型的交换机相匹配。以下是根据您提到的消息传递模式推荐的交换机类型:
(1)简单模式(Simple Mode):
(2)工作模式(Work Mode):
(3)发布订阅模式(Publish/Subscribe):
(个人感觉:发布订阅模式使用的应该是扇出交换机,然后不指定路由键,如果使用主题交换机,就是主题模式了)
(4)路由模式(Routing Mode):
(5)主题模式(Topic Mode):
请注意,这些建议仅作为一般指导,具体选择哪种交换机类型还需要根据业务需求和场景来决定。在某些情况下,可能还需要结合使用多种交换机类型来实现复杂的消息路由和分发策略。同时,RabbitMQ还支持其他高级功能,如消息持久化、消息确认机制等,可以根据需要进行配置和使用。
在RabbitMQ中,路由模式(Routing)和主题模式(Topic)的主要区别在于它们使用的交换机类型(Exchange Type)和路由键(Routing Key)的匹配方式。
路由模式(Routing):
使用Direct Exchange。
消息通过路由键(Routing Key)与队列绑定键(Binding Key)的精确匹配进行路由。
如果路由键与绑定键完全匹配,消息才会被发送到相应的队列。
主题模式(Topic):
使用Topic Exchange。
消息通过路由键与队列绑定键的模式匹配进行路由。
绑定键和路由键可以包含.(点)和*(星号)以及#(井号)作为通配符。
*(星号)代表一个单词。
#(井号)代表零个或多个单词。
Spring Boot 代码示例
路由模式(Routing)
生产者(Sender)
@Autowired
private RabbitTemplate rabbitTemplate;
public void sendMessage(String exchange, String routingKey, String message) {
rabbitTemplate.convertAndSend(exchange, routingKey, message);
}
// 使用示例
sendMessage("directExchange", "key1", "This is a routing message for key1.");
消费者(Receiver)
@RabbitListener(bindings = @QueueBinding( value = @Queue(value = "queue1", durable = "true"), exchange = @Exchange(value = "directExchange", type = ExchangeTypes.DIRECT), key = "key1" )) public void receiveMessage(String message) { System.out.println("Received Routing Message: " + message); } // 另一个消费者监听不同的路由键 @RabbitListener(bindings = @QueueBinding( value = @Queue(value = "queue2", durable = "true"), exchange = @Exchange(value = "directExchange", type = ExchangeTypes.DIRECT), key = "key2" )) public void receiveMessage2(String message) { System.out.println("Received Routing Message for key2: " + message); }
主题模式(Topic)
生产者(Sender)
@Autowired
private RabbitTemplate rabbitTemplate;
public void sendMessage(String exchange, String routingKey, String message) {
rabbitTemplate.convertAndSend(exchange, routingKey, message);
}
// 使用示例
sendMessage("topicExchange", "stock.usd.nyse", "This is a topic message for stock.usd.nyse.");
消费者(Receiver)
@RabbitListener(bindings = @QueueBinding( value = @Queue(value = "topicQueue1", durable = "true"), exchange = @Exchange(value = "topicExchange", type = ExchangeTypes.TOPIC), key = "stock.*" // 匹配所有以 "stock." 开头的路由键 )) public void receiveMessage(String message) { System.out.println("Received Topic Message: " + message); } // 另一个消费者监听不同的模式 @RabbitListener(bindings = @QueueBinding( value = @Queue(value = "topicQueue2", durable = "true"), exchange = @Exchange(value = "topicExchange", type = ExchangeTypes.TOPIC), key = "*.nyse.#" // 匹配所有以 ".nyse." 结尾的路由键,以及包含 ".nyse." 的路由键 )) public void receiveMessage2(String message) { System.out.println("Received Topic Message for nyse: " + message); }
在上面的示例中,生产者使用RabbitTemplate来发送消息,而消费者则通过@RabbitListener注解来监听队列并接收消息。注意在配置交换机和队列时指定了交换机类型和路由键或绑定键的模式。
特点:
消息发送者(生产者)将消息发送到交换机(Exchange)。
交换机将消息发送到所有与之绑定的队列。
每个队列都可能有多个消费者。
代码示例(基于Spring AMQP):
生产者:
@Autowired
private RabbitTemplate rabbitTemplate;
public void sendMessage(String message) {
rabbitTemplate.convertAndSend("fanoutExchange", "", message); // 发送消息到fanout类型的交换机,routingKey不需要
}
消费者(可以有多个):
@RabbitListener(queues = "queue1")
public void receiveMessage(String message) {
System.out.println("Consumer 1 received: " + message);
}
@RabbitListener(queues = "queue2")
public void receiveAnotherMessage(String message) {
System.out.println("Consumer 2 received: " + message);
}
特点:
消息发送者将消息发送到交换机,并指定一个路由键(Routing Key)。
交换机根据路由键将消息发送到匹配的队列。
队列通过绑定键(Binding Key)与交换机绑定,并决定接收哪些路由键的消息。
代码示例:
生产者:
@Autowired
private RabbitTemplate rabbitTemplate;
public void sendMessage(String routingKey, String message) {
rabbitTemplate.convertAndSend("directExchange", routingKey, message); // 发送消息到direct类型的交换机,并指定routingKey
}
消费者(可以有多个,每个消费者监听不同的路由键):
@RabbitListener(queues = "queueForRoutingKeyA")
public void receiveMessageA(String message) {
System.out.println("Received message for routing key A: " + message);
}
@RabbitListener(queues = "queueForRoutingKeyB")
public void receiveMessageB(String message) {
System.out.println("Received message for routing key B: " + message);
}
队列绑定到交换机时的配置(Spring配置类):
@Bean
Binding bindingA(Queue queueForRoutingKeyA, DirectExchange directExchange) {
return BindingBuilder.bind(queueForRoutingKeyA).to(directExchange).with("routingKeyA");
}
@Bean
Binding bindingB(Queue queueForRoutingKeyB, DirectExchange directExchange) {
return BindingBuilder.bind(queueForRoutingKeyB).to(directExchange).with("routingKeyB");
}
特点:
消息发送者将消息发送到交换机,并指定一个路由键。
交换机根据路由键和队列的绑定键的匹配规则,将消息发送到匹配的队列。
绑定键可以使用通配符(* 表示匹配一个单词,# 表示匹配零个或多个单词)。
代码示例:
生产者:
@Autowired
private RabbitTemplate rabbitTemplate;
public void sendMessage(String routingKey, String message) {
rabbitTemplate.convertAndSend("topicExchange", routingKey, message); // 发送消息到topic类型的交换机,并指定routingKey
}
消费者(可以有多个,每个消费者监听不同的路由键模式):
@RabbitListener(queues = "queueForTopicNews")
public void receiveNews(String message) {
System.out.println("Received news message: " + message);
}
@RabbitListener(queues = "queueForTopicSports")
public void receiveSports(String message) {
System.out.println("Received sports message: " + message);
}
队列绑定到交换机时的配置(Spring配置类):
@Bean
Binding bindingNews(Queue queueForTopicNews, TopicExchange topicExchange) {
return BindingBuilder.bind(queueForTopicNews).to(topicExchange).with("news.*"); // 匹配news.开头的routingKey
}
@Bean
Binding bindingSports(Queue queueForTopicSports, TopicExchange topicExchange) {
return BindingBuilder.bind(queueForTopicSports).to(topicExchange).with("sports.#");
}
参考问题6
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。