- mq产品使用的一些场景?
- 解耦
- 消峰
- 谈一下消息队列的基本模型?
- 生产者——MQ服务器——消费者
- 基于队列queue
- 基于主题topic
- 什么是ACK机制?
就是一种应答机制,告诉mq服务器,消费者消费了该消息,可以从mq列表中删除该消息了。
- 描述一下ACK机制的作用?
上述。
- 如果使用了事务,请问ACK机制将是什么?
如果使用事务了:
0——开启事务时的ack策略,并且如果开启了事务,会强制使用0,该情况下执行了session.commit()的时候才能发送ack消息给服务器,服务器才会将该消息从列表中删除。
如果没有使用事务:
1)1——自动 consumer.receive()或者consumer.receive(1000)或者onMessage(),如果下面的代码有异常,则会导致数据丢失。
2)2——手动 message.acknowledge();,切记该代码要放到业务逻辑的后面。
- 谈谈消息的同步消费?
- 接收消息的方法需要阻塞——consumer.receive()或者receive(1000)
- 如果是自动ACK,那么在receive()方法执行的时候就发送了ACK
- 谈谈消息的异步消费?
即有消息的时候,就消费消息,没有消息的时候就不会一直阻塞。异步消费的话,如果消息列表中有消息,它就消费,不用像同步消费那样while(true){
Receive();
}
- 简述这几个方法的异同?consumer.receive()和consumer.receive(10000)以及onMessage(message)
- 这3个方法都是用来消费消息的,前2个是同步消费,后1个是异步消费
- 前2个方法不会重试,后1个方法会重试,共重试6次,如果6次都没有正常执行,则该消息会进入死信队列。死信队列的信息,可以找回来来。——从这个角度来讲,异步接收比同步接收要安全一些。
- 异步接收消息,并且手动ACK的模式是最最安全的。
- 异步接收和同步接收相比,哪个更安全?
异步安全,因为:
- 异步的情况,如果有异常,会重试onMessage()方法,并且默认重试6次,期间总有成功的时候
- 即使都不成功,消息也不会被ack掉,而是进入死信队列。
- 手动ACK和自动ACK,哪个更安全?
手动更安全,因为:
在业务处理完毕后,如果没有异常,再ack消息,保证消息正常消费。
- 消息已经消费了,但pending列表中仍然能看到该消息,为什么?
- 如果使用了事务,可能是没有执行session.commit()方法。
- 如果没有使用事务:
- 如果是自动ACK, receive()执行有误。
- 如果是手动ack,可能没有执行message.acknoleage()方法
12.什么时候会进入死信队列?
1)异步接收的情况,默认重试6次后进入死信队列
2)发送消息时,指定了最大消费时间,如果在规定的时间内没有消费掉,也会计入死信队列