Php Laravel队列工作者、RabbitMQ和远程生成的运行作业

Php Laravel队列工作者、RabbitMQ和远程生成的运行作业,php,laravel,rabbitmq,Php,Laravel,Rabbitmq,在这之前,我要承认有轻微的睡眠剥夺 设置如下所示: API端点(服务器A)接收传入呼叫,并将其添加到RabbitMQ服务器(服务器B)上的特定队列中 RabbitMQ(服务器B)只是一个RabbitMQ队列服务器。不多不少 Laravel安装(服务器C)是我们实际的Laravel安装,用于在特定队列上查找作业并处理作业 我们在Laravel安装中有一个RabbitMQ包,它允许通过RabbitMQ连接使用常规的Laravel队列机制 我遇到的问题是,我们可以为队列生成一个worker,但是由于我

在这之前,我要承认有轻微的睡眠剥夺

设置如下所示:

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

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

Laravel安装(服务器C)是我们实际的Laravel安装,用于在特定队列上查找作业并处理作业

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

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

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


非常感谢您的意见

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

另一种方法是在Laravel应用程序上使用JSON消息的侦听器,并对这些消息执行操作

队列侦听器可以使用包(用于Laravel的通用AMQP桥)或(用于RabbitMQ的更专门的桥)来创建

队列使用者然后读取JSON有效负载,将paymload保存为适当的数据,然后根据包处理的结果决定在Laravel应用程序中分派哪些作业


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

您是否无法查看JSON数组并了解作业是什么,或者可以在Laravel中准备它来执行此操作?@Farrukhsubani问题是Laravel中的队列工作器基于指定的$job(脚本)运行作业,这与我需要它的工作方式正好相反,因为创建作业的服务器无法提供$job。进一步考虑一下,也许最好的选择是让服务器A也运行一个更简单的Laravel安装,并带有同一作业的副本。然后,它将能够分派该作业,并且由于运行该作业的服务器上存在相同的副本,因此它应该可以正常工作。我不喜欢这个想法,因为它使我的设计过于复杂——所以如果有人有更好的想法,我洗耳恭听!laravel的jobs实现假定生产者和消费者使用相同的代码库,因为它包含序列化类以提供更高级别的抽象。如果您愿意在每次发布时清除队列,您可以这样做。或者,您可以在较低级别上实现消费者,侦听原始消息并根据消息的内容对其进行路由。更大的工作量,更大的灵活性。如上所述,为了让laravel正确处理作业/负载,您的发布代码必须生成与laravel publisher相同的消息。最懒惰的方法是获取一条由laravel生成的消息,并按照相同的模式生成自己的消息。您通常需要更改类名和负载(json字符串,afair)。