网站关键词掉了,烟台做网站推广的公司哪家好,汽车网站建设流程图,域名被墙查询检测延迟队列
当一个队列中的消息满足下列情况之一#xff0c;可以成为死信#xff1a; #xff08;1#xff09;消费者使用basic.reject或basic.nack声明消费失败#xff0c;并且消息的requeue参数设置为false #xff08;2#xff09;消息是一个过期消息#xff0c;超时…延迟队列
当一个队列中的消息满足下列情况之一可以成为死信 1消费者使用basic.reject或basic.nack声明消费失败并且消息的requeue参数设置为false 2消息是一个过期消息超时无人消费 3要投递的队列消息堆积满了最早的消息可能成为死信 如果该队列配置了dead-letter-exchange属性指定了一个交换机那么队列中的死信就会投递到这个交换机中而这个交换机称为死信交换机。 如何给队列绑定死信交换机 1给队列设置dead-letter-exchange属性指定一个交换机 2给队列设置dead-letter-routing-key属性设置死信交换机与死信队列的RoutingKey
TTL(Time-To-Live)。如果一个队列中的消息TTL结束仍未消费则会变为死信TTL超时分为两种情况 1消息所在的队列设置了存活时间 2消息本身设置了存活时间
利用TTL结合死信交换机实现了消息发出后消费者延迟收到消息的效果。这种消息模式就称为延迟队列模式。 延迟队列的使用场景包括 1延迟发送短信 2用户下单如果用户在15 分钟内未支付则自动取消 3预约工作会议20分钟后自动通知所有参会人员
DelayExchange的本质还是官方的三种交换机只是添加了延迟功能。因此使用时只需要声明一个交换机交换机的类型可以是任意类型然后设定delayed属性为true即可。 基于注解的方式
RabbitListener(bindings QueueBinding(value Queue(name DelayQueue,durable true),exchange Exchange(name delay-mq-exchange_B,delayed true),key routingKey_delay))
Component
Slf4j
public class DirectConsumer {......
}基于Java代码的方式 Beanpublic Exchange orderExchange(){return ExchangeBuilder.topicExchange(RabbitMQExchanges.EXCHANGE_B.getExchange()).delayed().durable(true).build();}向delay为true的交换机中发送消息一定要给消息添加一个headerx-delay值为延迟的时间单位为毫秒
Message message MessageBuilder.withBody(String.valueOf(content).getBytes(StandardCharsets.UTF_8)).setHeader(delay-one,500000).build();惰性队列
**消息堆积问题**当生产者发送消息的速度超过了消费者处理消息的速度就会导致队列中的消息堆积直到队列存储消息达到上限。最早接收到的消息可能就会成为死信会被丢弃这就是消息堆积问题。
惰性队列的特征如下 1接收到消息后直接存入磁盘而非内存 2消费者要消费消息时才会从磁盘中读取并加载到内存 3支持数百万条的消息存储 而要设置一个队列为惰性队列只需要在声明队列时指定x-queue-mode属性为lazy即可。用SpringAMQP声明惰性队列分两种方式 基于注解的方式
RabbitListener(bindings QueueBinding(value Queue(name DelayQueue,durable true,arguments Argument(name x-dead-letter-exchange,value lazy)),exchange Exchange(name delay-mq-exchange_B,delayed true),key routingKey_delay))基于Java代码的方式 Beanpublic Queue orderQueue(){return QueueBuilder.durable(RabbitMQQueue.RABBIT_MQ_QUEUE_A.getQueue()).lazy().build();}