如果消息未被确认并且应用程序发生故障,则将自动重新发送,并且将信封上的重新传递属性设置为true(除非使用no-ack = true标志消费).

UPD:

您必须在catch块中使用重新发送标志来消息

try {

//Do some business logic

} catch (Exception $ex) {

//Log exception

return $queue->nack($msg->getDeliveryTag(), AMQP_REQUEUE);

}

当RabbitMQ和AMQP协议中没有实现重新传递计数时,请注意无限制的Nacked消息.

如果你不想混淆这样的消息,只是想添加一些延迟,你可能想在nack方法调用之前添加一些sleep()或usleep(),但这根本不是一个好主意.

有多种技术来处理循环重传问题:

>职业:可靠,标准,清晰

cons:需要额外的逻辑

>职业:容易实施,也是标准,明确

cons:长排队你可能会丢掉一些信息

示例(注意,对于队列ttl,我们只传递数字和消息ttl – 任何将是数字字符串):

2.1每消息ttl:

$queue = new AMQPQueue($channel);

$queue->setName('my-queue');

$queue->declareQueue();

$queue->bind('my-exchange');

$exchange->publish(

'message at ' . microtime(true),

null,

AMQP_NOPARAM,

array(

'expiration' => '1000'

)

);

2.2.每队列ttl:

$queue = new AMQPQueue($channel);

$queue->setName('my-queue');

$queue->setArgument('x-message-ttl', 1000);

$queue->declareQueue();

$queue->bind('my-exchange');

$exchange->publish('message at ' . microtime(true));

3.在消息正文或标题中保留重新传送者计数或者重新设置重定向器号码(也称为IP堆栈中的跳数限制或ttl)

>专业人士:在应用程序级别上给予您对消息生命周期的额外控制

> cons:显着的开销,而你必须修改消息并再次发布,具体应用,不清楚

码:

$queue = new AMQPQueue($channel);

$queue->setName('my-queue');

$queue->declareQueue();

$queue->bind('my-exchange');

$exchange->publish(

'message at ' . microtime(true),

null,

AMQP_NOPARAM,

array(

'headers' => array(

'ttl' => 100

)

)

);

$queue->consume(

function (AMQPEnvelope $msg, AMQPQueue $queue) use ($exchange) {

$headers = $msg->getHeaders();

echo $msg->isRedelivery() ? 'redelivered' : 'origin', ' ';

echo $msg->getDeliveryTag(), ' ';

echo isset($headers['ttl']) ? $headers['ttl'] : 'no ttl' , ' ';

echo $msg->getBody(), PHP_EOL;

try {

//Do some business logic

throw new Exception('business logic failed');

} catch (Exception $ex) {

//Log exception

if (isset($headers['ttl'])) {

// with ttl logic

if ($headers['ttl'] > 0) {

$headers['ttl']--;

$exchange->publish($msg->getBody(), $msg->getRoutingKey(), AMQP_NOPARAM, array('headers' => $headers));

}

return $queue->ack($msg->getDeliveryTag());

} else {

// without ttl logic

return $queue->nack($msg->getDeliveryTag(), AMQP_REQUEUE); // or drop it without requeue

}

}

return $queue->ack($msg->getDeliveryTag());

}

);

可能还有其他一些方法可以更好地控制消息重传流.

结论:没有银弹解决方案.你必须决定什么解决方案适合你的需要最好或找出其他的东西,但不要忘记在这里分享)

