订阅本站

微薄后台架构浅析

huangdijia 发表于 2011-11-10 分类 Cache/NoSQL, Web服务器, 收藏夹 | 发表评论

之前在网上看到关于Twitter、Sina以及腾讯微薄的一些实现技术,这个简单做个摘要。

1、读扩散还是写扩散?
inbox: 收件箱,你收到的消息,即你所关注的人发布的消息。
outbox: 发件箱,你发布的消息。

写扩散(Push)

该方式为每个用户维护一个订阅列表,记录该用户订阅的消息索引(一般为消息ID、类型、发表时间等一些元数据)。每当用户发布消息时,都会去更新其follower的订阅列表。
优点:读很轻。初始化时仅需要读取自己的inbox即可。
缺点:写很重。每发布一个消息,会导致大量的写操作。
注:一般来说,用户发布消息,并不会更新所有followers的订阅列表,仅更新在线followers即可。

读扩散(Pull)

该方式为每个用户维护一个发送列表,记录该用户所有发表过的消息索引。
优点:写很轻,节省空间。用户每发布一条消息,仅需更新自己的outbox。
缺点:读操作很重,计算量大。假设你收听了1k用户,则初始化时,需要从1k个用户的outbox拉取消息,然后计算获得最新的n条消息。

混合模式(Push+Pull)

该方式既为读写扩散的结合,根据用户followers的数量来决定是读扩散还是写扩散。例如followers大于1k的,则使用读扩散,否则使用写扩散。

从目前现在网上的一些资料来看,Twitter是写扩散,腾讯微薄是读扩散,新浪微薄则是二者结合。

2、关于Cache

对于一个千万级甚至亿级用户的大型网站来说,合理使用Cache至关重要。

一个用户的核心数据由如下几个部分组成:inbox,outbox,关系链,消息内容。

inbox:主要缓存消息索引,仅为在线用户缓存,从Timyang的PPT来看,新浪微薄估计是使用redis的list或set实现。
outbox:缓存一定数量(例如200)条最近发表的消息。
关系链:following相对于followers来说,缓存容易些,follower加载开销比较大,例如刘翔在腾讯微薄的听众超过1600万。
消息内容:按内容年龄缓存;一般需要多份支持容灾;需要缓存xml,json,rss,atom等多种格式的缓存以供API使用。
以Twitter为例,其将Cache分为四类:Vector Cache,Row Cache,Page Cache,Fragment Cache,均使用memcached实现。其中:

Vector Cache主要缓存用户的inbox以及outbox索引,其命中率高达99%;
Row Cache主要缓存用户关系链数据,以及Tweets内容,命中率为95%;
Fragment Cache缓存Tweet的xml,json,rss,atom四种格式数据,以供API使用,命中率为95%;
Page Cache主要原来缓存那些高人气用户的个人主页,命中率仅为40%。
下图为TwitterCache架构图:

Twitter为啥要为API通道设置Fragment Cache和Page Cahce呢?其原因是Twitter的80%流量来自API。

下面以新浪微薄介绍一下Cache流程:

消息发布流程:

更新自己的outbox
加载followers列表
更新followers inbox
获取首页流程:

检查inbox cache是否可用
获取关注列表
聚合内容,获得消息索引
根据索引,返回最终聚合的消息内容
3、关于存储

目前Twitter和新浪的落地存储,都是使用MySQL。而腾讯微薄则使用采用SSD+大文件存储(每次写操作都是append操作,写操作可以先用内存缓存,达到适当大小合并,尽量减少随机写)。其他细节因不清楚或不方便透露,不做细述。

4、关于洪峰处理。

一般用异步队列处理方式。消息队列产品有:Kestrel(twitter使用Scala实现),RabbitMQ(使用Erlang实现),MemcacheQ。

Twitter 09年时,用户的平均followers数量为126个。按照每秒400消息发布数算,那每秒就需要推送126*400=50400条消息出去。为了削峰,Twitter自己用Scala实现了一个分布式消息队列Kestrel,其代码仅为1200行,运行在3台机器上,其使用memcached协议,其Server之间无共享状态,且全内存。新浪使用的是MemcacheQ。

BSON——易于数据交换的格式

huangdijia 发表于 2011-11-7 分类 Cache/NoSQL, 收藏夹 | 发表评论

BSON是由10gen开发的一个数据格式,目前主要用于MongoDB中,是MongoDB的数据存储格式。BSON基于JSON格式,选择JSON进行改造的原因主要是JSON的通用性及JSON的schemaless的特性。

