我有一项服务,我需要通过每个用户请求询问40个外部服务(API)以从中获取信息。例如,一个用户正在搜索某些信息,我的服务要求40个外部合作伙伴获取信息,将其聚合在一个数据库(mysql)中并将结果显示给用户。
此时我有一个多包解决方案,我一次有10个合作伙伴请求,如果有人请求完成请求,那么软件会将剩下的30个另一个伙伴添加到multicurl队列,直到所有40请求完成,结果在DB中。
这个解决方案的问题在于,它无法在许多服务器上扩展,我希望有一些解决方案,我可以同时触发40个请求,例如在2-3个服务器上划分并等待这么长时间,如最慢的伙伴提供结果;-)意味着,如果最慢的伙伴花了10秒钟,我将在10秒内得到所有40个伙伴的结果。在多元化的时候,遇到麻烦,一次有超过10-12个请求。
您能提供什么样的解决方案,我能获得尽可能低的资源,并且可以在一台服务器上运行许多流程并具有可扩展性。我的软件是用PHP编写的,这意味着我需要使用框架或API很好地连接到解决方案。
我希望你理解我的问题和需要。如果不清楚,请询问。
答案 0 :(得分:1)
一种可能的解决方案是使用message queue,beanstalkd,Apache ActiveMQ等memcacheQ系统。
高级示例如下:
在这个模型中,由于现在执行40个请求的一个任务是分布式的,并且不再是一个“过程”的一部分,因此下一部分的难题将是如何将一组工作标记为已完成。这部分可能不那么困难,或者它可能引入新的挑战(取决于数据和您的应用程序)。也许你可以使用另一个缓存/数据库行来设置一个特定请求完成的作业数量的计数器,并且当每个队列工作者完成一个请求时,它可以将计数器减少1.一旦计数器为0,你就可以知道请求已经完成。但是当你这样做时,你需要确保计数器达到0并且不会因某种原因而卡住。
至少这是一种方式,希望能帮助你一点点或者为更多想法打开大门。