我目前在服务器上设置了几个站点,并且他们都使用beanstalkd作为队列。其中一些网站是临时站点。虽然我知道将登台站点放在另一台服务器上是理想的,但在这种情况下为它启动另一台服务器并不具有经济意义。
我最近遇到了一个非常令人困惑的问题,我正在部署一个临时站点,其中包括重新安装数据库。我在一些模型保存上有一个观察者设置,它将触发一个排队的作业,这通常最终会发送一封电子邮件。登台站点实际上没有任何队列工作程序设置来运行它们,但生产站点(在同一服务器上)确实有队列工作程序运行。
似乎正在发生的事情是登台站点正在生成队列作业,而生产站点正在运行这些队列作业!这会导致我的随机用户被电子邮件发送垃圾邮件,因为它会从暂存中序列化模型,当它反序列化运行作业时,它实际上与实际的生产用户匹配。
在运行队列的服务器上有多个站点似乎很常见,所以我很好奇是否有办法避免这个问题。 Elasticsearch具有群集的概念,因此您可以运行多个搜索群集'在一台服务器上。我很好奇beanstalkd或redis或任何其他队列提供商是否具备此功能,因此我们不会在完全独立的网站之间产生串扰。
谢谢!
答案 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 &
使用&
进入后台。