RabbitMQ队列中间件消息持久化 确认机制 死信队列原理

 更新时间:2023年05月10日 09:51:21   作者:stark张宇  
这篇文章主要介绍了消息队列中间件之RabbitMQ消息的持久化、确认机制、死信队列原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

持久化和应答机制Ack

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

消息持久化

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

应答机制Ack

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

  • 自动确认就是消费者接收消息以后,立即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');

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

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

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

延时队列

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

集群模式

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

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

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

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

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

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

相关文章

  • IEEE Spectrum 2014编程语言排行榜

    IEEE Spectrum 2014编程语言排行榜

    这篇文章主要介绍了IEEE Spectrum 2014编程语言排行榜,这不是TIOBE编程语言排行榜哦,需要的朋友可以参考下
    2014-08-08
  • Elasticsearch之基本查询及组合查询操作示例

    Elasticsearch之基本查询及组合查询操作示例

    这篇文章主要为大家介绍了Elasticsearch之基本查询及组合查询操作示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • 详解SHA-256算法的原理以及C#和JS的实现

    详解SHA-256算法的原理以及C#和JS的实现

    SHA-256 是 SHA-2 下细分出的一种算法。截止目前(2023-03)未出现“碰撞”案例,被视为是绝对安全的加密算法之一,本文主要介绍了SHA-256算法的原理以及C#和JS的实现,希望对大家有所帮助
    2023-03-03
  • 鸿蒙中Axios数据请求的封装和配置方法

    鸿蒙中Axios数据请求的封装和配置方法

    这篇文章主要介绍了鸿蒙中Axios数据请求的封装和配置方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-04-04
  • Uint 和 int 的区别解析

    Uint 和 int 的区别解析

    Int与Uint的区别在于带符号与不带符号,在计算机中根据补码进行互相转换,很多语言是有方法支持的,但是也有一些并没有转换方法,比如SQLserver(SQLserver不支持Uint类型),下面详细介绍Uint 和 int 的区别,感兴趣的朋友一起看看吧
    2023-08-08
  • EventStore文件存储设计详解

    EventStore文件存储设计详解

    ENode是一个CQRS+Event Sourcing架构的开发框架,这篇文章主要介绍了EventStore文件存储设计 ,需要的朋友可以参考下
    2019-05-05
  • Blazor实现组件嵌套传递值的示例详解

    Blazor实现组件嵌套传递值的示例详解

    这篇文章主要为大家详细介绍了Blazor实现组件嵌套传递值的相关知识,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的可以了解一下
    2023-02-02
  • XMind 2021激活码及安装步骤

    XMind 2021激活码及安装步骤

    XMind 是一款非常实用的商业思维导图,应用Eclipse RCP 开发架构,打造易用、高效的可视化思维,强调该功能的可扩展、跨平台、稳定性和性能,致力于帮助用户提高生产率。本文给大家带来了XMind 2021激活码,需要的朋友可以参考下
    2021-12-12
  • Git版本控制服务器详解

    Git版本控制服务器详解

    这篇文章主要为大家介绍了Git版本控制服务器详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Git常用命令介绍

    Git常用命令介绍

    Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。这篇文章介绍了Git的常用命令,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-01-01

最新评论