【面试问题】什么是 MQ topic 交换器(模式匹配) ?

简介: 【1月更文挑战第27天】【面试问题】什么是 MQ topic 交换器(模式匹配) ?

Topic Exchange 是消息队列系统中一种常见的交换机类型,它基于主题(Topic)进行消息的路由和匹配。在 RabbitMQ 等消息中间件中,Topic Exchange 允许消息的生产者使用带有通配符的路由键,而消费者可以通过使用相应的通配符来接收感兴趣的消息。这种模式匹配的机制提供了更灵活、更动态的消息路由方式,使得系统能够根据实际业务需求进行精确的消息传递。

Topic Exchange 的基本原理:

  1. 路由键的模式匹配:
  • Topic Exchange 允许生产者使用一定规则的路由键。路由键是一个由点分隔的单词列表,例如,"animal.rabbit.white"。在路由键中,可以使用两种通配符:* 表示匹配一个单词,# 表示匹配零个或多个单词。这样,消费者可以使用通配符来绑定队列,从而匹配符合特定条件的消息。
  1. 支持多队列绑定:
  • 与 Direct Exchange 不同,Topic Exchange 允许将多个队列绑定到同一个交换机,并通过使用不同的通配符模式进行匹配。这意味着一个消息可以被多个队列接收,每个队列根据自己的匹配规则进行筛选。
  1. 动态路由规则:
  • 主题交换机的设计目标之一是提供动态的消息路由规则。生产者和消费者可以根据实际需求定义灵活的规则,使得系统可以适应不同的业务场景。

Topic Exchange 示例说明:

考虑一个虚拟的场景,有多个生产者负责发布动物相关的消息,而多个消费者对不同类型的动物感兴趣。在这个场景中,Topic Exchange 可以被用来实现消息的动态路由。

1. 创建 Topic Exchange:

channel.exchangeDeclare("topic.exchange", BuiltinExchangeType.TOPIC);

2. 发送消息到 Topic Exchange:

StringroutingKey="animal.rabbit.white";
channel.basicPublish("topic.exchange", routingKey, null, message.getBytes());

3. 创建消费者并绑定队列到 Topic Exchange:

StringqueueName="white.rabbit.queue";
channel.queueDeclare(queueName, false, false, false, null);
// 使用通配符 # 匹配所有路由键StringbindingKey="animal.#";
channel.queueBind(queueName, "topic.exchange", bindingKey);

4. 消费者处理消息:

channel.basicConsume(queueName, true, (consumerTag, delivery) -> {
// 处理消息processMessage(delivery.getBody());
});

Topic Exchange 示例说明:

假设有多个消费者,它们分别关注不同颜色的兔子。生产者发布消息时,使用路由键指定动物、颜色等信息,而消费者通过绑定队列时的通配符进行模式匹配,以接收符合条件的消息。例如,一个消费者关注所有兔子,而另一个消费者只关注白色兔子。

// 生产者发布消息channel.basicPublish("topic.exchange", "animal.rabbit.white", null, "White Rabbit Message".getBytes());
// 消费者绑定队列并使用通配符channel.queueBind("white.rabbit.queue", "topic.exchange", "animal.#");
channel.queueBind("all.rabbit.queue", "topic.exchange", "animal.rabbit.*");

上述示例中,"white.rabbit.queue" 将匹配路由键 "animal.rabbit.white",而 "all.rabbit.queue" 将匹配所有以 "animal.rabbit." 开头的路由键。通过合理使用通配符,可以实现灵活的消息路由,并根据不同的业务需求动态调整队列的绑定关系。

总体而言,Topic Exchange 提供了一种灵活、动态的消息路由机制,适用于需要更复杂消息过滤和匹配的场景。

相关实践学习
RocketMQ一站式入门使用
从源码编译、部署broker、部署namesrv,使用java客户端首发消息等一站式入门RocketMQ。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
30天前
|
消息中间件 缓存 NoSQL
RabbitMQ 总结面试
RabbitMQ 总结面试
19 0
|
1月前
|
消息中间件 存储 负载均衡
RocketMQ 面试题及答案整理,最新面试题
RocketMQ 面试题及答案整理,最新面试题
152 4
|
1月前
|
消息中间件 存储 监控
RabbitMQ 面试题及答案整理,最新面试题
RabbitMQ 面试题及答案整理,最新面试题
117 1
|
3月前
|
消息中间件 负载均衡 监控
【面试问题】RabbitMQ 的集群
【1月更文挑战第27天】【面试问题】RabbitMQ 的集群
|
28天前
|
消息中间件 Java RocketMQ
【深度挖掘 RocketMQ底层源码】「底层源码挖掘系列」抽丝剥茧贯穿RocketMQ的消费者端的运行核心的流程(Pull模式-下)
【深度挖掘 RocketMQ底层源码】「底层源码挖掘系列」抽丝剥茧贯穿RocketMQ的消费者端的运行核心的流程(Pull模式-下)
12 1
|
28天前
|
消息中间件 存储 NoSQL
【深度挖掘 RocketMQ底层源码】「底层源码挖掘系列」透彻剖析贯穿RocketMQ的消费者端的运行核心的流程(Pull模式-上)
【深度挖掘 RocketMQ底层源码】「底层源码挖掘系列」透彻剖析贯穿RocketMQ的消费者端的运行核心的流程(Pull模式-上)
27 1
|
30天前
|
消息中间件 物联网 网络性能优化
MQTT常见问题之MQTT的topic超出上限25个如何解决
MQTT(Message Queuing Telemetry Transport)是一个轻量级的、基于发布/订阅模式的消息协议,广泛用于物联网(IoT)中设备间的通信。以下是MQTT使用过程中可能遇到的一些常见问题及其答案的汇总:
|
1月前
|
传感器 监控 网络协议
MQTT 发布、订阅模式介绍
【2月更文挑战第17天】
68 6
MQTT 发布、订阅模式介绍
|
1月前
|
消息中间件 存储 监控
RabbitMQ:分布式系统中的高效消息队列
RabbitMQ:分布式系统中的高效消息队列
|
1月前
|
消息中间件 Java
springboot整合消息队列——RabbitMQ
springboot整合消息队列——RabbitMQ
75 0