返回 登录
0

Medium融资5700万美元背后的技术栈

什么是Medium

Medium是由Twitter的联合创始人 Evan Williams 和 Biz Stone 在2012年创建,目的是想打造一个“沉浸式的写作平台”。Medium刚刚在两个月前获得了5700W美金融资。Evan认为目前的blog都太注重数据,比如关心文章的点击率阅读量,并且feed流的呈现方式导致更新频繁的作者能够获得更多的流量——因为网站总是会把最新的文章放到首页,这对于用心打磨内容的作者来说,其实这并不公平。所以在Medium上,看到一篇昨天写完和一年前写完的文章概率是相同的,而内容取决于你在注册时所勾选的兴趣和主题(tags),但即便如此,Medium上仍有很大一部分是科技和互联网主题的文章。

工程师团队

Medium团队是一个跨职能,任务驱动的团队,他们提倡接触不同的事情,这会让你成为一个更强大的工程师。团队对于工作方面有很多比较灵性的选择。他们使用GitHub做代码审查和bug跟踪,使用Google Apps来处理邮件、文档和电子表格处理。他们重度使用slack和slack机器人。

初始栈

Medium团队最开始是把项目部署在EC2。主要的服务器端是用Node.js编写,数据库使用DynamoDB。这是他们向公众推出的第一个版本。

他们使用一个节点服务器用于图像处理,委托Graphicsmagick做一些比较复杂的问题。另一个服务器作为后台任务SQS队列处理器。

他们使用SES作为电子邮件,CloudFront作为CDN,和Nginx作为反向代理。他们用datadog用于报警监控然后PagerDuty用作输出。该网站使用TinyMCE作为编辑基础模块,handlebars做为模板。在发布前Medium已经使用闭包编辑器和一些部分的闭包库。

生产环境

Medium是在亚马逊的虚拟私有云。利用Ansible做系统管理,这使他们能够保持我们的配置是在资源控制下而且非常容易找出改动。

Medium有一个面向服务的体系结构,运行大约十几个生产服务。是否部署一个单独的服务的主要选择取决于它执行的工作的特殊性,可能依赖的变化是如何跨越服务边界、资源利用特性等等。

Medium的主要应用服务主要用Node编写,有时候有比较复杂的编辑和转换,这使得Medium团队能够共享服务器和客户端之间的代码。Node能很好的完成Medium的工作,但是性能问题已经出现了。为了缓解这一点,他们运行多个实例,每台机器和路由昂贵的端点到特定的情况下,从而使它们分离。他们也连接到V8运行获得洞察蜱是长时间服用;一般是由于在JSON反序列化对象具体化。Medium还有几条辅助服务是写在go上。

Medium结合使用Nginx和HAProxy作为反向代理,负载均衡,满足维恩图特性。他们仍然使用Datadog监测和PagerDuty警报,使用ELK(Elasticsearch,Logstash,Kibana)调试生产环境的问题

数据库

DynamoDB仍然是Medium的主要的数据存储。他们有一个Redis缓存集群隔开了数据库,减轻这些问题与读取。优化开发商的方便性和生产稳定往往似乎不好,但我们正在努力接近差距。Medium开始使用亚马逊极光的一些较新的数据,它允许更灵活的查询和过滤Redis。使用Neo4j的存储表示媒体网络实体之间的关系,一个主线带领两个分支运行。用户、文章、标签和集合是图中的节点。

数据平台

Medium使用Amazon Redshift作为数据仓库,提供可扩展的存储和处理系统,而且还不断引进到他们的核心数据集(例如用户,帖子)从Redis到Redshift,和事件日志(例如后认为,从S3到redshift后滚动)

工作安排由Conduit这个内部工具管理调度、数据依赖和监测。Medium使用一个基于断言的调度模型,如果他们的依赖是满意的(如日常工作,依赖于一个事件日志)的基础上,只会执行任务。

本来在Redshift中跑sql能很好的完成Medium的工作,但是他们需要不停的从Redshift里面写入和读取数据,随着时间的推移,Medium开始越来越多地转向Apache Spark ETL由于其灵活性和与Medium的增长规模的能力。将来可能会成为Medium的数据管道的首选工具。

Medium使用Protocol Buffers为Medium的架构(和模式演化规则),以保持所有的分布式系统的所有层同步,包括移动App,网络服务,和数据仓库。使用自定义选项,他们将Medium的架构与表名和索引的配置细节进行注释,以及验证约束如字符串的最大长度,或可以接受的数字范围

用户需要保持移动端和Web端信息同步,开发人员可以用同样一种方式记录日至,这样可以帮助我们的人与数据处理的规范,严格的记录信息和领域和出版产生的文件从原始文件的数据。

图像

Medium的图像服务器现在是用Go写,使用一个瀑布式的策略,用于处理图像。服务器使用Groupcache,替代Memcache帮助降低整个团队的重复性工作。

Web前端

Medium有自己的单页应用程序框架,使用闭包作为标准库。Medium使用闭包模板在客户端和服务器的渲染,还使用闭包编译减小代码和它分割成模块。

iOS

Medium的App都是本地的,很少使用网络视图。在iOS中,Medium使用一个本地框架和内置的成分的混合物。在网络层,他们使用NSURLSession制作成模型解析JSON请求和Mantle。他们有一个缓存层在Nskeyedarchiver的上一层。Medium有一个通用的方式来呈现在一个列表中的项目与一个共同的造型,这使Medium能够快速建立新的列表,不同类型的内容。后视图和自定义布局UICollectionView建。Medium使用共享组件来渲染完整的文章和后预览。每一个承诺是建立和推动中的员工,所以Medium可以尝试尽可能快的应用程序。释放到AppStore的节奏是受惠于审查周期,但是他们要继续尽我们所能的快速,即使只有最小的更新。为了测试,Medium使用Xctest和Ocmock

其他

比如,Medium使用Algolia进行快速搜索,使用SendGrid作为出入站邮件服务等。


原文地址:http://stackshare.io/medium/the-stack-that-helped-medium-scale-to-2-6-millennia-of-reading-time
译者:winrun_wang,一个只愿做自己的程序员

评论