将多个请求扩展到不同的服务

时间:2012-07-11 21:25:45

标签: php service multiprocessing scale curl-multi

我有一项服务,我需要通过每个用户请求询问40个外部服务(API)以从中获取信息。例如,一个用户正在搜索某些信息,我的服务要求40个外部合作伙伴获取信息,将其聚合在一个数据库(mysql)中并将结果显示给用户。

此时我有一个多包解决方案,我一次有10个合作伙伴请求,如果有人请求完成请求,那么软件会将剩下的30个另一个伙伴添加到multicurl队列,直到所有40请求完成,结果在DB中。

这个解决方案的问题在于,它无法在许多服务器上扩展,我希望有一些解决方案,我可以同时触发40个请求,例如在2-3个服务器上划分并等待这么长时间,如最慢的伙伴提供结果;-)意味着,如果最慢的伙伴花了10秒钟,我将在10秒内得到所有40个伙伴的结果。在多元化的时候,遇到麻烦,一次有超过10-12个请求。

您能提供什么样的解决方案,我能获得尽可能低的资源,并且可以在一台服务器上运行许多流程并具有可扩展性。我的软件是用PHP编写的,这意味着我需要使用框架或API很好地连接到解决方案。

我希望你理解我的问题和需要。如果不清楚,请询问。

1 个答案:

答案 0 :(得分:1)

一种可能的解决方案是使用message queuebeanstalkdApache ActiveMQmemcacheQ系统。

高级示例如下:

  • 用户向您的服务请求信息
  • 您的服务将请求添加到队列中(可能是您要查询的40个服务中的每个服务一个)
  • 一个或多个作业服务器不断轮询队列以进行工作
  • 作业服务器从队列中获取消息以执行某些操作,将数据添加到数据库并从队列中删除该项目。

在这个模型中,由于现在执行40个请求的一个任务是分布式的,并且不再是一个“过程”的一部分,因此下一部分的难题将是如何将一组工作标记为已完成。这部分可能不那么困难,或者它可能引入新的挑战(取决于数据和您的应用程序)。也许你可以使用另一个缓存/数据库行来设置一个特定请求完成的作业数量的计数器,并且当每个队列工作者完成一个请求时,它可以将计数器减少1.一旦计数器为0,你就可以知道请求已经完成。但是当你这样做时,你需要确保计数器达到0并且不会因某种原因而卡住。

至少这是一种方式,希望能帮助你一点点或者为更多想法打开大门。