Medium服务架构分析

本文涉及的产品
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
简介: Medium服务架构分析 Medium 是一个轻量级内容发行平台,允许单一用户或多人协作,将自己创作的内容以主题的形式结集为专辑(Collection),分享给用户进行消费和阅读。

Medium服务架构分析


  Medium 是一个轻量级内容发行平台,允许单一用户或多人协作,将自己创作的内容以主题的形式结集为专辑(Collection),分享给用户进行消费和阅读。
img_d57f017b78bfc6a6d349dbaa37819dce.jpe

Medium目前累计的用户阅读时间已经超过14亿分钟,合连钱六百年。支持者每个月两千五百万的读者以及每周数以百万的文章发布,必定有一个强大而又完善的机构体系!下面我将就我个人观点谈一谈Medium所使用的架构的优缺点。

架构体系

img_967604fad4501d3ed4e58c9a8e7bb597.jpe

原始架构

  最开始的时候,Medium部署在**EC2**上,用**Node.js**实现,后来公测的时候迁移到了**DynamoDB**。

  其中有个节点用来处理图片,负责将复杂的处理工作转向GraphicsMagick。还有一个节点用作后台的SQS队列处理。

  我们用SES处理邮件,**S3**做静态元素服务器,**CloudFront**做CDN,**nginx**作为反向代理,**Datadog**用来监控,**Pagerduty**用来告警。

  在线编辑器用了TinyMCE。上线之前我们已经开始使用Closure编译器以及部分的Closure库,但是模板还是用的Handlebars。
 由上述架构来看,Mdeium选择了最稳妥的架构,这个架构适合刚刚起步的互联网公司,基本所有互联网公司都能使用,也加上内容分发特有的多节点,特有的图片处理节点,不过变通一下,还是可以用到很多网站上的。

当前架构

  相对于原始架构,从上面的服务架构图你可以看出,要比之前的架构复杂得多,虽然Medium表面看起来很简单,但是了解其后台的复杂性后,你会大吃一惊。有人会说,**这就是个博客啊,用Rails之类的一周就能搞定了。**那你就大错特错了,闲话少说,一起来分析一下。

>当前运行环境

  Medium目前运行在Amazon虚拟私有云,使用Ansible做系统管理,它支持配置文件模式,还将文件纳入代码版本管理,这样就可以随时回滚随时掌控。

  Medium的后台是个面向服务的架构,运行了大概二十几个产品服务。划分服务的依据取决于这部分功能的独立性,以及对资源的使用特性。

  Medium的主体仍然是**Node.js**完成,方便前端和后端的代码共享,主要是文章编辑和发布这个过程。Node大部分时候不错,但阻塞event循环的时候会有性能问题。为了缓解,所以在每台机器上启动多个Node实例,将对性能要求比较高的任务分配给专门的实例。同时我们还深入V8运行时环境查看更加细节的耗时,基本上是JSON去串行化的时候的对象具体化耗时较多。

  没有仅仅使用**Node.js**还用**Go语言**做了一些辅助服务。

  目前静态元素大部分是通过CloudFlare提供的,还有5%通过Fastly,5%通过CloudFront,这么做是为了让两者的缓存得到更新,用于一些紧急的情况。最近我们在应用流量上也使用了CloudFlare,当时主要是为了防止DDOS攻击,但随之而来的性能提升也是我们愿意看到的。

  使用Nginx和HAProxy做反向代理和负载均衡,来满足所需功能的维恩图。

  我们仍然使用Datadog来监控,Pagerduty来告警。现在又增加了ELK(Elasticsearch、Logstash、Kibana)来进行产品问题调试。
 相对于原始架构,一套通用架构来说,现有架构改动很大,可以说这个架构就是为了Medium量身定做的,而且在主体使用Node.js使用Go语言辅助来说,是一个很好的选择,相比Java语言的冗长罗嗦和虚拟机,Go语言在类型安全方面做的很到位。

>数据库

  DynamoDB仍然是主力数据库,但是用起来也不是毫无问题。目前遇到的比较棘手的是大V用户展开和虚拟event过程中的热键问题。Medium还专门在数据库前面做了一个Redis缓存集群,来缓解这些问题。
  目前开始在存储新数据上使用Amazon Aurora,它可以提供更灵活的查询和过滤功能。

