RabbitMQ面试题(二)

  1. 说说RabbitMQ有哪些重要的组件?
    答:
    ConnectionFactory(连接管理器):应用程序与Rabbit之间建立连接的管理器,在程序代码中使用。
    Channel(信道):用于推送消息的通道。
    Exchange(交换机):用于接受消息,然后根据路由匹配分配消息到具体的Queue。
    Queue(队列):生产者的消息存储在队列这,消费者从队列这拿消息消费。
    RoutingKey(路由键):把生成者的数据分配到交换器上。
    BindingKey(绑定键):用绑定键把交换器和队列做个绑定,然后队列会根据自己的类型和路由键来决定是否匹配绑定键规则,匹配则把消息发送到队列。

  2. RabbitMQ中vhost的作用是什么?
    答: 每个virtual host本质上都是一个RabbitMQ Server,拥有它自己的queue,exchagne,和binding等等。但最最重要的是,其拥有独立的权限系统,可以做到vhost范围的客户控制,这保证了可以在多个不同的application中使用RabbitMQ。

  3. RabbitMQ的消息是怎么发送的?
    答:首先客户端会和RabbitMQ服务端创建一个TCP连接,而一旦TCP打开并通过了认证,客户端和RabbitMQ服务端之间就会创建一个Channel(信道),而信道是创立在“真实” TCP上的虚拟连接,AMQP命令都是通过信道发送出去的,每个信道都会有一个唯一的 id,不管是发布消息,订阅队列都是通过这个信道完成的。

  4. AMQP是什么?
    答:AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计,AMQP使得遵从该规范的客户端应用和消息中间件服务器的全功能互操作成为可能。

  5. 如何确保消息正确地发送至RabbitMQ?
    答:将信道设置成confirm模式(发送方确认模式),则所有在信道上发布的消息都会被指派一个唯一的 ID。然后只要消息被投递到了目标队列,或者持久化到了磁盘里,信道会发送一个确认给生产者(里面包含了消息的唯一ID),而如果因为RabbitMQ发生内部错误导致了消息丢失,则会发送一条nack(not acknowledged,未确认)消息,不过这种发送方确认模式是异步的,也就是说生产者可以继续发送别的消息,等确认消息传回来的时候,生存者可以定义自己的回调方法来对消息发送结果做相应的逻辑处理,比如失败了就重试再发送。

  6. RabbitMQ怎样避免消息丢失?
    答:ACK确认机制,消息持久化,采用镜像集群模式,消息补偿机制

  7. RabbitMQ持久化有什么缺点?
    答:由于RabbitMQ持久化使用的是磁盘而不是内存存储,因此服务器的吞吐量就会降低,可以尽量使用ssd硬盘来缓解吞吐量的问题。

  8. 消息怎么路由?
    答:消息发布到交换机器时,消息会拥有一个路由键(routing key),在消息创建时设定,然后队列也会通过一个BindingKey(绑定键)来和交换机做绑定,消息到达交换机后,RabbitMQ会将消息的路由键与队列的绑定键进行匹配(针对不同的交换器有不同的路由规则)

  9. RabbitMQ的Exchange(交换机)有几种类型?
    答:
    Fanout:广播类型,它不处理路由键,只要队列绑定到这个类型的交换机上,发送到这个交换机上的消息,这些队列都会收到。
    Direct:直连类型,它处理路由键,需要将一个队列绑定到交换机上,要求该消息与一个特定的路由键完全匹配(就是路由键和绑定键要完全匹配)。
    Topic:主题模式,它处理路由键,需要将一个队列绑定到交换机上,要求该消息与一个特定的路由键模糊匹配,符号"#“代表匹配一个或多个词,符号”*"代表只能匹配一个词。
    Headers:不处理路由键,而是根据发送的消息内容中的headers属性进行匹配。

  10. RabbitMQ消息如何分发?
    答:若该队列至少有一个消费者订阅,消息将以循环(round-robin)的方式发送给消费者。每条消息只会分发给一个订阅的消费者(前提是消费者能够正常处理消息并进行确认)。通过路由可实现多消费的功能。

发布了289 篇原创文章 · 获赞 302 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/weixin_38106322/article/details/104815174
今日推荐