Steve Huffman,Reddit的共同创始人,分享了将Reddit从一个小型Web应用程序发展为大型社交网站过程中学到的主要经验。
Steve Huffman和Alexis Ohanian在2005年创建了Reddit,当时在一台机器上运行Web应用程序、应用服务器和数据库。 发展至今,Reddit已经成长为每月750 万用户、2亿7千万PV的站点。
Huffman在一次演讲 中谈到 Reddit发展过程中学到的经验, 他们犯的很多错误,以及他们是如何修复这些错误的。
1、宕机是家常便饭
起初他们经常宕机,Huffman常常睡在笔记本电脑旁边,每隔几个小时就醒一下,看看网站是否仍在运行。
当时的解决方案是使用 Supervise,那是一个能重启崩溃应用程序的守护进程。 这带来了一种很有趣的运行应用程序的方式:如果应用程序有内存泄露,或者消耗了太多的内存, 只需终止它随后重启即可。 这只是一个临时方案,而非最佳方案,最终是基于日志内容修复了应用程序。
2、服务分离
Huffman建议将类似的进程集中在一台机器或一组机器上,这样可以避免频繁的上下文切换,减少资源消耗。 他还提供了一个最佳实践——在一个数据 库中处理类似的数据,以此避免频繁的索引缓存切换, 将其他类型的数据移到别的机器上去。
Huffman强烈建议避免使用线程,在Python中这就是“死亡之吻,缓慢之道”。 如果多个任务被分配到独立的进程而非线程上,那在请求量上 升、需要更多资源的时候, 就可以方便地将它们移到不同的机器上。
这种做法的唯一问题就是进程间通信,除此之外都比使用线程要好,因为这样的架构能更平滑地 进行扩展。
3、开放Schema
随着数据库的发展,每个要更新Schema的新特性都会带来更多的问题。 向一个有1千万行数据的表中增加一个新字段需要很多时间,尤其是有备份 (backup)和复制(replication)时。 他们当时虽然没有备份,但也花了好多天,因为他们构建了一个副本(replica)。
解决方案是使用开放Schema或实体-属性值,Key-Value存储。现在每个数据类型有两张表:
![image]
Thing 可以是用户、链接、评论等,共享相同的Schema。 Data 表由大量数据构成,但里面只有3个字 段:ID、 Key和Value。 在新的Schema中添加新特性并不涉及Schema的变更,也不需要创建新表。 此外,再也没有数据库的join操作,这也易于数据 库的拆分。
4、保持无状态
所有Web应用程序都有一个共同的目标,它的每台应用服务器都能处理任意请求。 这个目标在只有一台机器时很容易达成(这是显而易见的),但当使用多 台服务器并缓存应用状态时,情况就变得复杂了。 每台服务器在访问缓存数据时的复杂性都增加了,而且还加入了更多的缓存冗余。
此处的解决方案是切换到memcache并在所有应用服务器上不再使用状态。 一个立竿见影的效果是一台应用程序服务器宕机时不会影响其他服务器。 此外,可以简单地通过增加更多服务器来进行扩展。
将缓存服务器与其他服务器隔离开是很重要的,这能避免资源争夺。
5、Memcache所有内容
Reddit的所有内容都使用了memcache:数据库的数据、会话数据、渲染的页面、存储的内部函数、预先计算的页面、全局锁。 它们还用 memcachedb进行数据持久化。
6、存储冗余数据
“在你需要前,数据都保持正规化”会降低性能。
当用户需要以特定格式来展现数据时,获取原始数据随即进行处理会延长响应时间,以至于用户放弃等待结果。 解决方案是在内存和硬盘中保存数据的所有格式。这样做对磁盘和内存有些影响,但对用户请求的快速响应很有帮助。
对Reddit而言,速度的关键是“预先计算所有内容并放入memcache。”
7、脱机工作
当用户发起请求时,系统要执行用于返回适当响应的必要工作,其他事情都放到队列任务中脱机执行。
例如,脱机执行的工作包括:预先计算列表、获取缩略 图、检测欺骗行为、删除垃圾信息、计算奖励以及更新搜索索引。 当用户给某个链接投票时,他并不需要等待所有索引和列表更新完毕,这些任务可以在响应用户后 再去执行。
查看英文原文: 7 Lessons Learned at Reddit
译文地址:http://justjavac.com/nosql/2012/04/13/7-lessons-reddit.html
相关推荐
reddit is fun yeppy caye!
《Reddit产品数据集:探索与分析》 Reddit是全球知名的社交新闻网站,用户可以在各个“子论坛”(Subreddits)中分享、讨论各种话题,包括科技、娱乐、生活等各个方面。"Reddit产品数据集.zip" 提供了一个深入了解...
这是reddit官方网站源代码。 标签:reddit
标题中的"Android-这是目前发布过的最好RedditApp"表明我们正在讨论的是一款在Android上受到广泛赞誉的Reddit应用,它很可能在用户体验、功能集成和性能优化方面达到了相当高的水平。 首先,从描述中我们可以推断,...
reddit_crawlers, 将尝试制作有趣的reddit爬虫,提供一些洞察力 reddit_crawlers将尝试制作有趣的reddit爬虫,提供一些洞察力使用 python praw库对于着色 bot: 我们使用以下 python 附加软件包:...
4. **主组件**:将`reddit-list`组件添加到主组件(通常为`app.component.html`)中,以将其显示在页面上: ```html <app-reddit-list></app-reddit-list> ``` 5. **运行应用**:启动开发服务器查看应用: ``...
在本项目中,"angular-reddit demo" 是一个基于Angular框架构建的示例应用,它展示了如何使用Angular来创建一个类似于Reddit的Web应用程序。这个压缩包包含了一系列必要的资源文件,以便于开发者能够运行并理解该...
此存储库使用 PRAW 从 reddit 创建自定义数据集。 PRAW/Reddit API 基础知识 这不是 PRAW 的教程。 如果您愿意,我建议您访问他们的。 本节将仅介绍从 reddit 创建数据集所需的 PRAW 基础知识。 首先,让我们导入 ...
综上所述,"Reddit 2.5 million 社交新闻数据"是一个宝库,它不仅能够帮助我们理解网络社交行为,还能够为数据科学家、社会学家、媒体研究者等提供丰富的研究材料,推动对网络社会的深入探索。通过细致的数据挖掘和...
此数据集展示了来自 Reddit 最受欢迎的 50 个订阅者数量最多的 50 个帖子的...数据时间跨度从 2011 年 9 月到 2024 年 9 月,提供了关于数字内容演变和用户交互动态的广泛历史视角,数据集中总共约有 50,000 条记录。
项目线框 该网站将有两种设计。 一种用于移动设备,另一种用于台式机。 我已附上两张图片/线框,说明它们... “搜索”部分将允许您搜索reddit页面上的任何主题。 这将使用reddit API完成。 行动网页 桌面页面 页面流
"RoRdit"这个名字暗示了这是一个模仿Reddit的项目,Reddit是一个流行的社交新闻网站,用户可以提交链接、评论并进行投票,从而决定内容的排名。 在Ruby on Rails中,创建一个链接聚合Web应用程序涉及到以下几个核心...
标题 "Reddit 用户交互记录【Kaggle竞赛】.zip" 提供的信息表明,这是一个与Reddit平台用户活动相关的数据集,用于Kaggle竞赛。Kaggle是全球知名的在线数据科学和机器学习竞赛平台,它经常发布各种数据挑战,鼓励...
Reddit Programming
Reddit WebDev
Reddit
reddit-fetch获取评论一个简单的程序来获取reddit帖子的顶级评论当您有类似的线程时很有用, 什么是对python有帮助的最佳资源? 你最喜欢的专辑是什么? 然后,将仅列出您可以保存的所有内容的名称。跑步克隆存储库...
使用此程序包将MIDI文件发布到 subreddit。 特征 轻量级-没有不必要的依赖关系,易于审核的源代码 现代API –使用异步/等待和承诺 由提供支持 用法 首先, 。 点击“创建应用” 对于简单的脚本,可以选择“脚本”...