使用Neo4J存储Medium网络中实体之间的关系,运行在有两个副本的主节点上。用户、文章、标签和收藏都属于图中的节点。边则是在实体创建和用户进行推荐高亮等动作时生成。通过在图中游走来过滤和推荐文章。

 对于数据库来说,一开始就没有选用关系型数据库来做项目,开始就选用了非关系型数据库来做,一是因为项目本身来说,Amazon DynamoDB是一个完全托管的NoSQL数据库服务,可以提供快速的、可预期的性能,并且可以实现无缝扩展,可以更好的进行管理,二是非关系型数据库本身的有点,数据存储不需要固定的表结构,通常也不存在连接操作。在大数据存取上具备关系型数据库无法比拟的性能优势。但是在数据库协同的时候还是会出现一系列问题。

>数据平台

  采用Amazon Redshift作为数据仓库,为生产工具提供可变存储和处理系统。我们持续将诸如用户和文章等核心数据从Dynamo导入Redshift,还将诸如文章被浏览被滚动等event日志从S3导入Redshift。

  任务通过一个内部调度和监控工具Conduit调度。我们用了一个基于断言的调度模型,只有条件满足的时候,任务才会执行。从产品角度来讲,这是不可或缺的:数据制造方应该与数据消费方隔离,还要简化配置,保持系统的可预见和可调试性。

  Redshift的SQL检索目前运行不错,但我们时不时需要读取和存储数据,所以后期增加了Apache Spark作为ETL,Spark具有很好的灵活性和扩展能力。随着产品的推进,估计后面Spark会成为我们数据流水线的主要工具。

  我们使用Protocol Buffers作为schema来确保分布式系统的各层次间保持同步,包括移动应用、web服务和数据仓库等。通过定制化的选项,我们将schema标记上更加细化的配置,如带有表名和索引,以及长度等校验约束。

  用户也需要保持同步,这样移动端和网页端就可以保持日志的一致性了,同时方便产品科学家们用同样的方式解析字段。我们帮助项目成员从.proto文件中生成消息、字段和文档等内容,进而利用所得数据开展研究。

>图片服务器,文本标记,自定义域名

  从开始简单的服务架构,现在变得又来越细化,把每项细节都做到极致,图片服务器现在用Go语言实现,采用瀑布型策略来提供处理过的图片。服务器使用groupcache,是memcahce的替代品,可以帮助减轻服务器之间的重复工作。而内存级缓存则是用了一个S3的持续缓存。图片的处理是请求来触发的。这给了我们的架构设计师灵活改变图片展示的自由度,为不同平台优化,而且避免了大量的生成不同尺寸图片的操作。文本标注是个有意思的功能,用了一个小型Go服务器,跟PhantomJS接口形成渲染进程。

我一直想要把渲染进程换到Pango,但是在实践过程中,能在HTML中摆放图片的能力的确更灵活。而从功能的使用频率来看,这意味着更容易开发和管控。允许用户为其Medium文章设置个性化域名。在网站前端来说,使用自主研发的单网页应用框架,使用Closure标准库。

总结:

