工作队列是说由一个生产者发送消息给队列,而可能有一个或多个消费者等待从队列接收并处理消息

循环调度

当有多个消费者时,队列循环发送消息给每一个消费者,默认情况下,rabbitmq会按顺序发送一条消息给下一个消费者,平均每个消费者会收到相同数量的消息

消息确认

消息确认是防止消息丢失,一个确认信息会从消费者返回,告诉rabbitmq该消费已经收到处理,这时rabbitmq才会释放删除消息。默认情况下消息确认是被关闭的,设置basic_consume()的第四个参数为false(true means no ack),且从消费者发送一个确认即可。

消息持久化

要确保消息不丢失我们需要标识队列和消息都是可持久的,首先要确保rabbitmq不会丢失队列,我们需要声明队列为可持久的,这里设置queue_declare的第三个参数为true即可

$channel->queue_declare('task_queue', false, true, false, false);

其次我们需要通过delivery_mode = 2参数标记消息是持久化的,如

$msg = new AMQPMessage($data,

array('delivery_mode' => 2) # make message persistent

);

公平调度

循环调度容易造成奇偶消息费者闲忙不等的情况,为了公平调度我们可以使用basic_qos方法,同时设置参数prefetch=1,如

$channel->basic_qos(null, 1, null);

生产者new_task.php

require_once __DIR__ . '/../vendor/autoload.php';

use PhpAmqpLib\Connection\AMQPStreamConnection;

use PhpAmqpLib\Message\AMQPMessage;

$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');

$channel = $connection->channel();

//第3个参数为true,使消息队列持久化

$channel->queue_declare('task_queue', false, true, false, false);

$data = implode(' ', array_slice($argv, 1));

if(empty($data)) $data = "Hello World!";

$msg = new AMQPMessage($data,

array('delivery_mode' => 2) # 使消息持久化

);

$channel->basic_publish($msg, '', 'task_queue');

echo " [x] Sent ", $data, "\n";

$channel->close();

$connection->close();

消费者worker.php

require_once __DIR__ . '/../vendor/autoload.php';

use PhpAmqpLib\Connection\AMQPStreamConnection;

$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');

$channel = $connection->channel();

//第3个参数为true,使消息队列持久化

$channel->queue_declare('task_queue', false, true, false, false);

echo ' [*] Waiting for messages. To exit press CTRL+C', "\n";

$callback = function($msg) {

echo " [x] Received ", $msg->body, "\n";

sleep(substr_count($msg->body, '.'));

echo " [x] Done", "\n";

//发送回复确认

$msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);

};

//合理分发消息,即等消费者回复确认之后不忙的时候再发送消息

$channel->basic_qos(null,1,null);

//第4个参数为false表示等待消费者回复再删除消息

$channel->basic_consume('task_queue', '', false, false, false, false, $callback);

while(count($channel->callbacks)) {

$channel->wait();

}

$channel->close();

$connection->close();