BSON主要会实现以下三点目标:

1.更快的遍历速度

对JSON格式来说,太大的JSON结构会导致数据遍历非常慢。在JSON中,要跳过一个文档进行数据读取,需要对此文档进行扫描才行,需要进行麻烦的数据结构匹配,比如括号的匹配,而BSON对JSON的一大改进就是,它会将JSON的每一个元素的长度存在元素的头部,这样你只需要读取到元素长度就能直接seek到指定的点上进行读取了。

2.操作更简易

对JSON来说,数据存储是无类型的,比如你要修改基本一个值,从9到10,由于从一个字符变成了两个,所以可能其后面的所有内容都需要往后移一位才可以。而使用BSON,你可以指定这个列为数字列,那么无论数字从9长到10还是100,我们都只是在存储数字的那一位上进行修改,不会导致数据总长变大。当然,在MongoDB中,如果数字从整形增大到长整型,还是会导致数据总长变大的。

3.增加了额外的数据类型

JSON是一个很方便的数据交换格式,但是其类型比较有限。BSON在其基础上增加了“byte array”数据类型。这使得二进制的存储不再需要先base64转换后再存成JSON。大大减少了计算开销和数据大小。

当然,在有的时候,BSON相对JSON来说也并没有空间上的优势,比如对{“field”:7},在JSON的存储上7只使用了一个字节,而如果用BSON,那就是至少4个字节(32位)

目前在10gen的努力下,BSON已经有了针对多种语言的编码解码包。并且都是Apache 2 license下开源的。并且还在随着MongoDB进一步地发展。

新鲜热辣的CentOS 6下载地址

huangdijia 发表于 2011-9-27 分类 Web服务器, 收藏夹 | 发表评论

(1)从镜像站点上下载ISO的镜像文件
官方网址 http://www.centos.org/
官方下载 http://mirror.centos.org/

官方下载地址:

http://isoredirect.centos.org/centos/6.0/isos/

网络安装镜像:(引导安装)
32位

http://mirrors.163.com/centos/6.0/isos/i386/CentOS-6.0-i386-netinstall.iso

或者http://mirrors.sohu.com/centos/6/isos/i386/CentOS-6.0-i386-bin-DVD.iso
查看全文

团队管理中的六个“力”

huangdijia 发表于 2011-6-26 分类 收藏夹 | 发表评论

  欧美有句谚语:“一个中国人是条龙,三个中国人是条虫”。听到这样的话,每个中国人都不会高兴,但同样也指出了我们的问题所在。其实我们中国也有一句类似的谚语,叫做“三个臭皮匠,能抵一个诸葛亮”。这句名言同样说的是一种团队协作。
  作为团队中的一员,任何人都不能满足于自己单打独斗所能取得的成就。“‘一’只是小数字,难为伟大。”《纽约时报》最佳畅销书作者,领导力专家约翰·C·马克斯韦尔博士如是说。考察世界上最成功的组织,你会发现其中成功的原因都有一个共同点,那就是有效的团队管理。马克斯韦尔说:“所谓团队领导者的成功,可以定义为对周围人能力最大程度的使用。”
  对于团队的英文“Team”,有一个新的解释:T——target,目标;E——educate,教育、培训;A——ability,能力;M——moral,士气。 查看全文

写给新手程序员的一封信

huangdijia 发表于 2011-6-14 分类 收藏夹 | 发表评论

首先,欢迎来到程序员的世界。在这个世界上,不是有很多人想创造软件并解决问题。你是一名hacker,属于那些愿意做一些有挑战性的事情的人。

“当你不创造东西时,你只会根据自己的感觉而不是能力去看待问题。” – WhyTheLuckyStiff

对于下面的文字你不必完全接受,所有这些来自一个其貌不扬的程序员。我喜欢把事情做到最好,而不是对原来的东西修修补补。 查看全文

ubuntu-11-04

huangdijia 发表于 2011-4-28 分类 Web服务器, 收藏夹 | 发表评论

Ubuntu11.04专题
分类:新闻资讯日期:2011-04-27作者:lingyired阅读:1,432℃
这是一个Ubuntu11.04发布专题:
1.Ubuntu11.04版本特性:
采用Unity桌面环境(针对无3D驱动用户发布Unity -2D)
集成LibreOffice
Firefox4.0
新的软件中心(带评论、试用等新鲜功能)
新布局(包括面板、Unity Launcher等)
新的安装管理器
全局菜单
你可以查看下面视频了解一些新功能:

