我正在开发一个Django应用程序,允许用户上传文件。在将这些文件发送到Amazon S3之前,我需要对它们进行一些服务器端处理。阅读这个问题和这篇博客文章的回复后,我决定最好的处理方式是让我的视图处理程序调用Pyro远程对象上的方法异步执行处理,然后立即向客户端返回Http 200。我已经完成了这个原型,并且似乎工作得很好,但是,我还想存储处理状态,以便客户端可以轮询应用程序,查看文件是否已被处理并上传到S3。
我可以很容易地处理轮询,但我不确定存储过程状态的适当位置在哪里。它需要由Pyro进程可写,由我的轮询视图可读取。
- 我不确定是否应该为只需保留30至60秒的数据向数据库添加列。
- 我考虑使用Django的低级缓存API,并使用文件ID作为键,但我不认为这是缓存框架的设计目的,而且我也不确定采用这种方法会有什么未预料到的问题。
- 最后,我考虑在执行处理的Pyro对象中存储状态,但这似乎仍然需要添加一个布尔型“processing_complete”数据库列,以便视图知道是否从Pyro对象查询状态。
当然,将状态与数据库解耦也存在一些数据完整性方面的问题(如果服务器崩溃,所有这些数据都在内存中会发生什么?)。我很想听听更有经验的Web应用程序开发人员如何处理这种有状态的处理。