Digg.com 的系统架构

标签: 程序设计 架构 | 发表时间:2012-06-26 20:05 | 作者:标点符
出处:http://www.biaodianfu.com

在过去的几年间,我们一直致力于重构Digg的架构,现在我们称之为“Digg V4”.本文我们将全面介绍Digg的使用的系统和技术。找出Digg引擎的秘密。 首先,我们来看下Digg给大众用户提供的服务吧:

  1. 一个社会化的新闻站点
  2. 为个人可定制的社会新闻
  3. 广告平台
  4. API 服务
  5. 博客和文档站点

人们通过浏览器或者其他应用来访问这些Digg服务。一些有Digg账户的用户,可以得到“我的新闻”。每位用户可以得到的我们称之为“热门新闻”。我们有 digg.com和移动版的 m.digg.com,API服务的 services.digg.com,信息介绍的 about.digg.com,为开发者服务的 developers.digg.com。这些站点统一为用户,新闻发布者,开发人员提供了博客和文档服务。

本文主要介绍Digg在社会化新闻产品中使用的高级技术。

我们努力要做的

我们努力搭建以用户发布新闻和广告商发布广告为基础 一个社会新闻站点。

故事提交 注册用户提交文章,文章包含:一个标题,一篇段落,一个媒体类型,一个主题,或者一个缩略图。这些内容通过一系列的元字符标准( Facebook open graph protocol, OEmbed等)如从文章中解压出来,当然提交者在提交前最后这些元字符具体是什么。广告发布商将广告发布到另外一个独立的系统,当然如果Dugg够的话,完全可以成为故事。

故事列表 在个性化新闻产品“我的新闻“里,你追随的用户发布的所有故事以“故事列表”显示,采用最近发布,媒体类型,故事的主题等方式排列。

故事动作 用户可以对故事进行操作,比如说阅读,点击,Digg,掩埋,发表评论,投票等等。没有注册登录的用户只能阅读和点击这些故事。

故事推荐 我们会决定每个小时有一些故事会从最近故事列表转移到热门新闻列表。我们的算法(这个是保密的)通过查看用户的行为和故事内容的分类来决定选择哪些故事进入热门新闻。

我们是如何实现它的?

让我们从宏观的角度看下如果一个用户访问Digg的站点,做一些基于内容的操作。下面的图片显示了公众看到的内容及内部提供的页面、图片、API请求等服务。

我们内部系统的简单描述如上。我们的API服务代理想内部后端服务进行请求。前端的服务是被虚拟化的(与缓存是有区别的),并且放置在相同的服务层。CMS和广告系统将在此文章中不做详细说明,纵览整个系统,大致可以分为以下两类:同步和异步。

1、对用户进行即时响应的同步操作

同步操作主要表示对用户请求(包括API请求)的即时快速响应,包括一些在页面中通过AJAX方式进行的异步请求。这些操作通常要求最长一两秒的时间内就能完成。

2、离线批量进行的异步计算
除了实时响应的请求外,有时候还需要进行一些批量的计算任务,这些任务可能是间接的被用户启动的,但用户不会等待这些任务的完成。这些异步计算通常可能会花费数秒,数分钟甚至几小时。

上面所说的两部分如下图所示:

下面就更加深入的了解各个组成部分。

线上系统

提供页面和API请求服务的程序主要以PHP(前端Web页面, Drupal CMS)和使用的Python(API服务, Tornado)编写。前端通过 Thrift protocol协议来调用后端的服务(Python)。很多数据会被如 Memcached 和 Redis 这样的内存缓存系统缓存。

消息和事件

线上和离线的信息通过主要数据存储transient / logging系统这种同步方式连接和使用  RabbitMQ 作队列系统,将不用同步响应的操作放到队列异步地进行。比如说”一个用户Dugg了一个故事“,”计算这个东西“。

批处理和异步系统

上面的消息系统是指队列,而这个指的是具体从队列取出任务执行的部分。此系统将任务从队列中取出,进行一定的计算后再对主存储进行操作,对主存储的操作在实时系统和异步批量系统中都是一样的。

当队列中发现信息时,一个“工作者”被调用来完成特定的动作。一些信息由事件触发,有点象cron机制。然后工作者对主存储设备或者离线存储设备的数据进行运算和操作,在HDFS中记录日志,然后把结果写回到主存储设备,这样在线服务就可以使用他们。举个例子:比如说索引新的故事,计算故事提升算法,运行分析工作。

数据存储

Digg根据数据的类型和使用方式的不同,将数据存储在不同的系统中,当然,有时候还避免不了有一些历史原因。

  • Cassandra:对诸如文章、用户、Digg操作记录等“类对象(Object-like)”的信息,都是使用Cassandra来存储的。我们使用的是Cassandra0.6版本,由于0.6版本并没有劫持二级索引,于是我们将数据通过应用层处理后再用它进行存储。比如我们的用户数据层提供通过用户名及Email地址来查询用户信息的接口。这样就允许了服务器能够查看,比如说,通过用户的用户名或者邮件而不是用户的用户ID来查询。这里我们使用了 Python Lazyboy wrapper
  • HDFS:来自站点和API事件,用户活动的日志都在这里。主要用到日志信息存储及分析计算,利用  Hive 操作  Hadoop,进行MapReduce计算。
  • MogileFS:是一个分布式文件存储系统,用以存储二进制的文件,比如用户头像,截屏图片等。当然,文件存储的上层还有统一的CDN。
  • MySQL:目前我们的文章置顶功能上使用了MySQL存储一些数据,用来存储故事提升算法和计算的数据,因为这一功能需要大量的JOIN操作。很自然不适合其他类型的数据存储。与此同时  HBase 好像也是个不错的考虑。
  • Redis:由于 Redis 的高性能及其灵活的数据结构,我们用它来提供对  Digg Streaming API 的存储,存储每个用户新闻数据,每个用户的新闻具有不同和需要及时更新的特征。同时用Redis来提供 Digg Streaming APIreal time view and click counts服务。作为一款基于内存存储的系统,它提供了超低的负载。
  • SOLR:用来构建全文索引系统。以提供对文章内容、话题等的全文检索。
  • Scribe:日志收集系统,比syslog-ng更强大更简单。用它收集的日志会被放到HDFS进行分析计算。

