【发布时间】: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 字符串,公平)。