我正在编写一个基于Pylons的下载网关。网关的客户端将按ID:
处理文件/file_gw/download/1
在内部,文件本身通过HTTP从内部文件服务器访问:
http://internal-srv/path/to/file_1.content
文件可能非常大,所以我想要传输内容。我将有关该文件的元数据存储在StoredFile模型对象中:
class StoredFile(Base):
id = Column(Integer, primary_key=True)
name = Column(String)
size = Column(Integer)
content_type = Column(String)
url = Column(String)
考虑到这一点,编写我的file_gw控制器的最佳方式是什么(即:最具体系结构的声音,高性能等)?
答案 0 :(得分:2)
您要避免的一件事是在将第一个字节返回给客户端之前将整个文件加载到内存中。在wsgi中,您可以返回响应主体的迭代器。 webob文档有一个example,你应该可以在你的控制器中工作。毕竟,挂架使用了webob。
对此的总体影响是客户端立即得到文件正在下载的反馈,但是返回第一个块需要很长时间。
您可能还想查看MongoDB的GridFS实现,这是一种非常好的方法来获得分布式文件系统,该文件系统针对一次读取多种类型文件操作进行了优化。
如果您必须自己动手,这两件事的组合将是一个良好的开端。
答案 1 :(得分:1)
我会考虑使用nginx和http://wiki.nginx.org/XSendfile或等效的。
答案 2 :(得分:0)
最具架构性的方法是让控制器重定向到Amazon S3以下载文件并将文件存储在Amazon S3上。