RabbitMQ队列中间件消息持久化?确认机制?死信队列原理(rabbitmq消息队列类型)学会了吗

随心笔谈2年前发布 admin
186 0 0

文章摘要

文章主要介绍了RabbitMQ消息队列的持久化、确认机制、死信队列、延时队列以及集群模式的相关内容,内容涵盖队列的管理、消息的处理以及集群高可用性的实现。 文章从队列的持久化机制开始,详细说明了消息的自动确认和手动确认机制,并解释了死信队列(DLX)的作用及其成因(如消息被拒绝或过期)和配置方式。同时,文章介绍了延时队列的作用,用于延迟消息的消费以避免节点崩溃时服务中断。 在集群模式部分,文章重点阐述了消息队列在主备模式、镜像模式和异地多活模式下的功能。其中,镜像模式是最常用的高可用模式,通过主动同步消息实体确保数据不丢失。文章还提到,异地多活模式常用于大型互联网公司,借助federation插件实现集群间的消费复制。 文章通过详细解析RabbitMQ的核心功能,为读者提供了全面了解消息队列中间件的实用知识。



目录持久化和应答机制Ack消息持久化应答机制Ack死信队列延时队列集群模式

消息队列中间件系列的最后一篇了,RabbitMQ消息的持久化、确认机制、死信队列、负载均衡等一系列进行说明。

当RabbitMq重启以后,未消费的消息,可以在服务重启后继续消费,不会丢失。

两种方式:一种是自动确认,一种是手动确认

自动确认就是消费者接收消息以后,立即ack,然后再慢慢处理业务逻辑,假如业务逻辑出现异常,消息也会被确认的。手动确认,消费者接收消息以后,消息状态被置为unack状态,然后由业务逻辑指定ack的位置,假如没有手动ack,则mq中的消息不回减少。

死信队列 DLX(Dead-Letter-Exchange) 也可以成为死信交换机,就是当一个队列中的消息变成死信以后,会被重新发送到另一个交换机,这个交换机就是DLX,而绑定DLX的队列就是死信队列。

死信队列的成因:

**消息被拒绝,**消费者中使用 (basic.reject/basic.nack),并且 requeue=false , 消息被拒绝接收后就会进入到死信队列中。

# 消费者
$callback=function ($msg) {
// 拒绝接收消息
$msg->delivery_info[‘channel’]->basic_ack($msg->delivery_info[‘delivery_tag’]);
};
$channel->basic_qos(null, 1, null);
$channel->basic_consume($queueName,”, false,false,false,false,$callback);

**消息过期,**可以使用 x-message-ttl 参数设置当前队列中所有消息的过期时间(单位毫秒)。一旦消息过期,就会从队列中删除。

// 在正常队列中设置消息过期时间
$channel->exchange_declare(‘logs’, ‘direct’,false, false, false);
$args=new AMQPTable([
// 消息过期时间
‘x-message-ttl’ => 20000,
// 死信交换机
‘x-dead-letter-exchange’=> ‘dead-exc’,
// 死信路由键
‘x-dead-letter-routing-key’=> ‘dead-key’
]);
$channel->queue_declare($queue_name, false, true,false,false,false,$args);
$channel->queue_bind($queue_name, ‘logs’);

队列达到最大长度: 设置最大消息数, 设置最大长度(以字节为单位)。如果设置了两个参数,则两者都将适用,将强制执行首先达到的限制。

$args=new AMQPTable([
// 设置最大消息数
‘x-max-length’=> 2,
‘x-dead-letter-exchange’=> ‘dead-exc’,
‘x-dead-letter-routing-key’=> ‘dead-key’
]);

设置死信队列,只需要定义队列的时候设置指定交换机就可以了

延时队列就是当消息发送以后,并不想让消费者立刻拿到消息,而是等待特定时间后消费者才能拿到消息来消费。

允许生产者和消费者在RabbitMQ节点崩溃的情况下继续运行。允许通过添加更多的节点来扩展消息通信的吞吐量。

RabbitMQ会始终记录以下四种类型的内部元数据:

队列元数据,队列名称和它们的属性(是否持久化,是否自动删除)交换机元数据,交换器类型、名称和属性绑定元数据,一张简单的表格展示了如何将消息路由到队列vhost元数据,为vhost内的队列、交换机和绑定提供命名空间和安全属性

RabbitMQ集群分为3个模式,主备模式,镜像模式,异地多活模式。

主备模式,从节点相当于主节点的链接,所有从节点收到的请求,真实转向的都是主节点,一般在并发和数据不是特别多的情况下使用,当主节点挂掉会从备份的节点中选择一个节点出来作为主节点对外提供服务。镜像模式,将需要消费的队列变成镜像队列,存在于多个节点,这样就可以实现RabbitMQ的HA高可用,作用就是消息实体会主动在镜像节点之间实现同步,任何一个节点宕机都都关系,保证100%数据不丢失,在实际工作中用的最多的。异地多活模式,用来实现异地的数据复制,使用多活模式需要借助federation插件来实现集群间或节点间的消费复制,广泛用于多互联网公司。

以上就是消息队列中间件 – RabbitMQ消息的持久化、确认机制、死信队列的详细内容,更多关于消息队列中间件 – RabbitMQ的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:如何利用rabbitMq的死信队列实现延时消息详解RabbitMQ中死信队列和延迟队列的使用详解SpringBoot整合RabbitMQ实战教程附死信交换机深入分析RabbitMQ中死信队列与死信交换机

© 版权声明

相关文章