Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。
Uploadcare是一种文件基础设施即服务解决方案。我们为处理文件提供预制构建,为管理复杂技术提供简单的控件。这些控件包括widget,Upload API,REST API和CDN API。这些API每天一共要处理350M的请求。
只需几行代码即可上传,存储,处理,缓存和交付文件。我们支持Dropbox,Facebook和许多其他外部来源上传。我们还允许用户将文件直接上传到他们的存储空间中。
是的,你可以自己处理文件,你可以搭建基本的系统并运行地很快。但是存储怎么样?正常运作吗? 是否有清晰友好的用户界面? 能否快速交付到偏远地区? 我们分析了大多数用例,发现投资开发自己的文件基础设施是没有意义的。
设置Uploadcare很快,解决了用户通常在处理大文件和批量文件时遇到的许多问题。此外,用户不再需要在每个浏览器中测试系统并维护基础设施。
ploadcare利用AWS构建了无限可扩展的基础设施。建立在AWS之上,每天可以处理350M的文件上传,操作和交付请求。在2011年开始时,AWS唯一的云替代方案是Google
App Engine,我们不想构建相当复杂的解决方案。我们也不想购买任何硬件或使用合作点。
我们的堆栈处理接收文件,与外部文件源通信,管理文件存储,管理用户和文件数据,处理文件,文件缓存和分发以及管理用户界面仪表板。
从一开始,我们基于微服务架构构建了Uploadcare。
这些是我们在堆栈的每一层面临的挑战。
Uploadcare的核心是运行在Python上。在佛罗伦萨的Europython 2011会议真正启发了我们,再加上事实是Python足以解决我们所有的挑战。另外之前我们还有在Python中工作的经验。
我们选择使用Django构建主要应用程序,因为它在Python生态系统中的具有举足轻重的地位并且功能十分完整。我们的生态系统内的所有通信都通过几个HTTP
API,Redis,Amazon S3和Amazon
DynamoDB进行。我们决定使用这种架构,以便我们的系统可以在存储和数据库吞吐量方面进行扩展。这样我们只需要在数据库集群之上运行Django。我们使用PostgreSQL作为数据库,因为当提到集群和扩展时,它被认为是行业标准。
上传,外部源
Uploadcare允许用户使用小部件上传文件。我们支持多个上传源,包括仅需要URL的API。
上传的文件由Django应用程序接收,大部分由Celery完成。它很适合处理队列,它拥有一个强大的社区和大量的教程和示例。Celery处理上传大文件,从不同的上传源检索文件,存储文件,并将文件交付到Amazon
S3。与外部源的所有通信都由单独的Amazon
EC2实例来处理,负载均衡由AWS弹性负载平衡器处理。负责上传的EC2实例与应用程序的其余应用保持分开。
当我们在保留资源以降低成本和提高效率时,在AWS中遇到的两个问题是:AWS状态页面报告不准确,并且未能提前计划。
文件存储,用户和文件数据
我们使用Amazon S3进行存储。EC2上传实例,REST API和处理层都与S3直接通信。如果他们愿意的话,S3让我们能够永久存储客户档案。
文件和用户数据由高度定制的Django REST框架进行管理。起初我们使用了开箱即用的Django
REST框架,因为它帮助我们快速部署功能。然而,随着我们对REST
API应如何工作的展望,我们对它实施了定制来适应我们的用例。我们的定制添加的代码越来越多,从而导致更新框架变成了一个痛点。我们正在寻求修改堆栈的这一部分,以避免添加进一步定制框架时,使这个问题复杂化。
我们使用微型框架Flask来处理敏感数据和OAuth通信。它是轻量级和高效的框架,同时不包括我们不需要的任何功能,如队列,ORM层或高速缓存。
我们在博客上关于云安全的文章中更详细地探讨了这个话题,解释了Uploadcare如何从社交媒体获取内容,以及如何处理最终用户隐私。
处理
我们每天处理的350M API请求包括许多处理任务,例如图像增强,调整大小,过滤,面部识别和GIF到视频转换。
我们的文件处理要求需要使用异步框架进行IO绑定任务。Tornado是我们目前使用的,而aiohttp是我们打算在将来的生产中实施的。两个工具都支持处理大量的请求,但是aiohttp比较好,因为它使用的是asyncio,而且是Python原生的。
我们的实时图像处理是一个CPU绑定的任务。
由于Python是我们服务的核心,我们最初使用PIL,然后是Pillow。我们还在改进。当我们认为调整大小是最耗资源的操作时,我们的工程师Alex创建了名为Pillow-SIMD的叉型指令,并做了大量优化,使其比ImageMagick快15倍。优化之后,现在Uploadcare需要服务器处理的图像减少6倍。这里,通过服务器也意味着处理EC2实例和第一层缓存分离。处理实例也与ELB配对,这有助于将文件提取到CDN。