RabbitMQ PHP 消费者数据库连接

RabbitMQ PHP Consumer Database Connection

我正在考虑在我的新应用程序中使用 RabbitMQ 进行一些异步处理。

我面临的挑战之一是如何最好地处理数据库连接。我将使用 Eloquent 并且实际上是 PDO。

我在网上找到的一个资源 https://www.teqneers.de/2013/10/simple-spawn-rabbitmq-consumers-with-php/ 建议使用 proc_open 生成一个新进程,但我对这种方法不太满意,想知道是否有更好的方法。

我还尝试寻找在 PHP 守护进程中处理数据库连接的最佳实践,但没有找到任何东西。

我想到的一些事情。

  1. 每条消息创建一个新连接并关闭它

    • 缺点:应用程序是关于将消息传递给批量消息,消费者数量众多且 运行 频繁。可能资源很重。
    • 优点:但是,传统的 php 脚本以类似的方式工作,所以这可能不是一个坏主意
  2. 在消费者的整个生命周期中保持连接并经常杀死他们

    • 缺点:显然很浪费。需要不断检查连接是否仍然有效。
  3. 运行 命令行工作者

    • 缺点:活动部件太多。需要解析消息 ACKS 的响应,因此消费者需要等待工作人员结束。意味着每条消息创建和关闭连接,最好坚持使用选项 1,因为它的部分较少。

我也想到了持久连接,但是看了更多关于它们的内容后,似乎它们不是我想的那样。另外,很多帖子都说这是个坏主意。

我知道 PHP 可能不是最好的工作,但我正在快速制作原型,PHP 是我最适合这项任务的语言。

如果我能得到一些关于如何处理这个问题的建议,我将不胜感激。

谢谢。

所以我决定采用合并 proc_open(没有实际使用 proc_open)和选项 1 和 2 的解决方案。

使用 https://github.com/ricbra/rabbitmq-cli-consumer,此 cli 工具处理消息的实际消耗,并通过命令行(作为代理)将其传递给 PHP 脚本。

PHP脚本是运行每条消息一次,returns根据退出代码(0:成功,1:失败),处理消息ACK。

脚本 运行 类似于 CLI 上的普通 PHP 脚本,因此您可以理智地思考资源处理。这里没有守护进程。