我正在处理一个必须咨询多个API以获取信息的应用程序,并在处理完数据后,将答案输出到客户端。客户端使用浏览器连接到Web服务器以转发请求,之后,Web服务器将查找多个API所需的信息,并在加入来自这些API的响应后,将向客户端提供答案。
Web服务器是使用Flask构建的,并且还实现了为每个API提取所需信息的模块(Python)。由于每个API的咨询过程需要时间,我想给Web服务器一个超时的响应,因此,在发送请求后,只会使用低于时间缓冲区的那些。
我建议的解决方案: 使用Redis队列和RQ工作程序将每个API的请求排入队列并将响应存储在队列中,然后等待超时并收集能够在允许的时间内响应的响应。然后,处理信息并将响应提供给用户。
烧瓶网络服务器的设置如下:
@app.route('/result',methods=["POST"])
def show_result():
inputText = request.form["question"]
tweetModule = Twitter()
tweeterResponse = tweetModule.ask(params=inputText)
redditObject = RedditModule()
redditResponse = redditObject.ask(params=inputText)
edmunds = Edmunds()
edmundsJson = edmunds.ask(params=inputText)
# More APIs could be consulted here
# Send each request async and the synchronize the responses from the queue
template = env.get_template('templates/result.html')
return render_template(template,resp=resp)
工人:
conn = redis.from_url(redis_url)
if __name__ == '__main__':
with Connection(conn):
worker = Worker(map(Queue, listen))
worker.work()
并假设每个模块都处理自己的排队过程。
我可以看到未来的一些问题:
谢谢!