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

 更新时间:2023年05月10日 09:51:21   作者:stark张宇  
这篇文章主要介绍了消息队列中间件之RabbitMQ消息的持久化、确认机制、死信队列原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

持久化和应答机制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的资料请关注程序员之家其它相关文章!

相关文章

  • vscode安装使用的详细教程

    vscode安装使用的详细教程

    Visual Studio Code (简称 VS Code / VSC) 是一款免费开源的现代化轻量级代码编辑器,这篇文章主要介绍了vscode安装使用的详细教程,需要的朋友可以参考下
    2020-08-08
  • ArcGIS Pro 按照字段进行融合或拆分的操作步骤

    ArcGIS Pro 按照字段进行融合或拆分的操作步骤

    ArcGIS Pro 是 Esri 提供的功能全面的专业桌面 GIS 应用程序,这篇文章主要介绍了ArcGIS Pro 按照字段进行融合或拆分,需要的朋友可以参考下
    2024-02-02
  • APAP?ALV进阶写法及优化详解

    APAP?ALV进阶写法及优化详解

    这篇文章主要为大家介绍了APAP?ALV进阶写法及优化详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • JetPack开发中使用CameraX完成拍照和拍视频功能

    JetPack开发中使用CameraX完成拍照和拍视频功能

    CameraX 是一个 Google 推出的 JetPack 组件。今天给大家分享JetPack之使用CameraX完成拍照和拍视频,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-06-06
  • 趁热打铁!HTTPGet与HTTPPost的区别详解

    趁热打铁!HTTPGet与HTTPPost的区别详解

    这篇文章主要介绍了趁热打铁!HTTPGet与HTTPPost的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • IDEA开启Run Dashboard的配置详解

    IDEA开启Run Dashboard的配置详解

    这篇文章主要介绍了IDEA开启Run Dashboard的配置详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Hadoop环境搭建过程中遇到的问题及解决方法

    Hadoop环境搭建过程中遇到的问题及解决方法

    这篇文章主要介绍了Hadoop环境搭建过程中遇到的问题及解决方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下吧
    2019-08-08
  • Webstorm开发工具使用教程详解

    Webstorm开发工具使用教程详解

    这篇文章主要为大家详细介绍了Webstorm使用教程的使用教程,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-09-09
  • 新手程序员编程必不可少的工具

    新手程序员编程必不可少的工具

    这篇文章主要为大家详细介绍了新手程序员编程必不可少的工具,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • 电子邮件 退信原因大全

    电子邮件 退信原因大全

    我们可以对邮件多尝试几次发送,如果实在不行那就过一会再发送邮件。
    2009-06-06

最新评论

?


http://www.vxiaotou.com