- 消息队列有什么优缺点?RabbitMQ有什么优缺点
优点:
解耦:通过消息队列隔离服务,需要消息可以自取,而不用在服务端费力调配
削峰:降低服务器压力
异步:通过消息队列实现异步化,大大减少响应时间
缺点:
增加了系统复杂度,降低了可用性,出现了数据一致性的问题 - 有哪些公司常用的消息中间件
ActiveMQ:历史比较久,但目前用来处理高并发的使用案例较少,大多用来做一些本地功能
RocketMQ:阿里开源出来的,经历了比较多的实用案例,而且java语言编写,易于阅读源码改造
RabbitMQ:国内使用最为广泛,各方面性能十分优秀,社区支持稳定,使用案例丰富
KafKa:消息中间件的相关功能较少,但在数据,日志方面做得比较好,所以在大数据云计算方面应用广泛 - MQ 有哪些常见问题?如何解决这些问题?
顺序问题:消息可能不按规定顺序到达,解决方法:保证生产者-mq-消费者链条的唯一性
重复问题:消息会重复到达多条,解决办法:对消息保持幂等性,去重,不论多少条消息,到达都按一条处理 - rabbitMq简介,应用场景
erlang语言开发,基于amqp协议
应用:
服务间异步通信(邮箱)
顺序消费(订单状态)
请求削峰(高并发)
定时服务(定时提醒) - RabbitMQ基本概念
Exchange:交换机,对消息队列加规则路由,发给对应的目标
Queue:消息载体,以队列为基本概念存放消息
Binding:绑定,绑定队列到交换机上
Routing Key:路由键,就是制定投递消息的目标
Producer:生产者,投递消息的一方
Consumer:消费者:接收消息方
Channel:传递消息的一个会话流程 - RabbitMQ的工作模式
simple,简单的模式,消息发到队列里,
work,竞争,消费者谁先来谁拿队列里的消息
routing,路由,有多个队列,根据路由信息发到对应队列里,再被匹配消费者拿走
subscribe:订阅,有多个队列,消息复制多份,每个队列给一份,再被消费者消费
topic:类似路由模式,但有模糊匹配规则,一份消息会发给多个队列,别的相同 - 如何保证RabbitMQ消息的顺序性?
拆分多个队列,各自有路由规则进行排序,或者在到达消费者之前,设置一个写好的程序,在内存中进行排序后再分发 - 消息如何分发
消息以循环方式分发给消费者,一条消息只能被一个消费者消费,设置路由可实现多消费 - 消息如何路由,常用的交换器
消息有一个路由键,可以将其绑定到对应交换器,再发给对应队列,这其中都是绑定路由进行匹配
交换器类型:fanout:广播,绑定的队列各发一个
topic:通过模糊匹配绑定规则,可以一个队列接收多个来源消息
direct:通过绑定路由,发到对应队列 - 消息基于什么传输?
TCP连接内的虚拟信道,好处是没有数量限制 - 如何保证消息不被重复消费?或者说,如何保证消息消费时的幂等性?
重复消费的原因:
消息被消费后,会给消息队列返回信息,于是队列清除这一条,但如果因为不可抗力造成返回错误,那这条信息就没清除,之后被别的消费者拿走了
解决办法:在消息上做标记,消费者这里有一个消息序列,消费时检查标记,重复的不予接收,不连续的不予接收,实际操作时会比较复杂 - 如何确保消息正确地发送至 RabbitMQ? 如何确保消息接收方消费了消息?
借鉴计算机网络思想,生产者发到队列的消息,需要返回一个ack确认,没有收到返回一个nack,在等待确认时,生产者可以继续发
消费者在消费消息后,返回给队列一个id,队列删掉这个id的消息,保证幂等性 - 如何保证RabbitMQ消息的可靠传输
通常有消息丢失和劫持,丢失分为三种
生产者丢失:通过返回ack和nack的机制,重发或者回滚
队列丢失:持久化,利用消息durable属性,写到磁盘里,到时回滚
消费者丢失:一般是收到消息后处理消息前丢失了,但消息队列已经删了这条,可以改自动确认设置为手动确认
Java面试之RM消息队列
最新推荐文章于 2023-09-12 21:36:29 发布