rabbitmq队列php应用,RabbitMQ工作队列应用相关推荐

  1. RabbitMQ指南之二:工作队列(Work Queues)

    在上一章的指南中,我们写了一个命名队列:生产者往该命名队列发送消息.消费从从该命名队列中消费消息.在本章中,我们将创建一个工作队列,用于在多个工作者之间分配耗时的任务.工作队列(即任务队列)的主要思想 ...

  2. 【RabbitMQ】基础二:工作队列模式(Work queues)

    [RabbitMQ]基础二:工作队列模式(Work queues) 1. 模式说明 2. 示例代码 2.1 生产者 2.2 消费者 2.3 测试 3. 小结 1. 模式说明 Work Queues 与 ...

  3. c#服务器后端_C#使用RabbitMq队列(Sample,Work,Fanout,Direct等模式的简单使用)

    1:RabbitMQ是个啥?(专业术语参考自网络) RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件). RabbitMQ服务器是用Erlang语言编写的, ...

  4. RabbitMQ队列监控

    Idle:通过自动发现队列,获取各个队列中的ready,unackd等值 sudo !!! 1 #!/bin/sh 2 discovery(){ 3 Queue=(`rabbitmqctl list_ ...

  5. Day10-Python3基础-协程、异步IO、redis缓存、rabbitMQ队列

    内容目录: Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitMQ队列 Redis\Memcached缓存 Paramiko S ...

  6. python rabitmq_python RabbitMQ队列使用

    原博文 2019-01-17 21:17 − python RabbitMQ队列使用 关于python的queue介绍 关于python的队列,内置的有两种,一种是线程queue,另一种是进程queu ...

  7. 队列工厂之RabbitMQ

    本次和大家分享的是RabbitMQ队列的用法,前一篇文章队列工厂之(MSMQ)中在描述的时候已经搭建了简单工厂,因此本章内容是在其之上扩充的子项不再过多讲解工厂的代码了:RabbitMQ应该是现在互联 ...

  8. [RabbitMQ]队列持久化

    RabbitMQ持久化 概念 如何保障当 RabbitMQ 服务停掉以后消息生产者发送过来的消息不丢失.默认情况下 RabbitMQ 退出或由于某种原因崩溃时,它忽视队列和消息,除非告知它不要这样做. ...

  9. redis 队列_Redis与Rabbitmq消息队列的区别

    将redis发布订阅模式用做消息队列和rabbitmq的区别: 可靠性  redis :没有相应的机制保证消息的可靠消费,如果发布者发布一条消息,而没有对应的订阅者的话,这条消息将丢失,不会存在内存中 ...

最新文章

  1. 日常遇到的一些问题或知识的笔记(一)
  2. Ch2r_ood_understanding 本文档为论文限定领域口语对话系统中超出领域话语的对话行为识别的部分实验代码。代码基于Python,需要用到的外部库有: Keras(搭建神经网络) S
  3. 多线程不重复读取数据_别再犯错了,多线程访问同一个资源一定要上锁?
  4. 大疆云台如何使用华为mate20pro_华为Mate30+大疆灵眸Osmo3,让你的照片和短视频称霸朋友圈...
  5. 消息队列-Message Queue
  6. matlab 课程设计循环码性能分析,matlab课程设计--循环码的性能分析
  7. 用matlab抽样定理验证,用MATLAB验证时域抽样定理
  8. python 文件行数_python—文件和数据(文件行数 文件字符分布)
  9. 凸优化第二章凸集 2.4广义不等式
  10. Xamarin.Forms 解决ListView高度问题
  11. 线性代数:特征向量和特征值
  12. 图片无损放大器有什么软件推荐?这个不要错过
  13. 分治法 —— 循环比赛日程安排表
  14. 如何远程唤醒(WOL)主板为技嘉(gigabyte)的B85M-D3H的linux主机
  15. Pandas实用的25个技巧
  16. led护眼台灯对眼睛好?过来人说说led护眼灯是否真的能护眼
  17. 【HDU 2612 Find a Way(BFS)】(兼BFS入门笔记)
  18. 大小写金额转换(电子表格大小写金额转换)
  19. 那些我们不知道的事儿!——Final Cut Pro for Mac
  20. 计算机启动后没有桌面,我的电脑开机后桌面上的文件都没有了是什么情况?

热门文章

  1. JAVA个go哪个写web方便_Go语言实现的一个简单Web服务器
  2. cocos2d js调用java_【cocos2d-js官方文档】二十四、如何在android平台上使用js直接调用Java方法...
  3. Altium designer中提示some net were not able to be matched问题解决办法
  4. BLE 0x3e HCI_ERROR_CODE_CONN_FAILED_TO_ESTABLISH
  5. 计算机供用户使用的内存区域,计算机应用复习资料
  6. webbrowser控件 有数据 但页面空白_如何在Excel中实现可以切换不同数据系列的滚珠图?...
  7. mysql 主从 编码_Mysql 主从复制
  8. 数据增强_浅析数据增强
  9. 撰写第三周课程总结及实验报告(一)
  10. Python之删除字符串中不需要的字符