首页 > 其他分享 >Rabbitmq 发送者Ack+持久化

Rabbitmq 发送者Ack+持久化

时间:2024-04-21 22:34:43浏览次数:13  
标签:queue false Ack Rabbitmq 发送者 队列 message true channel

 rabbitmq数据不丢失需要满足以下几点:(开启持久化后rabbitmq性能会下降)

  • 生产者confirm 消息确认机制
  • rabbitmq的交换机,队列,消息设置为持久化
  • 关闭消费者的自动ack换为手动ack
     1 public function producer(){
     2         $exchange = "topic-text";
     3         $type = "topic";
     4         $msg = [11111];
     5         $routerKey = "topic.info";
     6         $queue_name = "hyperf-t";
     7         // 创建rabbitmq连接
     8         $config = [
     9             'host' => env('AMQP_IP'),
    10             'port' => env('AMQP_PORT'),
    11             'user' => env('AMQP_USER'),
    12             'password' => env('AMQP_PASS'),
    13         ];
    14         $connection = new AMQPStreamConnection($config['host'], $config['port'], $config['user'], $config['password'], env('AMQP_VHOST'));
    15         // 创建Channel
    16         $channel = $connection->channel();
    17         //设置一个消息没有处理完成之前不会给同一个消费者发送第二个
    18         $channel->basic_qos(0, 1,true);
    19         //设置发送端必须ack应答
    20         $channel->confirm_select();
    21         //成功回调
    22         $channel->set_ack_handler(function (AMQPMessage $message){
    23             echo "这是成功回调".$message->body;
    24             file_put_contents("1.txt","这是成功回调".$message->body) ;
    25         });
    26         //失败回调
    27         $channel->set_nack_handler(function (AMQPMessage $message){
    28             echo "这是失败回调".$message->body;
    29             file_put_contents("2.txt","这是失败回调".$message->body) ;
    30         });
    31         // 声明交换机
    32         $channel->exchange_declare(
    33             $exchange, // 交换机名,需要唯一,不能重复
    34             $type, // 交换机类型
    35             false,
    36             true, // 是否持久化
    37             false
    38         );
    39         //生命和绑定队列
    40         /*
    41          * 参数说明:
    42          * $queue:(必需)队列的名称。
    43          * $passive:(可选)如果设置为 true,则仅返回有关队列是否存在的信息,不创建队列。默认为 false。
    44          * $durable:(可选)如果设置为 true,则队列将在服务器重启后持久存在。默认为 false。
    45          * $exclusive:(可选)如果设置为 true,则队列将仅对首次声明它的连接可见,并在连接断开时自动删除。默认为 false。
    46          * $auto_delete:(可选)如果设置为 true,则当所有消费者都已离开队列时,队列将自动被删除。默认为 false。
    47          * $nowait:(可选)如果设置为 true,则不会等待服务器的响应。默认为 false。
    48          * $arguments:(可选)一个关联数组,包含了队列的其他参数,例如:x-message-ttl 或 x-expires 等。
    49          * $ticket:(可选)可用于确认持久化队列的创建。
    50          */
    51         $channel->queue_declare($queue_name, false, true, false, false);
    52 
    53         $channel->queue_bind($queue_name, $exchange,$routerKey);
    54         // 消息对象并设置持久化,参数是消息内容
    55         $msg = new AMQPMessage(json_encode($msg), ['delivery_mode' => 2]);
    56 
    57         // 注意第三个参数,路由参数
    58         $channel->basic_publish(
    59             $msg, // 消息对象
    60             $exchange, // 交换机名字
    61             $routerKey// 路由参数,可以根据需求,任意定义。
    62         );
    63         //等待rabbitmq返回消息
    64         $channel->wait_for_pending_acks();
    65         // 释放资源
    66         $channel->close();
    67         $connection->close();
    68     }

     

 

标签:queue,false,Ack,Rabbitmq,发送者,队列,message,true,channel
From: https://www.cnblogs.com/yue97843/p/18149640

