首页 > 其他分享 >8、RabbitMQ队列之发布确认【RabbitMQ官方教程】

8、RabbitMQ队列之发布确认【RabbitMQ官方教程】

时间:2024-12-31 14:51:36浏览次数:1  
标签:教程 队列 确认 RabbitMQ 发布 消息 发布者 message channel

Publisher确认是一个RabbitMQ扩展,用于实现可靠的发布。当发布者确认在通道上启用时,客户端发布的消息将由代理异步确认,这意味着它们已在服务器端得到处理。

概述

在本教程中,我们将使用发布者确认来确保发布的消息已安全到达代理。我们将介绍使用出版商确认的几种策略,并解释它们的优缺点。

在频道上启用发布者确认

Publisher确认是AMQP 0.9.1协议的RabbitMQ扩展,因此默认情况下未启用。使用confirm_select方法在通道级别启用发布者确认:

$channel = $connection->channel();
$channel->confirm_select();

必须在您希望使用publisher confirms的每个通道上调用此方法。确认应该只启用一次,而不是对发布的每条消息都启用。

 

策略#1:单独发布消息

让我们从使用confirms发布的最简单方法开始,即发布消息并同步等待其确认:

在前面的示例中,我们像往常一样发布消息,并使用 $channel::wait_forpending_acks(int|float) 方法等待其确认。消息确认后,该方法立即返回。如果消息未在超时内得到确认,或者消息被发送(意味着代理因某种原因无法处理它),则该方法将抛出异常。异常的处理通常包括记录错误消息和/或重试发送消息。

不同的客户端库有不同的方式来同步处理发布者确认,因此请务必仔细阅读您正在使用的客户端的文档。

这种技术非常简单,但也有一个主要缺点:它会显著减慢发布速度,因为消息的确认会阻止所有后续消息的发布。这种方法不会提供每秒超过几百条已发布消息的吞吐量。然而,对于某些应用来说,这已经足够好了。

发布者确认异步吗?

我们在开始时提到,代理异步确认已发布的消息,但在第一个示例中,代码会同步等待,直到消息得到确认。客户端实际上异步接收确认,并相应地解除对 wait_for_pending_acks 的调用。将 wait_for_pending_acks 视为一个同步助手,它在后台依赖于异步通知

策略#2:批量发布消息

为了改进我们之前的示例,我们可以发布一批消息并等待整批消息得到确认。以下示例使用一批100:

$batch_size = 100;
$outstanding_message_count = 0;
while (thereAreMessagesToPublish()) {
    $data = ...;
    $msg = new AMQPMessage($data);
    $channel->basic_publish($msg, 'exchange');
    $outstanding_message_count++;
    if ($outstanding_message_count === $batch_size) {
        $channel->wait_for_pending_acks(5.000);
        $outstanding_message_count = 0;
    }
}
if ($outstanding_message_count > 0) {
    $channel->wait_for_pending_acks(5.000);
}

等待一批消息得到确认比等待单个消息的确认大大提高了吞吐量(对于远程RabbitMQ节点,可达20-30倍)。一个缺点是,我们不知道在失败的情况下到底出了什么问题,所以我们可能不得不在内存中保存一整批数据来记录有意义的内容或重新发布消息。这个解决方案仍然是同步的,因此它阻止了消息的发布。

策略3:异步处理发布者确认

代理异步确认已发布的消息,只需在客户端注册一个回调,即可收到这些确认的通知:

$channel = $connection->channel();
$channel->confirm_select();

$channel->set_ack_handler(
    function (AMQPMessage $message){
        // code when message is confirmed
    }
);

$channel->set_nack_handler(
    function (AMQPMessage $message){
        // code when message is nack-ed
    }
);

有2个回调:一个用于确认消息,一个用于nack-ed消息(可以被代理视为丢失的消息)。每个回调都有 AMQPMessage$message 参数和返回的消息,因此您不需要处理序列号(传递标签)来了解此回调属于哪个消息。

概述

在某些应用程序中,确保发布的消息到达代理可能是至关重要的。Publisher确认,RabbitMQ功能有助于满足这一要求。发布者确认本质上是异步的,但也可以同步处理。没有明确的方法来实现发布者确认,这通常归结为应用程序和整个系统中的约束。典型的技术有:

  • 单独发布消息,同步等待确认:简单,但吞吐量非常有限。
  • 批量发布消息,等待批量同步确认:简单、合理的吞吐量,但很难推断出什么时候出了问题。
  • 异步处理:性能最佳,资源利用率高,发生错误时控制良好,但可以正确实施。

 

