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


Scale multi request to different services

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

目前,我有一个multicrl解决方案,其中我一次有10个合作伙伴请求,如果有人完成了请求,那么软件将从剩余的30个合作伙伴中添加另一个合作伙伴到multicrl的队列中,直到所有40个请求都完成,结果在DB中。

这个解决方案的问题是,它不能在很多服务器上扩展,我想有一些解决方案,我可以一次触发40个请求,例如,在2-3台服务器上,只等待这么长时间,因为最慢的合作伙伴会提供结果;-)这意味着,如果最慢的伙伴嘟嘟作响10秒,我将在10秒内得到所有40个伙伴的结果。在multicrl上,当一次有超过10-12个请求时,我会遇到麻烦。

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

我希望你能理解我的问题和需要。如果有什么不清楚的地方,请询问。

一种可能的解决方案是使用消息队列系统,如beanstalkd、Apache ActiveMQ、memcacheQ等。

一个高级示例是:

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

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

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