mq 自动消费 php,php – 从RabbitMq消费不确认消息相关推荐

  1. rabbitmq 集群保证顺序消费_随笔《RabbitMQ》如何保证消息不被重复消费

    以下文章来源于Java旅途 ,作者Java旅途 Java旅途 坚持原创,坚持分享 一 重复消息 为什么会出现消息重复?消息重复的原因有两个:1.生产时消息重复,2.消费时消息重复. 1.1 生产时消息 ...

  2. RabbitMQ:高效传递消息的魔法棒,一篇带你助力构建可靠的分布式系统(上篇)

    目录 一 什么是MQ 1.1 MQ的概念 1.2 MQ的流量消峰 1.3 MQ的应用解耦 1.4 MQ的异步处理 1.5 MQ的分类以及如何选择 1.5.1 ActiveMQ 1.5.2 Apache ...

  3. springboot整合rabbitmq的发布确认,消费者手动返回ack,设置备用队列,以及面试题:rabbitmq确保消息不丢失

    目录 1.生产者发消息到交换机时候的消息确认 2.交换机给队列发消息时候的消息确认 3.备用队列 3.消费者手动ack rabbitmq的发布确认方式,可以有效的保证我们的数据不丢失. 消息正常发送的 ...

  4. RabbitMq(十三)消息发送确认与回调机制

    在rabbitmq中如何确认消息发送到交换机上以及是否正常交换机转发到消息队列上,在rabbitmq上均有其确认实现接口. confirm-callback :消息确认机制,也就是消息是否正常发送到交 ...

  5. rabbitmq消费端auto和manual区别;处理mq的requeue

    概述 auto和manual区别其实就如字面意思一般,auto代表自动确认消息,只要消费者的方法执行完了,就自动告诉mq当前消息确认.manual则是需要手动通知mq.不需要想的很复杂就是这么直接. ...

  6. RabbitMQ(八):SpringBoot 整合 RabbitMQ(三种消息确认机制以及消费端限流)

    说明 本文 SpringBoot 与 RabbitMQ 进行整合的时候,包含了三种消息的确认模式,如果查询详细的确认模式设置,请阅读:RabbitMQ的三种消息确认模式 同时消费端也采取了限流的措施, ...

  7. 消息中间件--RabbitMQ --- 消费端限流 -- 非常重要

    什么是消费端的·限流? 假设一个场景,首先,我们Rabbitmq服务器有上万条未处理的消息,我们随便打开一个消费者客户端,会出现下面的情况: 巨量的消息瞬间全部推送过来,但是我们单个客户端无法同时处理 ...

  8. 面试官:说说RabbitMQ 消费端限流、TTL、死信队列

    欢迎关注方志朋的博客,回复"666"获面试宝典 1. 为什么要对消费端限流 假设一个场景,首先,我们 Rabbitmq 服务器积压了有上万条未处理的消息,我们随便打开一个消费者客户 ...

  9. RabbitMQ(七):RabbitMQ 消费端限流、TTL、死信队列是什么?

    消费端限流 1. 为什么要对消费端限流 假设一个场景,首先,我们 Rabbitmq 服务器积压了有上万条未处理的消息,我们随便打开一个消费者客户端,会出现这样情况: 巨量的消息瞬间全部推送过来,但是我 ...

最新文章

  1. Android Studio的技巧
  2. Hello, World!我的房车编程生活,已经 150 天了
  3. 优化算法笔记|飞蛾扑火优化算法理解及实现
  4. 《认清C++语言》之--内存管理
  5. Tomcat为Cookie设置HttpOnly属性
  6. python strip_Python strip()方法
  7. HTTP GET 和 POST 的区别
  8. linux_nmon监控教程,如何使用Nmon监控Linux系统性能
  9. 三、MQTT Windosw下的 进一步调试
  10. WebSocket和WebRtc的一些心得
  11. Angr安装与使用之安装篇
  12. Sublime Text 2 注册码/破解方法【蕃薯耀】
  13. 计算机技术未来的研究热点,计算机科学前沿热点及发展趋势
  14. python教材分析_初中信息技术_初识Python教学设计学情分析教材分析课后反思
  15. 好看的硬笔字体,怎样设计出好看的中国风艺术字体
  16. 微信商户号进件接口,错误之 重新确认最终受益人字段
  17. 职称论文发表教育期刊《中小学教育》杂志简介及投稿须知
  18. 工程项目成本费用明细表_工程施工合同成本费用明细表有哪些
  19. 产品日记(二)一些愚见, 记录在此
  20. ns-3中的数据跟踪与采集——Tracing系统的配置

热门文章

  1. mSystem:西农韦革宏组细菌-真菌互作影响微生物多样性-土壤养分循环关系
  2. Cell子刊:16s分析之FishTaco分析
  3. Nature综述:进化病毒毒力的系统发育基因组学
  4. 让尸体说话-法医密档
  5. R语言ggplot2可视化:使用geom_smooth函数基于lm方法为每个分组的部分数据(subset data)拟合趋势关系曲线、对指定范围的数据拟合曲线
  6. R语言ggplot2可视化强制指定X轴的日期范围实战:组合条形图和lm模型构建的回归模型的结果并强制指定X轴的日期范围
  7. matplotlib可视化去除轴标签、轴刻度线和轴刻度数值实战:Axis Text Ticks or Tick Labels
  8. R语言ggplot2可视化在ggplot2生成的可视化结果下方显示文本:显示一些关于数据的信息
  9. 使用R构建Xgboost模型并绘制ROC曲线
  10. 特征工程之时间特征、自然语言特征、图像图像特征、数据分布不平衡