0

我正在考虑制作一个工作脚本来处理我的服务器上的异步任务,使用诸如 ReactPHP、Amp 或 Swoole 之类的框架将作为服务永久运行(我还没有在这些框架之间做出选择,所以解决方案涉及任何这些都是有帮助的)。

我的 Web 端点仍将照常由 Apache + PHP-FPM 管理,我希望它们能够将消息发送到永久运行的脚本,以使其知道异步作业已准备好尽快处理。

来自 Web 端点的伪代码:

$pdo->exec('INSERT INTO Jobs VALUES (...)');
$jobId = $pdo->lastInsertId();

notify_new_job_to_worker($jobId); // how?

您通常如何处理从 PHP-FPM 到这些框架中永久运行的脚本的通信?您是否设置了 TCP / Unix Socket 服务器并实现了自己的消息传递协议,或者是否有现成的解决方案来解决这个问题?


注意:如果您想知道,我不打算使用第三方消息队列软件,因为我希望将异步作业存储为数据库事务的一部分(整个事务成功,包括提交待处理作业,或者整个事务被丢弃)。这是我保证不会丢失任何工作。如果在最坏的情况下,无法将消息发送到正在运行的服务,则可能稍后仍会从数据库中检索丢失的作业。

4

2 回答 2

0

如果您的工作人员作为服务“永久运行”,它应该提供一些 API 来进行交互。我在我的项目中将 AmPHP 用于异步服务,并且我的服务将 HTTP/Websockets 服务器(使用 Amp 库)实现为 API 传输。

于 2019-11-07T15:34:02.437 回答
0

嘿 ReactPHP 核心团队成员。这完全取决于你的 ReactPHP/Amp/Swoole 进程做什么。看看你的例子,我的建议是使用像 RabbitMQ 这样的消息代理/队列。这样,该过程可以在准备好时对其进行拍照,并在完成时确认它。如果您的进程在此期间发生任何事情并且死亡,只要它没有确认消息,它就会重试。你也可以做一个小的 HTTP API,但这并不能保证在发生致命故障时重新处理消息。最终这一切都取决于您的设计,所有 3 个项目都是构建您自己的架构和系统的工具集,这完全取决于您。

于 2019-11-07T15:39:06.653 回答