一、RabbitMQ交换机类型有哪些?分别有什么作用?
在RabbitMQ中,交换机(Exchange)是消息队列系统中的一个重要组件,它用于接收生产者发送的消息并将消息路由到队列中。RabbitMQ提供了多种交换机类型,每种类型都有不同的作用。以下是RabbitMQ支持的交换机类型及它们的作用:
- 直接交换机(Direct Exchange):这是RabbitMQ默认的交换机类型。生产者将消息发送到交换机,交换机根据消息的路由键(Routing Key)将消息路由到对应的队列中。如果队列不存在,则消息会被丢弃。
- 主题交换机(Topic Exchange):这种类型的交换机根据消息的路由键进行模糊匹配,类似于主题筛选。可以将消息发送到多个队列,或者根据队列订阅的主题过滤消息。
- 扇形交换机(Fanout Exchange):这种类型的交换机将接收到的消息广播到所有绑定到该交换机的队列中,不根据路由键进行路由。当需要将消息发送到多个队列时,可以使用扇形交换机。
- 头部分类交换机(Headers Exchange):这种类型的交换机根据消息的头部属性进行路由,而不是根据路由键。它允许根据消息的自定义属性进行路由。
- 默认交换机(Default Exchange):这是直接交换机的默认别名,用于在没有指定交换机类型时使用。默认交换机按照直接交换机的规则进行路由。
- 死信交换机(Dead Letter Exchange,DLX):这种类型的交换机用于接收被其它队列拒绝或者超时等问题而被“死亡”的消息,然后再将这些消息转发到其它的队列中进行处理。可以使用插件rabbitmq_delayed_message_exchange来实现死信队列解锁库存的功能。
二、RabbitMQ发送消息的基本原理
RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。RabbitMQ是一个消息代理:它接受和转发消息。你可以把它想象成一个邮局:当你把邮件放在邮箱里时,你可以确定邮差先生最终会把邮件发送给你的收件人。在这个比喻中,RabbitMQ是邮政信箱、邮局和邮递员。RabbitMQ与邮局的主要区别是它不处理纸张,而是接受、存储和转发数据消息的二进制数据块。
RabbitMQ的工作原理可以通过下面这个简单的图来说明:
- 生产者将消息发送到队列,消息被存储在内存缓冲区中;
- 消息队列代理监听队列,当有消息到达时,它将消息写入磁盘上的消息日志文件中;
- 消费者从队列中获取消息,从磁盘上的消息日志文件中读取;
- 消息被处理后,可以保存在消费者的接收队列中,等待进一步处理;
- 如果消息需要被确认,消费者可以向消息队列代理发送确认消息;
- 消息队列代理将确认消息发送回生产者,通知它消息已经被成功处理。
三、RabbitMQ有哪些组件
- Exchange:用于将消息发送到队列的组件;
- Queue:存储消息的组件;
- Binding:将Exchange和Queue连接起来的组件;
- Connection:建立与RabbitMQ服务器的连接;
- Channel:用于发送和接收消息的组件;
- Message:存储消息的二进制数据块。
四、RabbitMQ与RocketMQ有哪些区别
RabbitMQ和RocketMQ都是消息队列系统,它们的主要区别在于以下几点:
-
语言支持:RabbitMQ支持多种编程语言,包括Java、Erlang、Python等;而RocketMQ则主要支持Java。
-
性能:RocketMQ的性能比RabbitMQ更好,因为它采用了更高效的异步通信机制。
-
可靠性:RabbitMQ的可靠性比RocketMQ更高,因为它采用了更多的数据备份和恢复机制。
-
社区活跃度:RabbitMQ的社区活跃度比RocketMQ更高,因为它已经有很长时间的历史了。
-
集群模式:RabbitMQ普通集群模式多台机器启动多个实例,每个机器启动一个。而RocketMQ采用分布式集群架构,可以轻松实现消息的负载均衡和故障转移。
-
消息确认机制:RabbitMQ有三种消息确认机制:普通发送模式、批量发送模式和异步监听模式。而RocketMQ需要真正的消费者入库成功,才会进行消费成功的确认。
五、什么是死信交换机Dead Letter Exchanges
Dead Letter Exchange其实就是一种普通的exchange,和创建其他exchange没有两样。只是在某一个设置Dead Letter Exchange的队列中有消息过期了,会自动触发消息的转发,发送到Dead Letter Exchange中去。
一个消息在满足如下条件下,会进死信路由,记住这里是路由而不是队列:文章来源:https://www.toymoban.com/news/detail-507291.html
- 一个消息被Consumer拒收了,并且reject方法的参数里requeue是false。也就是说不会被再次放在队列里,被其他消费者使用。(basic.reject/ basic.nack)requeue=false
- 消息的TTL到了,消息过期了。
- 队列的长度限制满了。排在前面的消息会被丢弃或者扔到死信路由上
如果一个队列配置了dead-letter-exchange属性,并绑定了一个死信交换机,那么当队列中的消息成为死信时,它将被重新发送到该死信交换机。死信交换机可以是一个普通的交换机,你可以将它绑定到其他队列上,以定义对死信消息的处理逻辑。文章来源地址https://www.toymoban.com/news/detail-507291.html
到了这里,关于RabbitMQ 2023面试5题(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!