RabbitMQ PHP消费者数据库连接

时间:2015-10-26 17:52:57

标签: php database rabbitmq database-connection daemon

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

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

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

我也尝试过在PHP守护程序中查找处理数据库连接的最佳实践,但没有找到任何内容。

我想过的一些事情。

  1. 创建新连接并按消息关闭

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

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

    • 缺点:活动部件太多。需要解析消息ACKS的响应,因此消费者需要等待工作者结束。意味着创建和关闭每条消息的连接,也可以选择1,因为它的部分较少。
  4. 我也想到了持久的联系,但在阅读了更多关于它们之后,似乎它们并不是我认为的那样。此外,很多帖子都说这无论如何都是个坏主意。

    我理解PHP可能不是最好的工作,但我正在快速进行原型设计,PHP是我最适合这项任务的语言。

    如果我能就如何处理这个问题得到一些建议,我将非常感激。

    感谢。

1 个答案:

答案 0 :(得分:1)

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

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

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

该脚本在CLI上像普通的PHP脚本一样运行,因此您可以保持对资源处理的理解。这里没有守护进程。