Beanstalkd支持多个服务器和负载均衡

3
我在Laravel项目中使用beanstalkd来处理队列中的作业。Beanstalkd正在本地运行。我想做的是在队列变大时添加一个或多个远程服务器来处理一些作业。我知道使用Laravel可以将作业发送到特定的远程连接,但这样我不知道发送作业之前每个服务器的负载情况。

我想知道beanstalkd是否支持在服务器之间进行负载平衡以及在远程作业失败时的错误处理等问题。

谢谢

1个回答

4

Beanstalkd没有负载均衡功能。

您可以在负载均衡器上设置HAProxy,并注册安装了beanstalkd的多个服务器。然后,当您从Laravel代码发送作业时,您会发送到HAProxy,HAProxy会决定哪个子服务器放置作业,因为它知道负载和子系统是否存在故障。

在代码中只需要更改IP即可。 在您的基础设施中,您需要有一个已设置好一组Beanstalkd服务器的负载均衡器(HAProxy)。

通常我们有2台机器,它们配置如下:

- Machine 1: HAProxy, Apache, MySQL, Laravel, Beanstalkd
- Machine 2: MySQL, Laravel, Beanstalkd

谢谢你的回答。我已经成功设置了基础架构,并通过HAProxy实现了负载均衡。我想知道是否有办法从远程服务器获取作业状态的反馈,无论是成功完成还是出现错误。当我只在本地使用beanstalkd时,作业的一部分是将结果写入数据库。现在我想避免这种情况,因为远程服务器将无法访问数据库。 - nteath
你应该发起一个新的问题,但由于它是异步的,你不能保持连接并等待直到它被处理。你可以在处理作业的工作进程中添加代码以将作业的状态写入某个地方。可以使用Memcache、Redis或另一个管道,即作业消息中提供的响应管道。用例:当用户想要预览PDF布局时,在UI上生成一个管道名称+服务器,并开始监视它,同时通过haproxy将作业放入beanstalkd,其中一个工作进程接收作业,解析并将答案写入作为输入参数给定的服务器/管道。 - Pentium10
现在答案在由参数给出的管道上,我们已经知道有一个Watcher在其UI上,所以UI将接收答案并处理它。这样你就可以保持UI忙碌和连接状态,绕过异步方式,但是你有明确的监控。 - Pentium10
更容易的方法是在系统中保留一个标志,并稍后从那里读取它。 - Pentium10
1
但是你如何消费任务?你是通过hapxoy连接还是连接到每个beanstalkd服务器并获取任务? - user237329

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接