RabbitMQ 入门指南(二)

本文介绍了RabbitMQ的Work Queue模式,用于处理耗时任务,避免资源浪费。通过实例展示了如何创建worker进程,使用消息回执确保消息不丢失,以及如何实现消息的持久化和公平分配。同时,文章提供了相关的代码示例,帮助理解RabbitMQ在Work Queue场景中的应用。
摘要由CSDN通过智能技术生成

Work Queue

Work Queue,又称为 Task Queue,用于将耗时的 task(任务)分发给多个 worker。

对于资源密集型(消耗资源)的任务,我们往往需要等待它处理完毕,才能处理下一个任务。

这样是不合理的,而 Work Queue 可以解决这个问题。

Work Queue 可以计划安排稍后再处理消息任务,它将任务封装压缩为一条消息,存到队列中。后台运行的 worker 进程将会弹出 task,并最终执行对应的 job。

多个 worker 之间共享所有的 task,注意是平均分摊。同一个 task 只会被一个 worker 消费。

在 Web 应用中,Work Queue 非常有用,因为短暂的 HTTP 请求无法处理复杂的、耗时的任务。

image

准备工作

这里,我们用字符串消息来代表复杂的 task,即假定它是一条耗时的任务。

我们简单修改上一节中的 send.php 文件中的代码,以便我们可以通过命令行发送任意的消息数据,并将其命名为 new_task.php。

new_task.php 内容如下:

<?php

// php 的依赖包自动加载,引入相关的类
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

// 连接到指定的 RabbitMQ 服务器(Broker),并创建 channel
$connection = new AMQPStreamConnection('127.0.0.1', 5672, 'guest', 'guest');
$channel = $connection->channel();

// 声明队列(queue)
// queue_declare() 方法是幂等的,即只有当指定的 queue 不存在时才会创建
$channel->queue_declare('task_queue', false, false, false, false);

// 创建消息
$data = implode(' ', array_slice($argv, 1));
if (empty($data)) {
    $data = "Hello World!";
}
$msg = new AMQPMessage(
    $data,
    array('delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT)
);

// 将消息发送到指定的队列
$channel->basic_publish($msg, '', 'task_queue');

// 消息发送成功后,输出提示信息
echo ' [x] Sent ', $data, "\n";

// 最后,关闭 channel 和 connection
$channel->close();
$connection->close();

上一节中的 receive.php 文件也需简单修改,我们用消息体中的每一个 . 号来假装 1 秒钟(3 个点表示需要 3 秒),用 sleep() 方法将其伪造为一个耗时的任务,并将其命名为 worker.php。

worker.php 内容如下:

<?php

// php 的依赖包自动加载,引入相关的类
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;

// 连接到指定的 RabbitMQ 服务器(Broker),并创建 channel
$connection = new AMQPStreamConnection('127.0.0.1', 5672, 'guest', 'guest');
$channel = $connection->channel();

// 声明要监听的队列(queue
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值