rabbitmq 核心
2022-08-30 16:42:20 0 举报
rabbitMQ 流程
作者其他创作
大纲/内容
自动 ACK 情况下(autoAck = true),消息什么时候被删除?发送给消费者以后服务端就删除该消息,而不是等待消费者业务处理完后才删除手动ACK 情况下(autoAck = true),消息什么时候被删除?等待消费者业务处理完后才删除手动确认需要在 application.yml 中配置 listener.simple.acknowledge-mode: manual
消息可以是一个可序列化对象,也可以是一个JSON字符串
手动确认,发送回执
Consumer
Return 消息机制用于处理一个不可路由的消息。 在某些情况下,如果我们在发送消息的时候,当前的 exchange 不存在或者指定路由 key 路由不到, 这个时候我们需要监听这种不可达的消息 就需要这种return机制本需要在 application.yml中配置开启消息返回机制 publisher-returns: true
returnCallback
confirmCallack
正确路由到队列
Mesasge头+体
消息被拒绝,且不重回队列requeue=false
未能正确路由到队列,触发 returnCallback
消息被拒绝且不重回队列,且没有死信交换机,消息被丢弃
channel.basicAck(message.getMessageProperties().getDeliveryTag(),是否批量确认,是否重新入队)
有时候会有特殊的情况,比如预先拉取了50条消息,批量确认50条,结果消费了40条mq宕机,由于mq的宕机,导致前40条消息消费了但还处于unacked状态,此时会重新置为 ready 状态,交由其它消费者消费,也就是重回队列了,这就会导致重复消费的问题,这就需要消息具备幂等性。
注意:设置消息预取一定要关闭自动确认RabbitMQ 提供了一种 qos(服务质量保证)的功能,即非自动确认消息的前提下,如果有一定数目的消息(通过 consumer 或者 Channel 设置 qos)未被确认,不进行新的消费。只有预取数量全部确认后,消费者才会进行下一次拉取在 application.yml 中关闭自动确认,改为手动确认,并设置消息预取数量listener.simple.acknowledge-mode: manual listener.simple. prefetch: 80
消息无法路由且不存在备用交换机的情况下直接返回给生产者,前提是设置了 mandatory = true,否则会直接丢弃消息
如果备用交换机也无法正确路由,返回给生产者
Exchange交换机
DLQ死信队列
alternate-echange备用交换机
消息预取
DLX死信交换机
mandatory标志告诉broker代理服务器至少将消息route到一个队列中,否则就将消息return给发送者
绑定关系
queue与备用交换机绑定的队列
消息预取与接受
queue队列
routing Key:路由键
virtuahost
provider
自动 ACK 容易造成消息丢失,如果消息还未被消费成功消费者宕机,rabbitmq 又删除了消息手动 ACK 可能会造成消息重复消费,如果消息消费成功还未手动确认,那么消息会在 mq 中被标识为 unacked,消费端宕机,此时消息会重新置为 ready状态,给其他消费者消费rabbitmq 没有提供重复消费的解决方案,可以给消息加一个字段标识,加一个业务ID,
Broker
0 条评论
下一页