操作系统和配置

digg目前运行在基于GNU/Linux的 Debian系统。配置了 ClustoPuppet。使用的是 Zookeeper做系统协调。

本文由 标点符 进行翻译,原文链接: http://about.digg.com/blog/how-digg-is-built

Related posts:

  1. 在Windows上安装配置Redis及Python使用
  2. 《Google API大全》图书推荐
  3. 知乎技术方案初探

相关 [digg com 系统架构] 推荐:

HTML5@电子商务.com

- never-online - 随网之舞
在这么短的时间内国内组织了这多次和HTML5相关的大规模顶级会议,几乎涉及到国内所有最领先的互联网企业,从中可以看出HTML5的热度. HTML5引起业界如此重视这是好事,但短时间内过热反而说明了业界对于HTML5的理解程度不够,这点和2005年言必称标准和ajax非常类似,等大家真正对标准和ajax深刻理解并应用到生产实践的时候反而在谈论的是利用标准和ajax成就了某项产品而不仅仅是技术本身,HTML5也正经历这样一个过程.

Win32/MFC/COM学习推荐书籍

- Raymond - 博客园-首页原创精华区
以前有不少朋友问关于学习各种技术的推荐书籍的问题,这里把我觉得比较好的一些书籍列一下,希望能起到抛砖引玉的作用就好了:). Programming Windows by Charles Petzold:Charles Petzold的书,Windows编程入门的超经典书籍,很多朋友学习了MFC,可是还是不清楚Windows程序的运作原理,结构和各种API的用法,这本书由浅入深的讲解了用Win32 API编程,特别是和GUI相关的API,强烈推荐.

Digg起死回生?Facebook添加其应用 PV一月增35%

- - TechWeb 今日焦点 RSS阅读
  Digg的网页浏览量在一月份增加35%,创下该公司自2010年10月份以来最大的流量记录.   网易科技讯 2月25日消息,据国外媒体报道,由于Facebook新添加Digg应用程序,Digg网站表现出新的发展活力.   报道称,软件工程师威尔·拉森尔(Will Larson)在一篇博文中表示,Digg的网页浏览量在一月份增加35%,创下该公司自2010年10月份以来最大的流量记录.

HBase 系统架构

- - 博客园_首页
HBase是Apache Hadoop的数据库,能够对大型数据提供随机、实时的读写访问. HBase的目标是存储并处理大型的数据. HBase是一个开源的,分布式的,多版本的,面向列的存储模型. 5 可在廉价PC Server搭建大规模结构化存储集群. HBase是Google BigTable的开源实现,其相互对应如下:.

天才少年黄艺博总队长.COM

- evan - FeedzShare
来自: zongduizhang.com - FeedzShare  . 发布时间:2011年05月06日,  已有 3 人推荐. 两三岁开始看“新闻联播”,7岁开始坚持每天读“人民日报”、“参考消息”,如今,黄艺博已在全国重要报刊上发表过100多篇文章,并将其近3000元稿费和变卖废品赚来的零花钱都用在资助与看望孤寡老人.

Facebook 的系统架构

- Ivan - 博客园新闻频道
  来源:http://www.quora.com/What-is-Facebooks-architecture (由Micha?l Figuière回答).   根据我现有的阅读和谈话,我所理解的今天Facebook的架构如下:. Web 前端是由 PHP 写的. Facebook 的 HipHop [1] 会把PHP转成 C++并用 g++编译,这样就可以为模板和Web逻贺业务层提供高的性能.

Digg.com 的系统架构

- - 标点符
在过去的几年间,我们一直致力于重构Digg的架构,现在我们称之为“Digg V4”.本文我们将全面介绍Digg的使用的系统和技术. 首先,我们来看下Digg给大众用户提供的服务吧:. 人们通过浏览器或者其他应用来访问这些Digg服务. 一些有Digg账户的用户,可以得到“我的新闻”. 每位用户可以得到的我们称之为“热门新闻”.

系统架构师JD

- - CSDN博客架构设计推荐文章
国内大型的物流企业,专业从事国内公路运输和航空运输代理. Foss项目的架构设计,包括需求分析,模块设计,系统结构设计,关键功能的开发,技术难题的解决,对团队质量输出的把控等等. 1、熟悉WebLogic/Websphere/JBoss等一个以上大型应用服务器,熟悉Linux及应用服务器集群. 2、 具有丰富J2EE架构设计经验,具有大型基于J2EE体系结构的项目规划、系统架构设计、开发经验.

Android 系统架构分析

- - CSDN博客移动开发推荐文章
Android:开源的 Linux + Google 的封闭软件 + 私有的基带 + 运营商锁定 = 开放的 Android 手机. iPhone:开源的 BSD + 苹果的闭源软件 + 私有的基带 + 运营商锁定 = 封闭的苹果 iPhone. 一个平庸的应用商店,开发者依靠广告赚钱,商店并非独此一家,用户找不到好软件.