2.Ubuntu11.04下载地址:
Ubuntu11.04正式版将会最先出现在其官方FTP上,地址如下:
Ubuntu11.04原版正式版下载地址:http://releases.ubuntu.com/
Ubuntu11.04中文版正式版下载地址:http://china-images.ubuntu.com/
虽然会先出现在FTP上,但不建议大家去那里下载,原因是那个下载地址是为了方便全球各个镜像的同步化。
UbuntuSoft将会在第一时间提供网盘的下载地址。
3.Ubuntu11.04率先体验:
你可以现在下载一个daily-live版本来安装,因为距离发布时间很短,所以一般情况下都会不有太大的区别,安装完之后在发布那天更新一下系统即可。
4.升级系统到Ubuntu11.04:
建议你不要那么做,因为Ubuntu不能平滑升级,所以升级后会出现各种错误。但是如果你坚持要升级系统的话,你可以看这里。

5.Ubuntu11.04使用技巧:
-若非3D驱动环境,可切换成Unity-2D,详情及教程看这里,Unity-2D配置方法看这里

-关于Unity Launcher(启动器面板)的使用:
添加Banshee播放器的管理菜单
在Unity Launcher中显示Pidgin的未读信息数
Unity Launcher使用教程
-Unity的快捷键列表,文字版看这里,图片版到这里下载

-Unity的配置,正常版看这里,2D版看这里

-解决系统托盘的问题,需要配置一下白名单,教程看这里
6.Ubuntu11.04更新源:
163源

deb http://mirrors.163.com/ubuntu/ natty main restricted
deb-src http://mirrors.163.com/ubuntu/ natty main restricted
deb http://mirrors.163.com/ubuntu/ natty-updates main restricted
deb-src http://mirrors.163.com/ubuntu/ natty-updates main restricted
deb http://mirrors.163.com/ubuntu/ natty universe
deb-src http://mirrors.163.com/ubuntu/ natty universe
deb http://mirrors.163.com/ubuntu/ natty-updates universe
deb-src http://mirrors.163.com/ubuntu/ natty-updates universe
deb http://mirrors.163.com/ubuntu/ natty multiverse
deb-src http://mirrors.163.com/ubuntu/ natty multiverse
deb http://mirrors.163.com/ubuntu/ natty-updates multiverse
deb-src http://mirrors.163.com/ubuntu/ natty-updates multiverse
deb http://mirrors.163.com/ubuntu/ natty-security main restricted
deb-src http://mirrors.163.com/ubuntu/ natty-security main restricted
deb http://mirrors.163.com/ubuntu/ natty-security universe
deb-src http://mirrors.163.com/ubuntu/ natty-security universe
deb http://mirrors.163.com/ubuntu/ natty-security multiverse
deb-src http://mirrors.163.com/ubuntu/ natty-security multiverse
deb http://archive.canonical.com/ubuntu natty partner
deb-src http://archive.canonical.com/ubuntu natty partner
deb http://extras.ubuntu.com/ubuntu natty main
deb-src http://extras.ubuntu.com/ubuntu natty main

sohu源

deb http://mirrors.sohu.com/ubuntu/ natty main restricted
deb-src http://mirrors.sohu.com/ubuntu/ natty main restricted
deb http://mirrors.sohu.com/ubuntu/ natty-updates main restricted
deb-src http://mirrors.sohu.com/ubuntu/ natty-updates main restricted
deb http://mirrors.sohu.com/ubuntu/ natty universe
deb-src http://mirrors.sohu.com/ubuntu/ natty universe
deb http://mirrors.sohu.com/ubuntu/ natty-updates universe
deb-src http://mirrors.sohu.com/ubuntu/ natty-updates universe
deb http://mirrors.sohu.com/ubuntu/ natty multiverse
deb-src http://mirrors.sohu.com/ubuntu/ natty multiverse
deb http://mirrors.sohu.com/ubuntu/ natty-updates multiverse
deb-src http://mirrors.sohu.com/ubuntu/ natty-updates multiverse
deb http://mirrors.sohu.com/ubuntu/ natty-security main restricted
deb-src http://mirrors.sohu.com/ubuntu/ natty-security main restricted
deb http://mirrors.sohu.com/ubuntu/ natty-security universe
deb-src http://mirrors.sohu.com/ubuntu/ natty-security universe
deb http://mirrors.sohu.com/ubuntu/ natty-security multiverse
deb-src http://mirrors.sohu.com/ubuntu/ natty-security multiverse
deb http://archive.canonical.com/ubuntu natty partner
deb-src http://archive.canonical.com/ubuntu natty partner
deb http://extras.ubuntu.com/ubuntu natty main
deb-src http://extras.ubuntu.com/ubuntu natty main

