首页 > 其他分享 >RabbitMQ之消息确认机制

RabbitMQ之消息确认机制

时间:2023-05-25 17:33:05浏览次数:38  
标签:AMQP 确认 chan rabbitmq RabbitMQ connect new 机制 ex

RabbitMQ之消息确认机制

标签(空格分隔): php,rabbitmq

在使用RabbitMQ的时候,我们可以通过消息持久化操作来解决因为服务器的异常奔溃导致的消息丢失,除此之外我们还会遇到一个问题,当消息的发布者在将消息发送出去之后,消息到底有没有正确到达broker代理服务器呢?如果不进行特殊配置的话,默认情况下发布操作是不会返回任何信息给生产者的,也就是默认情况下我们的生产者是不知道消息有没有正确到达broker的,如果在消息到达broker之前已经丢失的话,持久化操作也解决不了这个问题,因为消息根本就没到达代理服务器,你怎么进行持久化,那么这个问题该怎么解决呢?

RabbitMQ为我们提供了两种方式:

通过AMQP事务机制实现,这也是AMQP协议层面提供的解决方案;
通过将channel设置成confirm模式来实现;

事物机制

$exChangeName = "exchange_02";
$queueName = 'queue_02';
$options = [
    'host' => '127.0.0.1',
    'port' => '5672',
    'vhost' => '/',
    'login' => 'guest',
    'password' => 'guest'
];
$connect = new \AMQPConnection($options);
try {
    $isConnect = $connect->connect();
    if (!$isConnect) {
        exit("connect rabbitmq error");
    }
} catch (AMQPConnectionException $e) {
    exit("connect rabbitmq error");
}
$chan = new \AMQPChannel($connect);
// 开启事物
$chan->startTransaction();
$ex = new \AMQPExchange($chan);
$ex->setName($exChangeName);
$ex->setType(AMQP_EX_TYPE_DIRECT);
$ex->setFlags(AMQP_DURABLE); // 持久化
$ex->declareExchange();
$bool = $ex->publish("HELLO WORLD", $queueName, AMQP_NOPARAM, ['delivery_mode' => 2]);
$chan->rollbackTransaction(); // 事物回滚
$chan->commitTransaction(); // 事物提交

Confirm

confirm PHP扩展AMQP 我自己试好像不支持异步的 实际业务中应该是用不到


$exChangeName = "exchange_02";
$queueName = 'queue_02';
$options = [
    'host' => '127.0.0.1',
    'port' => '5672',
    'vhost' => '/',
    'login' => 'guest',
    'password' => 'guest'
];
$connect = new \AMQPConnection($options);
try {
    $isConnect = $connect->connect();
    if (!$isConnect) {
        exit("connect rabbitmq error");
    }
} catch (AMQPConnectionException $e) {
    exit("connect rabbitmq error");
}
$chan = new \AMQPChannel($connect);
// 开启
$chan->confirmSelect();
// 设置comfirm ack、nack 回调
$chan->setConfirmCallback(function (int $delivery_tag, bool $multiple) {
    $data = var_export([
        'time' => date('Y-m-d H:i:s'),
        'type' => 'ack',
        'params' => func_get_args()
    ], true);
    file_put_contents("./rabbitmq_log.log", $data . PHP_EOL, FILE_APPEND);
}, function (int $delivery_tag, bool $multiple, bool $requeue) {
    $data = var_export([
        'time' => date('Y-m-d H:i:s'),
        'type' => 'nack',
        'params' => func_get_args()
    ], true);
    file_put_contents("./rabbitmq_log.log", $data . PHP_EOL, FILE_APPEND);
});
$ex = new \AMQPExchange($chan);
$ex->setName($exChangeName);
$ex->setType(AMQP_EX_TYPE_DIRECT);
$ex->setFlags(AMQP_DURABLE); // 持久化
$ex->declareExchange();
$bool = $ex->publish("HELLO WORLD", $queueName, AMQP_NOPARAM, ['delivery_mode' => 2]);
// 等待回应 可以设置时间,这基本用不到,直接阻塞了
$chan->waitForConfirm();

