Laravel Queue Worker、RabbitMQ 和远程生成的运行作业

Posted

技术标签:

【中文标题】Laravel Queue Worker、RabbitMQ 和远程生成的运行作业【英文标题】:Laravel Queue Worker, RabbitMQ and running jobs generated remotely 【发布时间】:2017-12-06 21:39:50 【问题描述】:

我先承认有轻微的睡眠不足。

设置如下:

API 端点(服务器 A) 接收传入调用,并将其添加到 RabbitMQ 服务器(服务器 B)上的特定队列中。

RabbitMQ (Server B) 只是一个 RabbitMQ 队列服务器。不多也不少。

Laravel 安装(服务器 C) 是我们实际的 Laravel 安装,它旨在寻找特定队列上的作业并使用它们执行操作。

我们在 Laravel 安装中有一个 RabbitMQ 包,它允许通过 RabbitMQ 连接使用常规 Laravel 队列机制。

我遇到的问题是我们可以为队列生成一个工作人员 - 但由于我们没有生成传递 $job 类的作业(作业内容本身通常是一个 JSON 数组),所以Laravel 安装不知道如何处理这项工作。

所以我的问题主要围绕如何处理这样的场景。我认为在 Laravel 中使用队列功能不会做我需要它做的事情。您能看到我缺少的方法吗?我真的需要在非框架脚本上生成一个守护进程来处理这个问题吗?

非常感谢您的意见!

【问题讨论】:

你有没有办法查看 json 数组并了解工作是什么或可以做什么然后在 laravel 中准备它来做到这一点? @FarrukhSubhani 问题是 Laravel 中的队列工作者根据指定的 $job (脚本)运行作业,这与我需要它的功能相反,因为 $job 赢了'在创建作业的服务器上不可用。 进一步考虑这一点,也许最好的选择是让服务器 A 也运行一个更简单的 Laravel 安装,并使用相同作业的副本。然后它将能够分派该作业,并且由于运行它的服务器上存在相同的副本,因此它应该可以运行。虽然我不喜欢这个想法,因为它使我的设计过于复杂 - 所以如果有人有更好的想法,我会全力以赴! laravel 的作业实现假定生产者和消费者的代码库相同,因为它包含序列化的类以提供更高级别的抽象。如果您乐于在每次发布时清除队列,您可以这样做。或者,您可以在较低级别实现消费者侦听原始消息并根据消息内容路由它们。更多的工作,但更大的灵活性。 如上所述,为了让 laravel 正确处理作业/有效负载,您的发布代码必须生成与 laravel 发布者相同的消息。最懒惰的方法是获取一条由 laravel 生成的消息,然后按照相同的模式生成自己的消息。您通常需要更改类名和有效负载(json 字符串,公平)。 【参考方案1】:

另一种方法是在您的 Laravel 应用程序上使用一个侦听器,使用 JSON 消息并对其进行操作。

可以使用 https://github.com/bschmitt/laravel-amqp(Laravel 的通用 AMQP 桥)或 https://github.com/needle-project/laravel-rabbitmq(更专用于 RabbitMQ 的桥)等包创建队列侦听器。

然后队列消费者读取 JSON 负载,将负载保存为适当的数据,然后决定在 Laravel 应用程序中调度哪些作业,由 https://github.com/vyuldashev/laravel-queue-rabbitmq 包处理。

这两个应用程序仍然使用纯 JSON 进行通信,而不是包含序列化作业类的面向 Laravel 的 JSON。

【讨论】:

【参考方案2】:

解决方案确实是将作业代码复制到发布作业的代码上。代码不需要作业实际运行所需的所有依赖项,因为它只序列化来自推送它的作业。

【讨论】:

以上是关于Laravel Queue Worker、RabbitMQ 和远程生成的运行作业的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Queue Worker、RabbitMQ 和远程生成的运行作业

Laravel queue worker can't process jobs # 错误日志 local.ERROR: Class does not exist "exception&quo

Laravel - 在一台服务器上发送作业,在另一台服务器上处理

使用 Supervisor 配置 Laravel 运行队列处理器

使用 Supervisor 配置 Laravel 运行队列处理器

RabbitMQ:如何防止QueueDeclare自动生成新Queue