1

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

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

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

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

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

4

1 回答 1

1

一种可能的解决方案是使用消息队列系统,如beanstalkdApache ActiveMQmemcacheQ等。

一个高级示例是:

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

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

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

于 2012-07-11T22:38:22.593 回答