Medium从最初的简单通用架构到现在非常细化的架构可以看出他为什么成功,这也离不开强大的IDC运营商支持,目前的架构来说,虽然还是出现了一定的问题,但相对来说,还是一个非常不错的架构,(适用于特定的内容分发平台)。

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
5月前
|
消息中间件 存储 Kafka
【Kafka】Kafka 架构设计分析
【4月更文挑战第5天】【Kafka】kafka 架构设计分析
|
5月前
|
设计模式 安全 Java
【分布式技术专题】「Tomcat技术专题」 探索Tomcat技术架构设计模式的奥秘(Server和Service组件原理分析)
【分布式技术专题】「Tomcat技术专题」 探索Tomcat技术架构设计模式的奥秘(Server和Service组件原理分析)
95 0
|
1月前
|
安全 数据处理 数据安全/隐私保护
C/S架构与B/S架构的适用场景分析
C/S架构(客户端/服务器架构)与B/S架构(浏览器/服务器架构)在适用场景上各有特点,主要取决于应用的具体需求、用户群体、系统维护成本、跨平台需求等因素。
103 6
|
8天前
|
存储 SQL 分布式计算
湖仓一体架构深度解析:构建企业级数据管理与分析的新基石
【10月更文挑战第7天】湖仓一体架构深度解析:构建企业级数据管理与分析的新基石
12 1
|
1月前
|
存储 监控 安全
SaaS业务架构:业务能力分析
【9月更文挑战第20天】在数字化时代,软件即服务(SaaS)模式逐渐成为企业软件解决方案的首选。SaaS 业务架构设计对于提供高效、可靠的服务至关重要。其核心业务能力包括:用户管理(注册登录、角色权限)、数据管理(存储备份、安全共享)、业务流程管理(设计定制、工作流自动化)、应用集成(第三方应用、移动应用)及客户服务(支持培训、反馈改进)。通过优化这些能力,可为企业提供更高效、可靠的 SaaS 服务。
40 11
|
1月前
|
缓存 负载均衡 数据管理
深入探索微服务架构的核心要素与实践策略在当今软件开发领域,微服务架构以其独特的优势和灵活性,已成为众多企业和开发者的首选。本文将深入探讨微服务架构的核心要素,包括服务拆分、通信机制、数据管理等,并结合实际案例分析其在不同场景下的应用策略,旨在为读者提供一套全面、深入的微服务架构实践指南。**
**微服务架构作为软件开发领域的热门话题,正引领着一场技术革新。本文从微服务架构的核心要素出发,详细阐述了服务拆分的原则与方法、通信机制的选择与优化、数据管理的策略与挑战等内容。同时,结合具体案例,分析了微服务架构在不同场景下的应用策略,为读者提供了实用的指导和建议。
|
2月前
|
消息中间件 负载均衡 Kafka
Kafka 实现负载均衡与故障转移:深入分析 Kafka 的架构特点与实践
【8月更文挑战第24天】Apache Kafka是一款专为实时数据处理和流传输设计的高性能消息系统。其核心设计注重高吞吐量、低延迟与可扩展性,并具备出色的容错能力。Kafka采用分布式日志概念,通过数据分区及副本机制确保数据可靠性和持久性。系统包含Producer(消息生产者)、Consumer(消息消费者)和Broker(消息服务器)三大组件。Kafka利用独特的分区机制实现负载均衡,每个Topic可以被划分为多个分区,每个分区可以被复制到多个Broker上,确保数据的高可用性和可靠性。
55 2
|
2月前
|
数据采集 存储 Java
Flume Agent 的内部原理分析:深入探讨 Flume 的架构与实现机制
【8月更文挑战第24天】Apache Flume是一款专为大规模日志数据的收集、聚合及传输而设计的分布式、可靠且高可用系统。本文深入解析Flume Agent的核心机制并提供实际配置与使用示例。Flume Agent由三大组件构成:Source(数据源)、Channel(数据缓存)与Sink(数据目的地)。工作流程包括数据采集、暂存及传输。通过示例配置文件和Java代码片段展示了如何设置这些组件以实现日志数据的有效管理。Flume的强大功能与灵活性使其成为大数据处理及实时数据分析领域的优选工具。
86 1
|
2月前
|
消息中间件 存储 大数据
大数据-数据仓库-实时数仓架构分析
大数据-数据仓库-实时数仓架构分析
114 1
|
2月前
|
前端开发 大数据 数据库
🔥大数据洪流下的决战:JSF 表格组件如何做到毫秒级响应?揭秘背后的性能魔法!💪
【8月更文挑战第31天】在 Web 应用中,表格组件常用于展示和操作数据,但在大数据量下性能会成瓶颈。本文介绍在 JavaServer Faces(JSF)中优化表格组件的方法,包括数据处理、分页及懒加载等技术。通过后端分页或懒加载按需加载数据,减少不必要的数据加载和优化数据库查询,并利用缓存机制减少数据库访问次数,从而提高表格组件的响应速度和整体性能。掌握这些最佳实践对开发高性能 JSF 应用至关重要。
58 0