计算机应届生一定要会的JAVA面试题:RabbitMQ是如何实现消息路由的?

简介: 一个应届生去面试,可能没有什么实战经验,今天被问到一个这样的面试题,说“RabbitMQ是如何实现消息路由的?“一下子竟然不知道如何组织语言了。今天我给大家分享一下我的理解。

一个应届生去面试,可能没有什么实战经验,今天被问到一个这样的面试题,说“RabbitMQ是如何实现消息路由的?“一下子竟然不知道如何组织语言了。今天我给大家分享一下我的理解。

另外,我把往期分享的视频全部整理成一份500页的PDF面试题解析配套文档,希望能够以此来提高各位粉丝的通过率,

3c49a408152941fb99f810c374920902.gif

如何获取? :

扫描文章底部名片领取!

1、工作流程

RabbitMQ 是一个基AMQP 协议实现的分布式消息中间件。AMQP 的具体工作机制是,

f7a58c0f10df7f2b7f48ec962b564763.png

生产者把消息发送到 RabbitMQ Broker 上的Exchange 交换机上。Exchange 交换机把收到的消息根据路由规则发给绑定的队列(Queue)。最后再把消息投递给订阅了这个队列的消费者,从而完成消息的异步通讯。

其中,Exchange交换机,可以定义消息的路由规则,将消息路由到指定的队列。然后 Queue队列是消息的载体,每个消息可以根据路由规则路由到一个或者多个队列中。

2、路由策略

完成RabbitMQ消息路由的核心组件是 Exchange。而消息的路由是由Exchange类型 和 Binding 来决定的。Binding 表示建立 Queue 和 Exchange 之间的绑定关系,每一个绑定关系会存在一个 BindingKey。

通过这种方式相当于在 Exchange 中建立了一个路由关系表。生产者发送消息的时候,需要声明一个 RoutingKey(路由键),Exchange 拿到RoutingKey 之后,根据 RoutingKey 和路由表里面的 BindingKey 进行匹配,而匹配的规则是通过 Exchange类型来决定的。

在 RabbitMQ 中,默认有四种类型的 Exchange:Direct ,Fanout、Topic和Header。

Direct,叫直连,也就是完整匹配方式,需要Routing Key 和 Binding Key 完全一致,相当于点对点的发送。如图所示:

image.png


如果发送routing key为”spring”的消息,那么只有第一个队列能收到消息。

Topic: 叫主题,这种方式是通过设置通配符来动态匹配,相当于正则。就是用Routing Key 去匹配Binging Key。BingingKey支持两个通配符。

# 代表匹配0个或者多个单词

* 代表匹配不多不少一个单词

另外,BingingKey用点隔开两个单词。

,用*表示使用正则表达式进行匹配,如图所示:

image.png


有4个队列绑定到Topic类型的交换机,而且使用不同的绑定键。

如果发送routing key为"junior.abc.jvm" 的消息,那么,只有第一个队列能收到。

如果发送routing key为"senior.netty"的消息,那么,第二个队列和第三个队列能收到。

Fanout:叫广播,这种方式不需要设置Routing Key,而是把消息广播给绑定到当前 Exchange 上的所有队列上。如图所示:

image.png


只要发送消息到Fanout Exchange上,那么三个队列都能收到消息

RabbitMQ、Kafka、RocketMQ 是目前最主流的分布式消息中间件。有的同学可能对 Kafka 比较了解,有的同学可能对 RabbitMQ 比较了解。不过,在面试的时候,面试官一般会问你用过的技术组件。通过面试过程中推演出你的学习能力以及对技术的掌握能力,这个方面如果还不错的话,接触一个新的 MQ 组件所消耗的学习成本会比较小。

最后,我把往期分享的面试题全部整理成了1份10W字的文档,希望能够以此来提高各位粉丝的通过率

3c49a408152941fb99f810c374920902.gif

我是被编程耽误的文艺Tom,只弹干货不掺水!你们的支持就是我最大的动力!关注我,面试不再难!

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
11天前
|
消息中间件 大数据 Kafka
大厂面试高频:Kafka、RocketMQ、RabbitMQ 的优劣势比较
本文深入探讨了消息队列的核心概念、应用场景及Kafka、RocketMQ、RabbitMQ的优劣势比较,大厂面试高频,必知必会,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:Kafka、RocketMQ、RabbitMQ 的优劣势比较
|
1月前
|
存储 消息中间件 安全
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
【10月更文挑战第9天】本文介绍了如何利用JUC组件实现Java服务与硬件通过MQTT的同步通信(RRPC)。通过模拟MQTT通信流程,使用`LinkedBlockingQueue`作为消息队列,详细讲解了消息发送、接收及响应的同步处理机制,包括任务超时处理和内存泄漏的预防措施。文中还提供了具体的类设计和方法实现,帮助理解同步通信的内部工作原理。
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
|
1月前
|
存储 Java 数据安全/隐私保护
Java中的域,什么是域?计算机语言中的域是什么?(有代码实例)
文章解释了Java中域的概念,包括实例域、静态域、常量域和局部域,以及它们的特点和使用场景。
62 2
|
1月前
|
消息中间件 存储 JSON
rabbitmq基础教程(ui,java,springamqp)
本文提供了RabbitMQ的基础教程,包括如何使用UI创建队列和交换机、Java代码操作RabbitMQ、Spring AMQP进行消息发送和接收,以及如何使用不同的交换机类型(fanout、direct、topic)进行消息路由。
26 0
rabbitmq基础教程(ui,java,springamqp)
|
1月前
|
消息中间件 前端开发 Java
java高并发场景RabbitMQ的使用
java高并发场景RabbitMQ的使用
104 0
|
2月前
|
消息中间件 缓存 Java
RocketMQ的JAVA落地实战
RocketMQ作为一款高性能、高可靠、高实时、分布式特点的消息中间件,其核心作用主要体现在异步处理、削峰填谷以及系统解耦三个方面。
177 0
|
3月前
|
消息中间件 开发者
【RabbitMQ深度解析】Topic交换器与模式匹配:掌握消息路由的艺术!
【8月更文挑战第24天】在消息队列(MQ)体系中,交换器作为核心组件之一负责消息路由。特别是`topic`类型的交换器,它通过模式匹配实现消息的精准分发,适用于发布-订阅模式。不同于直接交换器和扇形交换器,`topic`交换器支持更复杂的路由策略,通过带有通配符(如 * 和 #)的模式字符串来定义队列与交换器间的绑定关系。
74 2
|
3月前
|
Java
MQTT(EMQX) - Java 调用 MQTT Demo 代码
MQTT(EMQX) - Java 调用 MQTT Demo 代码
170 0
MQTT(EMQX) - Java 调用 MQTT Demo 代码
|
4月前
|
SQL Java Unix
Android经典面试题之Java中获取时间戳的方式有哪些?有什么区别?
在Java中获取时间戳有多种方式,包括`System.currentTimeMillis()`(毫秒级,适用于日志和计时)、`System.nanoTime()`(纳秒级,高精度计时)、`Instant.now().toEpochMilli()`(毫秒级,ISO-8601标准)和`Instant.now().getEpochSecond()`(秒级)。`Timestamp.valueOf(LocalDateTime.now()).getTime()`适用于数据库操作。选择方法取决于精度、用途和时间起点的需求。
67 3
|
4月前
|
消息中间件 Kafka API
面试题Kafka问题之RabbitMQ的扩展和二次开发如何解决
面试题Kafka问题之RabbitMQ的扩展和二次开发如何解决
39 1
下一篇
无影云桌面