标签:AMQP,确认,chan,rabbitmq,RabbitMQ,connect,new,机制,ex
From: https://www.cnblogs.com/yanweifeng/p/17432026.html

相关文章

  • Locust-任务等待机制
    Locust任务等待的几种方式:constant(2)任务执行完毕等待2秒开始下一任务between(1,7)任务执行完毕等待1-7秒(中间随机取值)开始下一任务constant_pacing(2)从任务启动开始计算时间,若任务耗时超过该时间,则任务结束后立即执行下一任务;若任务耗时不超过该时间,则等待达到该时间后......
  • docker安装rabbitMQ
    输入命令dockerpullrabbitmq:3.7.7-management  设置账号和密码dockerrun-d--namerabbitmq3.7.7-p5672:5672-p15672:15672-v`pwd`/data:/var/lib/rabbitmq--hostnamemyRabbit-eRABBITMQ_DEFAULT_VHOST=my_vhost-eRABBITMQ_DEFAULT_USER=admin-eRABBITM......
  • 单片机消息队列的实现原理和机制2
    出处消息队列在RTOS中基本都有消息队列这个组件,也是使用最常见的组件之一。1.消息队列的基本概念消息队列是一种常用于任务间通信的数据结构,队列可以在任务与任务间、中断和任务间传递信息,实现了任务接收来自其他任务或中断的不固定长度的消息。通过消息队列服务,任务或中断服务......
  • 单片机消息队列的实现原理和机制1
    出处单片机开发过程中通常会用到“消息队列”,一般实现的方法有多种。本文给大家分享一下队列实现的原理和机制。环形队列环形队列是在实际编程极为有用的数据结构,它是一个首尾相连的FIFO的数据结构,采用数组的线性空间,数据组织简单,能很快知道队列是否满为空,能以很快速度的来存......
  • 泛型是一种将类型参数化的动态机制,使用得到的话,可以从以下的方面提升的你的程序
    泛型是一种将类型参数化的动态机制,使用得到的话,可以从以下的方面提升的你的程序:安全性:使用泛型可以使代码更加安全可靠,因为泛型提供了编译时的类型检查,使得编译器能够在编译阶段捕捉到类型错误。通过在编译时检查类型一致性,可以避免在运行时出现类型转换错误和 ClassCastExcept......
  • RabbitMQ系列-概念及安装
    1.消息队列消息队列是指利用队列这种数据结构进行消息发送、缓存、接收,使得进程间能相互通信,是点对点的通信而消息代理是对消息队列的扩展,支持对消息的路由,是发布-订阅模式的通信,消息的发送者并不清楚消息的接收者,消息可以被多个消费者接收。使用消息队列的作用如下异步:对于......
  • 2023年5月22日,内部类,类加载机制
    内部类1.成员内部类packageoutter_inner_01;importoutter_inner_01.Outter.Inner;publicclasstest01{/***知识点:成员内部类**需求:创建成员内部类的对象,并调用其方法**小结:* 1.外部类和内部类不属于继承关系* 2.创建......
  • 区块链的Token机制如何理解?
    区块链的Token机制如何理解?为了更好的理解区块链和Token的关系,今天专门基于互联网中的内容,做了下筛选过滤,从而可以让大家更好的理解,对于Token,如果是从事过开发的同学来说,比如容易理解为用户标识等含义,从而会走一定的弯路。Token机制是区块链技术中的重要概念之一,它指的是在区块......
  • centos7安装erlang、rabbitmq以及php扩展
    centos7安装erlang、rabbitmq以及php扩展标签(空格分隔):liunx,php安装Erlang版本:el7erlang-20.3.8.25erlang-20.3.8.25-1.el7.x86_64.rpm1.下载wget--content-disposition"https://packagecloud.io/rabbitmq/erlang/packages/el/7/erlang-20.3.8.25-1.el7.x86_64.rpm/d......
  • spring的IOC和AOP机制
    ioc(控制反转 inversionofcontrol)和aop(Aspect-OrientedProgramming)是spring的灵魂我的理解:控制反转就是说对原来对象的创建,也就是new一个对象,都是我们手动完成的,但是引入了ioc的思想之后,我们将对象的创建交给spring容器而不需要我们手动进行创建,我们要用的时候只需要将......