消息队列的有效体系结构&;PHP中的Worker系统?

消息队列的有效体系结构&;PHP中的Worker系统?,php,message-queue,amazon-sqs,supervisord,gearman,Php,Message Queue,Amazon Sqs,Supervisord,Gearman,我正试图了解我想在PHP应用程序中实现的消息队列模型和作业: 我的目标是卸载需要发送到多个第三方API的消息/数据,以便访问它们不会降低客户端的速度。因此,将数据发送到消息队列是理想的选择 我考虑只使用Gearman来保存MQ/作业,但我想使用像SQS或Rackspace云队列这样的云队列服务,这样我就不必管理消息了 以下是我认为我应该做的事情的示意图: 问题: 我的工作人员,将用PHP编写他们都必须轮询云队列服务吗?这可能会很昂贵,尤其是当你有很多工人的时候 我在想,可能有一个工人只是

我正试图了解我想在PHP应用程序中实现的消息队列模型和作业:

  • 我的目标是卸载需要发送到多个第三方API的消息/数据,以便访问它们不会降低客户端的速度。因此,将数据发送到消息队列是理想的选择

  • 我考虑只使用Gearman来保存MQ/作业,但我想使用像SQS或Rackspace云队列这样的云队列服务,这样我就不必管理消息了

  • 以下是我认为我应该做的事情的示意图:

问题:

  • 我的工作人员,将用PHP编写他们都必须轮询云队列服务吗?这可能会很昂贵,尤其是当你有很多工人的时候

  • 我在想,可能有一个工人只是为了轮询队列,如果有消息,通知其他工人他们有工作,我只需要使用
    supervisord
    让这一个工人在线?这种轮询方法是否比使用可以通知的MQ更好?我应该如何轮询MQ,每秒轮询一次或以尽可能快的速度轮询?如果我看到投票速度放缓,那就增加投票人数

  • 我还考虑为所有消息使用一个队列,然后由工作者监控将消息分发到其他云MQs,具体取决于它们需要处理的位置,因为1条消息可能需要由2个不同的工作者处理

  • 我是否仍然需要
    gearman
    来管理我的员工,或者我可以使用
    supervisord
    来上下旋转员工

  • 与轮询MQ相比,在发送消息时向主工作进程发送通知不是更有效、更快吗?我假设我需要使用
    gearman
    通知我的主要工作人员MQ有一条消息,以便它可以开始检查它。或者,如果每秒有300条消息,这将生成300个作业来检查MQ

  • 基本上,我如何才能尽可能有效地检查MQ


对我的体系结构的建议或更正?

我会推荐一种不同的方法,那就是使用套接字。ZMQ是已经编写的基于套接字的库的一个示例。使用套接字,您可以创建一个Q,并在消息传入时管理如何处理它们。机器将处于待机模式,在等待消息传入时使用最少的资源。

我的建议基本上归结为:保持简单。

考虑到这一点,我的第一个建议是删除
DispatcherWorker
。根据我目前的理解,工作者的唯一目的是监听
MAIN
队列并将消息转发到不同的任务队列。您的应用程序应该负责将正确的消息排队到正确的队列(或主题)

回答您的问题: 我的工作人员,将用PHP编写他们都必须轮询云队列服务吗?这可能会很昂贵,尤其是当你有很多工人的时候

是的,没有免费的午餐。当然,您可以根据应用程序使用情况(当更多消息到达时,提高投票率)按天/周时间(如果您的用户在特定时间处于活动状态)调整和优化worker投票率,等等。请记住,工程成本可能很快就会高于未优化的投票

相反,您可以考虑推送队列(见下文)。 我在想,可能有一个工人只是为了轮询队列,如果有消息,通知其他工人他们有工作,我只需要使用supervisord让这一个工人在线,也许?这种轮询方法是否比使用可以通知的MQ更好?我应该如何轮询MQ,每秒轮询一次或以尽可能快的速度轮询?如果我看到投票速度放缓,那就增加投票人数

这听起来太复杂了。通信不可靠,但是存在可靠的消息队列。如果您不想丢失数据,请坚持使用消息队列,不要发明自定义协议

我还考虑为所有消息使用一个队列,然后由工作者监控将消息分发到其他云MQs,具体取决于它们需要处理的位置,因为1条消息可能需要由2个不同的工作者处理

如前所述,应用程序应根据需要将消息排入多个队列。这使事情保持简单和到位

我是否仍然需要gearman来管理我的员工,或者我可以仅仅使用supervisord来上下旋转员工

有如此多的消息队列,甚至有更多的方法使用它们。一般来说,如果您使用的是投票队列,那么您需要让您的员工独自存活。如果您使用推送队列,队列服务将调用您指定的端点。因此,您只需要确保您的员工可用

基本上,我如何才能尽可能有效地检查MQ

这取决于您的业务需求和员工的工作。什么时间跨度是关键的?秒、分钟、小时、天?如果你使用员工发送电子邮件,不应该花费几个小时,最好是几秒钟。(对于用户)每3秒或每15秒轮询一次是否有区别

解决您的问题(使用推送队列): 我的目标是卸载需要发送到多个第三方API的消息/数据,以便访问它们不会降低客户端的速度。因此,将数据发送到消息队列是理想的选择。我考虑只使用Gearman来保存MQ/作业,但我想使用像SQS或Rackspace云队列这样的云队列服务,这样我就不必管理消息了

事实上,您描述的场景非常适合消息队列。 正如您提到的,您不想管理消息队列本身,也许您不想管理消息队列本身