uploadcare如何构建一个每天处理350m个文件API请求的堆栈

Uploadcare
UploadCare是一个云文件系统,作为任何Web或移动应用程序的服务。

通过Dmitry Mukhin,CTO atUploadcare.


Uploadcare是作为服务解决方案的文件基础结构。我们提供用于处理为管理复杂技术提供简单控制的文件的构建块。These controls include our widget,上传API,REST API以及CDN API。All together these APIs handle 350M requests per day.

只有几行代码可以上传,store,过程,隐藏物,并传送文件。我们支持从Dropbox上传,Facebook,以及许多其他外部资源。我们还允许用户直接将文件上传到他们的存储中。


小部件上传工作流


对,你可以自己处理文件,你可以让基本系统运行得很快。存储呢?Uptime?清晰友好的用户界面?Fast delivery to remote regions?对于我们分析的大多数用例,投资开发自己的文件基础架构是没有意义的。

设置UploadCare很快,可以解决用户在处理大文件和小文件批次时遇到的许多问题。此外,您不再需要在每个浏览器中测试系统并维护基础结构。

UploadCare通过利用自动气象站.建立在AWS之上,我们可以处理每天350m的文件上传请求,操作,and deliveries.当我们在2011年开始的时候,唯一的云替代AWS是Google App Enginewhich was a no-go for a rather complex solution we wanted to build.我们也不想买任何硬件或使用共同的地点。

我们的堆栈处理接收文件,communicating with external file sources,管理文件存储,管理用户和文件数据,正在处理文件,文件缓存和传递,and managing user interface dashboards.

从一开始,我们就用基于微服务的体系结构构建了uploadcare。

这些是我们在堆栈的每一层所面临的挑战。

后端

在其核心,Uploadcare runs on蟒蛇.2011年欧洲之星会议在佛罗伦萨我们受到了启发,再加上它足够普遍,能够解决我们面临的所有挑战,这一事实为这一决定提供了信息。另外,我们以前在Python工作过。

我们选择使用丹戈because of its feature completeness and large footprint within the Python ecosystem.

我们生态系统中的所有通信都是通过几个HTTP API进行的,雷迪斯Amazon S3,and亚马逊发电机.We decided on this architecture so that our our system could be scalable in terms of storage and database throughput.这样我们只需要Django在我们的数据库集群上运行。我们使用波斯特雷斯尔作为我们的数据库,因为在集群和扩展方面它被视为行业标准。

上传,External sources

UploadCare允许用户使用我们的小装置.我们支持多种上传源,包括API只需要URL。

Uploaded files are received by the丹戈大部分起重作业都是由芹菜.It's great for handling queues and it's got a great community with tons of tutorials and examples to leverage.芹菜处理上传大文件,retrieving files from different upload sources,存储文件,并将文件推送到Amazon S3.与外部资源的所有通信都由单独的Amazon EC2处理负载平衡的实例弹性负载平衡器.负责上传的EC2实例与应用程序的其余部分保持独立。


上载图


The only two issues we have experienced with AWS are inaccurate reports from the AWS status page and failing to plan ahead when reserving resources to reduce costs and inefficiencies.

文件存储,User and file data

我们使用AmazonS3进行存储。The EC2 upload instances,REST APIand processing layer all communicate with S3 directly.S3使我们能够永远存储客户文件,如果他们愿意的话。

文件和用户数据是通过大量定制的Django REST framework.首先,我们使用现成的django-rest框架,因为它帮助我们快速部署特性。However,随着我们对RESTAPI应该如何工作的愿景的发展,我们实现了适合我们的用例的定制。我们的自定义添加的足迹已经增长到足以使更新框架成为一个难点。我们希望修改堆栈的这一部分,以避免进一步的定制,这会使问题复杂化。

我们使用微框架Flask处理敏感数据和OAuth通信。It is lightweight and efficient and doesn't include any features that we don't need such as queues,ORM层,或高速缓存。

我们将在article on cloud-securityon our blog explaining how Uploadcare gets content from social media and how we treat end user privacy.

Processing

我们每天处理的350M API请求包括许多处理任务,例如图像增强,调整大小,filtering,人脸识别,和GIF到视频转换。

我们的文件处理要求必须为IO绑定任务使用异步框架。龙卷风是我们目前使用的AIOHTTP我们打算在不久的将来在生产中实现这两种工具都支持处理大量的请求,但是aiohtp更可取,因为它使用阿辛乔这是Python本地的。


加工交付图


Our real-time image processing is a CPU-bound task.因为python是我们服务的核心,我们最初使用PIL,然后Pillow.我们还是会的。当我们认为调整大小是最繁重的处理工作时,亚历克斯,我们的工程师,创建了名为Pillow-SIMD并对其进行了大量优化,使其达到15次比ImageMagick快.Thanks to the optimizations,Uploadcare now needs six times fewer servers to process images.在这里,对于服务器,我还意味着单独的EC2实例处理处理和第一层缓存。The processing instances are also paired with ELB which helps ingest files to the CDN.

Caching,送货