官方链接:https://www.rabbitmq.com/tutorials/tutorial-seven-php

标签:教程,队列,确认,RabbitMQ,发布,消息,发布者,message,channel
From: https://www.cnblogs.com/dreamboycx/p/18644025

相关文章

  • rabbitmq-2
    springboot/springcloud整合rabbitmq实战简单例子生产者创建项目,引入jar<!--springboot整合rabbitmq包--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId......
  • 【SD教程】一文教你图生图批量处理!
    今天给大家讲解一下SD图生图的批量处理功能应该如何让使用~(AI绘画SD整合包、各种模型插件、提示词、AI人工智能学习资料都已经打包好放在网盘中了,无需自行查找,有需要的小伙伴文末扫码自行获取。)一、图生图批量处理功能的基本用法首先打开webUI,在图生图页面下我们先找到批量......
  • 7、RabbitMQ队列之远程调用(RPC)【RabbitMQ官方教程】
    在第二个教程中,我们学习了如何使用工作队列在多个工作人员之间分配耗时的任务。但是,如果我们需要在远程计算机上运行一个函数并等待结果呢?好吧,那是另一回事。这种模式通常被称为远程过程调用或RPC。在本教程中,我们将使用RabbitMQ构建一个RPC系统:一个客户端和一个可扩展的RPC服务......
  • 黑客入门教程(非常详细)从零基础入门到精通资源分享,看完这一篇就够了
    网络安全&黑客学习资源分享:给大家分享一份全套的网络安全学习资料,给那些想学习网络安全的小伙伴们一点帮助!对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。因篇幅有限,仅展示......
  • CTF入门教程(非常详细)从零基础入门到竞赛,看这一篇就够了!
    目录一、CTF简介二、CTF竞赛模式三、CTF各大题型简介四、CTF学习路线4.1、初期1、html+css+js(2-3天)2、apache+php(4-5天)3、mysql(2-3天)4、python(2-3天)5、burpsuite(1-2天)4.2、中期1、SQL注入(7-8天)2、文件上传(7-8天)3、其他漏洞(14-15天)4.3、后期五、CTF学......
  • 关于 IntelliJ IDEA 2024 安装激活使用教程以及常见问题(激活至2026,实际上永久,亲测!)
    申明:本教程IntelliJIDEA补丁、激活码均收集于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除。若条件允许,希望大家购买正版!卸载老版本IDEA首先,如果小伙伴的电脑上有安装老版本的IDEA,需要将其彻底卸载掉,如下所示(没有安装则不用管,直接安装即可):TIP:如果你之前使......
  • 在Lazarus下的Free Pascal编程教程——在程序运行时改变组件的外观
    0.前言我想通过编写一个完整的游戏程序方式引导读者体验程序设计的全过程。我将采用多种方式编写具有相同效果的应用程序,并通过不同方式形成的代码和实现方法的对比来理解程序开发更深层的知识。了解我编写教程的思路,请参阅体现我最初想法的那篇文章中的“1.编程计划”和“2.已经......
  • 6、RabbitMQ队列之主题【RabbitMQ官方教程】
    在前面的教程中,我们改进了日志系统。我们没有使用只能进行虚拟广播的扇出交换机,而是使用了直接交换机,从而有可能选择性地接收日志。虽然使用直接交换改进了我们的系统,但它仍然有局限性——它不能基于多个标准进行路由。在我们的日志系统中,我们可能不仅要根据严重性订阅日志,还要......
  • 5、RabbitMQ队列之路由【RabbitMQ官方教程】
    在前面的教程中,我们构建了一个简单的日志系统。我们能够向许多接收器广播日志消息。在本教程中,我们将为其添加一个功能——我们将使仅订阅消息的一个子集成为可能。例如,我们将能够仅将关键错误消息定向到日志文件(以节省磁盘空间),同时仍然能够在控制台上打印所有日志消息。 绑定......
  • DVWA靶场Command Injection(命令注入) 漏洞low(低),medium(中等),high(高)所有级别通关
    命令注入命令注入漏洞是一种安全漏洞,攻击者可以通过向应用程序输入恶意命令,诱使系统执行这些命令,从而达到未授权访问、数据篡改、系统控制等目的。该漏洞通常出现在应用程序未对用户输入进行充分验证和清理时常见管道符:;前面的执行完执行后面的|上一条命令的输出,作......