【问题标题】:Is it possible to run queues working synchronously with Laravel是否可以运行与 Laravel 同步工作的队列
【发布时间】:2017-08-14 19:15:46
【问题描述】:

我正在尝试建立一个与 Laravel 中的多个工作人员同步通信的 API 系统。我使用 Laravel 5.4,如果可能的话,我希望尽可能使用它的功能,而不需要太多插件。

我想到的是两台服务器。第一个带有 Laravel 实例的实例——我们称之为 APP——接收和回答用户的请求。第二个运行不同的工作人员,每个工作人员都是一个 Laravel 实例。这就是我对工作流程的看法:

  • APP收到用户请求
  • APP 将请求放入队列
  • 工作人员在队列中查找作业并最终找到。
  • 工人解决工作
  • 工人对 APP 或 APP 的响应发现工作以某种方式解决了
  • APP 向用户发送响应

我的第一个想法是使用队列和 beanstalkd。问题是这一切似乎都是异步工作的。 APP有没有办法等待其中一名工人的结果?

经过更多研究后,我偶然发现了 Guzzle。这是一条路吗?

编辑:有关该项目的一些额外信息。 我说的是一个 Restful API。例如。用户以“https://our.domain/article/1”的形式发送请求,并在标头中发送他们的 API 令牌。用户收到的是 JSON 格式的字符串,例如 {"id":1,"name":"article_name",etc.}

使用两侧的原因是双重的。一方面是使用不同的工人。另一方面,我们希望 API 的所有逻辑尽可能安全。当进行黑客攻击时,只有APP端会受到攻击。

也许我让排队和所有这些事情变得很困难?如果您有更好的方法来达到同样的目的,那当然也会有所帮助。

【问题讨论】:

  • 我想说的是,在这个设置中,最好将请求放入数据库中的“池”中,并带有某种status 指示器(待定/进行中/完成)。然后,您的工作人员可以对数据库进行一些连续轮询,以执行 actions 存在的任何内容。 APP 还会轮询 DB,等待操作完成,然后以 result 响应。
  • 你想如何提出请求和服务请求??使用 REST 端点还是什么??:\
  • 应用程序通常不会等待队列工作者的结果——它们会触发队列中的作业并继续前进。队列作业很慢吗?为什么不运行该作业,然后在作业运行后,通过 webhook 或打开的 web 套接字引发一个事件以通知用户。或者,只需将 laravel 队列驱动程序设置为“同步”,然后它会立即完成工作并在没有作业排队的情况下给您响应。
  • 我在原始帖子中添加了更多信息。也许这可以帮助您回答问题?

标签: php laravel laravel-5 beanstalkd


【解决方案1】:

我知道您的问题是如何同步运行它,我认为您面临的问题是您无法在工作人员完成后更新第一台服务器。您可以通过广播来实现这一点。

我在我们的应用程序中对上传做了类似的事情。我们使用 Redis 队列,但 beanstalk 会做同样的工作。最重要的是,我们使用推送器,它使用用户可以订阅的套接字,它看起来很棒。

  • 用户加载 Web 应用,连接到推送服务器
  • 用户上传文件(此时您可以显示一些内容来告诉用户文件正在处理中)
  • 工人看到有文件
  • 工作进程文件
  • 完成或失败时的工作触发器和事件
  • 这个事件被广播到推送服务器
  • 由于用户正在监听推送服务器,因此通过 javascript 接收事件
  • 您现在可以使用 javascript 显示弹出窗口或更新表格(即使用户已导航离开也可以使用)

我们为此使用了 pusher,但您可以使用 redis、beantalk 和许多其他解决方案来执行此操作。在 Laravel 文档中了解 Event Broadcasting

【讨论】:

  • 我之前一直在研究广播,但据我了解,它是在前端和后端之间使用的东西?我添加了有关该项目的更多信息。有了这些知识,您的方法仍然有效吗?此外,我对 Redis、Pusher、Beanstalkd 之类的东西还很陌生,所以在什么条件下使用什么都非常模糊。从link 和此线程中第二个答案中的链接看来,当需要多个工作人员时,Beanstalkd 是要走的路?
  • @RubenColpaert 这一切都取决于需要处理的工作,如果它足够快,你可以让用户等待一个 HTTP 请求然后去做,不需要使用工人。否则,您可能需要考虑使用套接字 api,用户可以在其中连接并发送稍后收到的消息。您也可以将 api 设置为双面,也许 api 服务器可以在工作人员完成并触发事件时向前端服务器(如 webhook)发送一个 post 请求,与上面的概念相同,但添加了一个额外的步骤。
  • 我仍然遇到问题。我创建了一个新主题来更详细地解释这个问题。也许这可以更好地了解问题所在:stackoverflow.com/questions/43845341/…
猜你喜欢
  • 2018-10-20
  • 2019-07-17
  • 2016-09-09
  • 2018-03-15
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
  • 2019-11-28
  • 1970-01-01
相关资源
最近更新 更多