srt源

deb http://ubuntu.srt.cn/ubuntu/ natty main restricted
deb-src http://ubuntu.srt.cn/ubuntu/ natty main restricted
deb http://ubuntu.srt.cn/ubuntu/ natty-updates main restricted
deb-src http://ubuntu.srt.cn/ubuntu/ natty-updates main restricted
deb http://ubuntu.srt.cn/ubuntu/ natty universe
deb-src http://ubuntu.srt.cn/ubuntu/ natty universe
deb http://ubuntu.srt.cn/ubuntu/ natty-updates universe
deb-src http://ubuntu.srt.cn/ubuntu/ natty-updates universe
deb http://ubuntu.srt.cn/ubuntu/ natty multiverse
deb-src http://ubuntu.srt.cn/ubuntu/ natty multiverse
deb http://ubuntu.srt.cn/ubuntu/ natty-updates multiverse
deb-src http://ubuntu.srt.cn/ubuntu/ natty-updates multiverse
deb http://ubuntu.srt.cn/ubuntu/ natty-security main restricted
deb-src http://ubuntu.srt.cn/ubuntu/ natty-security main restricted
deb http://ubuntu.srt.cn/ubuntu/ natty-security universe
deb-src http://ubuntu.srt.cn/ubuntu/ natty-security universe
deb http://ubuntu.srt.cn/ubuntu/ natty-security multiverse
deb-src http://ubuntu.srt.cn/ubuntu/ natty-security multiverse
deb http://archive.canonical.com/ubuntu natty partner
deb-src http://archive.canonical.com/ubuntu natty partner
deb http://extras.ubuntu.com/ubuntu natty main
deb-src http://extras.ubuntu.com/ubuntu natty main

20. “That’s weird…” 很奇怪……
19. “It’s never done that before.” 以前没这样过的。
18. “It worked yesterday.” 昨天还好好的。
17. “How is that possible?” 那怎么可能?(怎么会出问题?)
16. “It must be a hardware problem.” 这一定是硬件问题。
15. “What did you type in wrong to get it to crash?” 你输入什么东西后才崩溃的?
14. “There is something funky in your data.” 你的数据有问题。
13. “I haven’t touched that module in weeks!” 我好几个礼拜没动那个程序了!
12. “You must have the wrong version.” 你一定在用错误的版本。
11. “It’s just some unlucky coincidence.” 这只是凑巧。
10. “I can’t test everything!” 我无法测试所有东西。(我的机器环境下,无法测试所有的可能情况。)
09. “THIS can’t be the source of THAT.” “这”不可能是问题的原因。
08. “It works, but it hasn’t been tested.” 程序能用,不过还没有测试。
07. “Somebody must have changed my code.” 一定有人改了我的代码。
06. “Did you check for a virus on your system?” 你的电脑扫描病毒了么?
05. “Even though it doesn’t work, how does it feel? 即便程序不行了,(你觉得)程序写得如何?
04. “You can’t use that version on your system.” 你不能在你系统上使用那个版本的程序。(程序版本和系统有冲突。)
03. “Why do you want to do it that way?” 你怎么会想着那样操作啊?
02. “Where were you when the program blew up?” 程序崩溃时,你在做什么呢?(做了哪些操作?)
01. “It works on my machine” 在我机器上好好的!!!(潜台词:怎么在你那就出问题了呢

win7命令行实现目录影射

huangdijia 发表于 2011-3-22 分类 Web服务器, 收藏夹 | 发表评论

大家都知道linux下命令ln的作用,就是将目录或文件影射到其他目录,最大的作用就是当某目录空间不足的时候,但又不想重装应用。
在win7下它不叫ln,叫mklink。
用法:

MKLINK [[/D] | [/H] | [/J]] Link Target

/D 创建目录符号链接。默认为文件
符号链接。
/H 创建硬链接,而不是符号链接。
/J 创建目录联接。
Link 指定新的符号链接名称。
Target 指定新链接引用的路径
(相对或绝对)。

例子:

mklink /D “C:\Users\hdj\AppData\Local\GoogleChrome\User Data\Default” “D:\ChromeCache”

以上例子就是将chrome的缓存目录影射到其他盘符。
温馨提示:win7下要以管理员身份执行该命令。