同一个Beanstalkd队列上的多个站点

时间:2017-04-17 19:56:48

标签: php laravel beanstalkd

我目前在服务器上设置了几个站点,并且他们都使用beanstalkd作为队列。其中一些网站是临时站点。虽然我知道将登台站点放在另一台服务器上是理想的,但在这种情况下为它启动另一台服务器并不具有经济意义。

我最近遇到了一个非常令人困惑的问题,我正在部署一个临时站点,其中包括重新安装数据库。我在一些模型保存上有一个观察者设置,它将触发一个排队的作业,这通常最终会发送一封电子邮件。登台站点实际上没有任何队列工作程序设置来运行它们,但生产站点(在同一服务器上)确实有队列工作程序运行。

似乎正在发生的事情是登台站点正在生成队列作业,而生产站点正在运行这些队列作业!这会导致我的随机用户被电子邮件发送垃圾邮件,因为它会从暂存中序列化模型,当它反序列化运行作业时,它实际上与实际的生产用户匹配。

在运行队列的服务器上有多个站点似乎很常见,所以我很好奇是否有办法避免这个问题。 Elasticsearch具有群集的概念,因此您可以运行多个搜索群集'在一台服务器上。我很好奇beanstalkd或redis或任何其他队列提供商是否具备此功能,因此我们不会在完全独立的网站之间产生串扰。

谢谢!

2 个答案:

答案 0 :(得分:2)

Beanstalkd有管的概念:

  

管是工作队列。

     

管的常见用例是具有完全不同的组   通过单个beanstalk实例运行的生产者和使用者   这样一个特定的消费者将不知道如何处理所产生的工作   一些生产者。 Producer1可以将作业排入Tube1和   消费者1可以完全独立地从那里获得工作   例如,Producer2和Consumer2正在使用Tube2做什么。

例如,如果你正在使用pheanstalk,那么制作人将会调用useTube()

$pheanstalk = new Pheanstalk();
$pheanstalk->useTube('foo')->put(...);

工人将致电watch()

$pheanstalk = new Pheanstalk();
$pheanstalk->watch('foo')->ignore('default')->reserve();

答案 1 :(得分:0)

这是一个老问题,但是您是否尝试过运行多个beantalkd守护程序?只需绑定到另一个端口。

示例: beanstalkd -p 11301 &

使用&进入后台。