使用多个API处理异步请求 - Python Flask Redis

时间:2015-04-20 17:40:08

标签: python api asynchronous redis

我正在处理一个必须咨询多个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()

并假设每个模块都处理自己的排队过程。

我可以看到未来的一些问题:

  • 队列中存储的未达到超时的信息会发生什么变化?
  • 如何让Flask等待,然后从队列中提取响应?
  • 如果两个客户在相同的时间范围内提问,是否有可能混淆信息?
  • 是否有更好的方法来处理异步请求,然后同步响应?

谢谢!

0 个答案:

没有答案