如何提供包装同步API的异步RESTful API

时间:2012-05-15 13:15:33

标签: python api http

我们正在Django中创建一个Web服务(RESTful API)。我们的API将包含我们自己的内部数据以及我们的Web服务层将访问的一些其他API。

我们使用的其中一个API有一些长时间运行的调用,它们不会在一分钟内返回HTTP响应。 API具有单独的API调用以获取当前操作的状态,但这意味着用户必须启动长时间运行的操作,然后对状态进行单独的进程轮询。我们不希望我们的API以这种方式工作,我们希望初始请求只返回一个响应,表明它正在进行中。

所以我们想要做的是当我们获得长时间运行的请求时,我们异步地启动我们自己的API请求,然后返回响应。然后,每次我们获得状态调查时,我们只是通过它并回复我们得到的响应。当我们得到操作完成的回调时,那么下次我们得到状态轮询时,我们只会响应操作完成并返回数据。这意味着我们需要传入状态请求的处理程序来检查正在进行的长时间运行请求列表以响应状态。

这似乎是一种合理的方式来解决这个问题吗?我们应该考虑哪些python库来使这种事情变得更容易?我们不确定是否要采用低级别的东西,如eventlet或扭曲,或者像芹菜一样重量较重的东西。芹菜似乎是这种事情的正常建议,但我不能100%确定它的位置。

谢谢, 斯潘塞

1 个答案:

答案 0 :(得分:0)

几个月前我遇到了同样的情况,可能你已经解决了问题,但对于面临同样情况的其他人,我会发布我当时所做的事情。

基本上我使用http://www.celeryproject.org/库,以异步方式调度一个长时间运行的操作,返回一个成功的HTTP响应celery job id,asynch操作会在sqlite数据库中注册状态和job id(足够了)对于我正在做的事情,客户端正在查询(使用休息)工作的状态。