消息队列的有效体系结构& PHP中的工作者系统?

时间:2015-08-25 13:10:31

标签: php message-queue amazon-sqs supervisord gearman

我试图围绕我希望在PHP应用中实现的消息队列模型和作业:

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

  • 我考虑使用Gearman来保存MQ / Jobs,但我想使用像SQS或Rackspace Cloud Queues这样的Cloud Queue服务,所以我不必管理这些消息。

  • 这是我认为应该做的事情的图表:

enter image description here

问题:

  • 我的工作者会用PHP编写,他们都必须轮询云端队列服务吗?特别是当你有很多工人时,这可能会变得昂贵。

  • 我想可能只有一名工作人员只是为了轮询队列,如果有消息,通知其他工作人员他们有工作,我只需要让这1名工人在线使用supervisord ?这种轮询方法比使用可以通知的MQ更好吗?我应该如何每秒轮询一次MQ,或者每秒轮询一次?如果我看到它减速,那么就增加投票工人?

  • 我还考虑为所有消息设置一个队列,然后是工作人员监控,根据需要处理的位置将消息分发到其他云端,因为可能需要处理1条消息2差异工人。

  • 我是否仍然需要gearman来管理我的员工?或者我可以使用supervisord来上下调整员工吗?

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

  • 基本上我怎样才能尽可能高效有效地检查MQ?

对我的架构的建议或更正?

2 个答案:

答案 0 :(得分:1)

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

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

回答你的问题:

  

我的工作人员,用PHP编写,他们都必须轮询云队列服务?特别是当你有很多工人时,这可能会变得昂贵。

是的,没有免费的午餐。当然,您可以根据应用程序使用情况(当更多邮件到达时增加轮询率)按日/周时间(如果您的用户在特定时间处于活动状态)调整和优化您的工作人员轮询率,等等。请记住,工程成本可能很快会高于未经优化的民意调查。

相反,您可以考虑推送队列(见下文)。

  

我想也许有一名工人只是为了轮询队列,如果有消息,通知其他工作人员他们有工作,我只需要让这一名工人在线使用supervisord?这种轮询方法比使用可以通知的MQ更好吗?我应该如何每秒轮询一次MQ,或者每秒轮询一次?然后如果我看到它放慢速度,就增加投票工作人员?

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

  

我还考虑为所有消息设置一个队列,然后是工作人员监控,根据需要处理的位置将消息分发到其他云MQ,因为1个消息可能需要由2个差异工作者处理

如前所述,应用程序应根据需要将您的消息排入多个队列。这使事情变得简单和适当。

  

我是否仍然需要齿轮工来管理我的工人?或者我可以使用supervisord来上下旋转工人吗?

有许多消息队列以及更多使用它们的方法。通常,如果您使用民意调查队列,您需要自己让您的员工保持活力。但是,如果您使用推送队列,则队列服务将调用您指定的端点。因此,您只需要确保您的工作人员可用。

  

基本上我怎样才能尽可能高效有效地检查MQ?

这取决于您的业务要求和您的员工所做的工作。什么时间跨度是关键的?秒,分钟,小时,天?如果您使用工作人员发送电子邮件,则不应花费数小时,理想情况下需要几秒钟。每3秒或每15秒轮询之间是否存在差异(对于用户而言)?

解决您的问题(推送队列):

  

我的目标是卸载需要发送到多个第三方API的消息/数据,因此访问它们不会减慢客户端的速度。因此,将数据发送到消息队列是理想的选择。我考虑使用Gearman来保存MQ / Jobs,但我想使用像SQS或Rackspace Cloud Queues这样的Cloud Queue服务,所以我不必管理这些消息。

确实,您描述的场景非常适合消息队列。 正如您所提到的,您不想管理消息队列本身,也许您不想管理工作者?这是弹出推送队列的地方。

推送队列基本上调用你的工作人员。例如,Amazon ElasticBeanstalk工作区环境在后台执行繁重的工作(轮询),只需使用包含队列消息(refer to the docs for details)的HTTP请求调用您的应用程序。我亲自使用了AWS推送队列,并对它们的容易程度感到满意。请注意,还有其他推式队列提供程序,如Iron.io

正如您所提到的,您正在使用PHP,Symfony有QPush Bundle,它处理传入的消息请求。您可以查看代码以推出自己的解决方案。

答案 1 :(得分:0)

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