相关文章

  • The Stack and the Heap栈与堆__Rust
    Manyprogramminglanguagesdon’trequireyoutothinkaboutthestackandtheheapveryoften.许多编程语言并不会要求你经常思考堆栈。ButinasystemprogramminglanguagelikeRust,whetheravalueisonthestackortheheapaffectshowthelanguagebehaves......
  • kettle从入门到精通 第五十三课 ETL之kettle MQTT/RabbitMQ consumer实战
    1、上一节课我们学习了MQTTproducer生产者步骤,MQTTconsumer消费者步骤。该步骤可以从支持MRQTT协议的中间件获取数据,该步骤和kafkaconsumer一样可以处理实时数据交互,如下图所示: 2、双击步骤打开MQTTconsumer配置窗口,如下图所示:Stepname:自定义步骤名称。Transformat......
  • kettle从入门到精通 第五十三课 ETL之kettle MQTT/RabbitMQ producer 实战
    1、MQTT介绍MQTT(MessageQueuingTelemetryTransport)是一种轻量级的消息传输协议,设计用于连接低带宽、高延迟或不可靠网络的设备。MQTT是基于发布/订阅模式(Publish/Subscribe)的协议,其中设备可以发布消息到一个主题(Topic),其他设备可以订阅这个主题以接收相关消息。这种模式......
  • ML Sys | Apache TVM 添加新 backend
    硬件决定上限,软件实现上限。即使是顶尖的硬件也需要匹配优秀的软件栈才能发挥最大功效。如今MachineLearningCompiler主要有ApacheTVM和MLIR(MultiLevelIR)两种范式。让我们来研究一下TVM如何支持新的backend。ApacheTVM后端主要维护GPU和CPU平台,对于新后端......
  • 1249. 移除无效的括号(stack)
      给你一个由 '('、')' 和小写字母组成的字符串 s。你需要从字符串中删除最少数目的 '(' 或者 ')' (可以删除任意位置的括号),使得剩下的「括号字符串」有效。请返回任意一个合法字符串。有效「括号字符串」应当符合以下 任意一条 要求:空字符串或只包含......
  • ORA-19599 When Backing up an Archivelog that is Corrupt
    前几天遇到了一起备份失败案例,RMAN备份过程中遇到了归档日志损坏的情况,还是第一次遇到这种案例,这里记录一下这个案例的具体情况。备份作业失败,检查RMAN备份的输出日志,发现一个归档日志文件损坏(corrupt)了,如下所示:RMAN-08137: warning: archived log not deleted, needed f......
  • JDBC数据库汇总Attack研究
    前言针对除Mysql的其它数据库的jdbcattack分析H2RCE介绍H2是一个用Java开发的嵌入式数据库,它本身只是一个类库,即只有一个jar文件,可以直接嵌入到应用项目中。H2主要有如下三个用途:第一个用途,也是最常使用的用途就在于可以同应用程序打包在一起发布,这样可以非常方便地......
  • webpack打包优化方案
    以下是一些常见的webpack打包优化方案:1.使用生产模式(productionmode)://webpack.config.jsmodule.exports={mode:'production',//...其他配置};2.代码分割(CodeSplitting)://webpack.config.jsmodule.exports={//...optimization:{splitChunks......
  • 2024-04-18 使用webpack减少打包文件数量
    减少Webpack打包文件的数量通常涉及多个策略和配置选项。下面是一些具体的方法和示例代码,帮助你实现这一目标:1.代码分割(CodeSplitting)使用动态导入(import())语法将代码分割成多个块,这样Webpack会为每个块生成一个单独的文件。//假设我们有一个大型的组件库//而不是......
  • 应急响应靶场Where-1S-tHe-Hacker
    应急响应实战靶场打开靶机,发现有两个用户,admin和admin$,一个是隐藏用户admin用户的密码是Aa123456杀软查杀进入主机,我们直接使用D盾和D-eyes杀软进行后台扫描,节省时间这边附上绿盟科技的D-Eyes的使用参数说明####Windows请以管理员身份运行cmd,之后再输入D-Eyes路径运......