【问题标题】:Multiple Sites on same Beanstalkd Queue同一 Beanstalkd 队列上的多个站点
【发布时间】:2017-09-13 11:51:58
【问题描述】:

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

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

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

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

谢谢!

【问题讨论】:

标签: php laravel beanstalkd


【解决方案1】:

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

示例: beanstalkd -p 11301 &

使用& 进入后台。

【讨论】:

    【解决方案2】:

    Beanstalkd 有管​​的概念:

    管是作业队列。

    管的一个常见用例是拥有完全不同的集合 通过单个 beantalk 实例运行的生产者和消费者 这样给定的消费者将不知道如何处理产生的工作 由一些制作人。 Producer1 可以将作业排入 Tube1 和 Consumer1 可以完全独立地从那里接手工作 例如,Producer2 和 Consumer2 对 Tube2 做了什么。

    例如,如果您使用的是 pheanstalk,生产者将调用useTube()

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

    工人会打电话给watch()

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

    【讨论】:

    • 据我了解,管更多地是一种在项目内分离职责的方式。例如,你可以有一个电子邮件管、SMS 管、数据库通知管等。我需要的是项目之间的分离,实际上项目不应该相互了解任何事情,所以他们应该都可以拥有@987654325 @队列。
    • Beanstalk 不知道“项目”是什么。你可以随心所欲地使用它们。
    • “所以他们应该都可以有一个电子邮件队列” 然后只需使用项目名称(或服务器名称)作为管的一部分。例如,foo-emailbar-email...
    • 是的,这将是我处理这个问题的老套方法,因为现在我需要foo-production-emailfoo-staging-email。我希望他们有一个类似于clusters 的概念,或者本质上类似于项目的命名空间。
    • 这不是 hacky,beantalk 就是这样工作的。只要您不将作业推送到默认队列中,每个项目都会被隔离。根据您的系统设计,您可能决定要为开发/登台/生产运行单独的 beanstalk 实例,但在这些环境中为单独的项目运行不同的实例只是大材小用。
    猜你喜欢
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    • 2015-02-11
    • 1970-01-01
    • 2012-05-18
    • 2014-12-31
    • 1970-01-01
    • 2021-09-17
    相关资源
    最近更新 更多