缓存有三层,有助于提高整体性能:

  • 在处理引擎中缓存,以使相同的操作不会多次运行
  • 在cdn屏蔽内缓存,对于cdn边缘,不要更有效地锤击源和缓存内容
  • Cache on the CDN edges as the frontier closest to consumer devices

For delivery,然后将文件推送到阿卡迈CDN with the help of恩吉克斯and弹性负载平衡器.我们也使用Amazon CloudFront但由于缺乏覆盖,we moved to Akamai as default CDN.也,Akamai has many cool features,例如,它允许我们自动调整图像formatsto user browsers.

值得补充的是,我们的文件接收/交付比率强烈偏向于交付。

前端

对复杂技术的简单控制,as we put it,wouldn't be possiblewithout neat UIs for our user areas including start page,dashboard,设置和文档。

最初,有丹戈.回到2011,考虑到我们以Python为中心的方法,那是最好的选择。Later,we realized we needed to iterate on our website more quickly.这导致我们把姜戈从我们的前端分离出来。那时我们决定建一个水疗中心。

为我们的首页建造水疗中心,文档,以及其他从头开始的站点部分是一个正在进行的过程。已经完成了Node.js它是异步的,并提供同构渲染。In order to communicate with our older Django-based front end,it uses JSON API through恩吉克斯.这是我们坚持的经验法则:一旦分开,the communications between our front and back end will still be carried out via JSON API.

对于构建用户界面,we're currently using反应因为它提供了我们构建工具箱时最快的渲染。And it's not just it: React has a great community which helps you code less and build more.It's worth mentioning Uploadcare is not a front-end-focused SPA: we aren't running at high levels of complexity.如果是,我们会一起去余烬.

However,there's a chance we will shift to the fasterPreact,以尽可能少用代码为座右铭,因为它更多地使用浏览器API。

On the client,我们使用数据J.and do routing via反应路由器.后者是令人敬畏的反应社区的一个很好的例子。

One of our future tasks for our front end is to configure ourWebpackBundler将代码拆分为不同的站点部分。目前,when you load a site page,您还可以获得所有其他页面的代码。Webpack也是一种无代码构建更多工具,具有大量社区示例,用作入门工具包。我们在考虑使用BrowserifyorRollup,但是它们没有运行时,或者工作速度比Webpack慢,或者需要我们做更多的编码来提供类似的功能。另外,异步块更容易用Webpack处理。

对于静态站点页面,many of them are Markdown-formatted files sitting in agithub回购协议。总体而言,我们正在使用Github拉请求模型进行部署。从回购文件,然后通过金贾2启发nunjucks然后降价andPASTHTML.Our docs are built this way,例如。

For styles,we usePostCSS连同它的插件such asCSNNANS它缩小了所有代码。

如你所知,we like the idea of post-processors.posthtml,例如,是aparser和一个字符串化器,它提供了一个易于使用的抽象语法树。

所有这些都使我们能够提供出色的用户体验,并在需要的地方以尽可能少的代码快速实现更改。

Deployment

As I mentioned above,we use the GitHub Pull Request Model.Certain parts of theprocess are automatic while others require manual intervention.我们使用以下步骤:

  • 我们在回购中创建了一个具有我们的特性之一的分支
  • 对分支机构作出承诺。That's followed by自动测试in团队城市
  • 如果测试通过,创建一个pr,然后由开发团队进行自动测试和代码审查
  • If tests pass/review ok,我们将更改合并到临时分支,然后通过TeamCity自动部署该分支,并Chef
  • 部署时,我们通过TeamCity运行集成测试
  • 如果一切都是绿色的,我们将更改合并到生产部门,并通过TeamCity自动运行一组测试
  • 如果测试通过,我们保证不是星期五晚上,我们部署生产。这里的厨师脚本由DevOps运行。


部署流程


我们通过松弛channel.关于报告,we get a lot of input from our monitoring stack which includes路障对于报告错误和例外情况,对数基因for logging,平顶山for testing our services externally,亚马逊云表用于监测AWS状态,and数据报用于整合报告和监控服务器和服务的运行状况。

团队管理,任务,通信

除了松弛,还有G套房对于电子邮件,Trello为了规划,帮助侦查员and对讲机为了客户的成功沟通和客户关系,and更多.

视觉

Since we provide the complete set of building blocks for handling files,weencourage everyone out there to use similar building blocks for different parts of their products.我们的堆栈就是一个很好的例子——它是预构建组件的集合。And we can always go on and add more to the list.例如,we're usingSegmentto send data for analyses,哪一个,反过来,由执行克里斯米格锐利的,对讲机,and others.We're usingStripefor processing payments.

We practice what we preach: focus on what you want to create and let those building blocks handle the specific tasks they were made for.

Uploadcare
UploadCare是一个云文件系统,作为任何Web或移动应用程序的服务。
评论
你也可能喜欢
Raygun如何解决每小时100M API调用的性能问题
redux:将每日从40亿到2000亿个功能标记的启动进行暗扩展
大规模电子商务:在Shopify的技术堆栈中
senggrid如何扩展到每月400亿封电子邮件