会员登录 | 会员注册 | 意见建议 | 网站地图

站长资源综合门户

当前位置:首页 > 新闻资讯 > 淘宝网手艺成长回顾(六):Java时代:创作发现手艺-Tair

淘宝网手艺成长回顾(六):Java时代:创作发现手艺-Tair

时间:2012-06-04 23:56:52   作者:   来源:   点击:

虽然招财进宝失败了,但这个项目中对手艺的探索加倍深入,这里面用到了用户行为追踪、Ajax 等。其中有一个手艺的细节很是经典,淘宝商品详情页面每天的流量在 10 亿以上,里面的内容都是放在缓存里的,做招财进宝的时候,我们要给卖家显示他的商品被阅读的次数(见下图),这个数字必须实时更新,而用缓存的话一般都是异步更新的。于是商品内外面增加了这样一个字段,每增加一个 PV 这个字段就要更新一次。发布上去一个小时数据库就挂失落了,撑不住这么高的 update。数据库撑不住怎么办?一般的缓存策略是不支持实时更新的,这时候多隆年夜神想了个别例,在 apache 上面写了一个模块,这个数字底子不颠末下层的 web 容器(只颠末 apache)就写入一个集中式的缓存区了,这个缓存区的数据再异步更新到数据库。这就是我前面提到的,我们整个商品详情的页面都在缓存中了,把缓存用到了极致。

(这个图真不是告白,亲)

那么接下来,我们就说说缓存的手艺吧。

淘宝在很早就起头使用缓存的手艺了,在 2004 年的时候,我们使用一个叫做 ESI(Edge SideIncludes)的缓存。在决定采取 ESI 之前,多隆试用了很多 java 的 cache,但都比较重,后来用了 oracle webcache,也常常挂失落,oracle webcache 也支持 ESI,多隆由此发现了 ESI 这个好东东。ESI 是一种数据缓冲/缓存办事器,它提供将 Web 网页的部分(这里指页面的片段)进行缓冲/缓存的手艺及办事。由 Oracle 公司和 AkamaiTechnologies 公司制定规格,Akamai 公司提供对应的信息传送的办事。以往的数据缓冲办事器和信息传送办事以“页”为单位制作,复制到数据缓冲办事器中,措置静态页面很有效。但在面对动态内容的时候,就很难取得高效率。在 ESI 中是部分的缓冲网页,使用基于 XML 的标识表记标帜语言,指定想要缓冲的页面部分。由此,页面内分为动态地变动的部分和静态的不变动的部分,只将静态的部分有效地发送到办事器中。淘宝网的数据虽然年夜部分都是动态产生的,但页面中的静态片段也有很多,例如页面的头、尾,商品详情页面的卖家信息等(如下图右侧),这些最早都是从 ESI 缓存中读取的。

ESI 解决了页面端静态片段的缓存,智慧的读者可能马上就想到了,在后真个那些数据能不克不及使用缓存?显然也是可以的,并且是必须的。例如一个年夜卖家的商品和店铺,一天的阅读量多是几百万,一个小卖家的可能只有几个,那这个年夜卖家的用户信息要是每次都去数据库里面取,显然不划算,要是把这个信息放在内存里面,每次都从内存里取,性能要好很多。这种应用场景,就是 memcached 这种 Key-Velue 缓存的用武之地。只惋惜在淘宝急需要 memcached 的时候,它还没有崭露头角(它 2003.6 呈现的,但近几年才火爆起来,那时没发现它)。我们的架构师多隆年夜神再一次出手了,他写了一个缓存系统,叫 TBstore,这是一个散布式的基于 BerkeleyDB 的 cache 系统,推出之后在 Alibaba 团体内部使用很是普遍,特别是对淘宝,tbstore 上应用了 ESI(就是上面说过的那个 ESI)、checkcode(验证码)、description(前文说过的商品详情)、story(心情故事,商品信息里面的一个年夜字段,长度仅次于商品详情)、用户信息等等内容。

TBstore 的散布式算法实现:按照保存的 key,对 key 进行 hash 算法,取得 hash 值,再对 hash 值与总 Cache 办事器数据取模。然后按照取模后的值,找到办事器列表中下标为此值 Cache 办事器。由 javaclient api 封装实现,应用无需关心;这点和 memecached 的实现方案完全一致。

TBstore 有一个优点,这也是它的弱点,它的存储是基于 Berkeley DB 的,而 BerkeleyDB 在数据量逾越内存的时候,就要往磁盘上写数据了,所以说它是可以做持久化存储的。可是一旦往磁盘写数据,作为缓存的性能就年夜幅度下降。

这时又有一个项目,推动了淘宝在缓存方面的手艺提升。在 2007 年,我们把淘宝的用户信息自力出来,形成一个中心系统 UIC(userinformationcenter),因为淘宝所有的功能都要依赖于用户信息,所以这个模块必须伶仃拿出来,不然以后系统无法扩大了。把 UIC 拿出来以后,应用系统拜候 UIC,UIC 拜候数据库取得用户信息,粗粗算一下,每天要取几十亿的用户信息,直接查询数据库的话,显然数据库要解体的,这里必须要用缓存。于是多隆为 UIC 专门写了一个缓存系统,取名叫做 tdbm。tdbm 抛弃了 BerkeleyDB 的持久功能,数据全部存放在内存中。到 2009 年,多隆又参考了 memcached 的内存布局,改进了 tdbm 的集群散布体例,在内存操纵率和吞吐量方面又做了年夜幅提升,推出了 tdbm2.0 系统。

分享到:

网友评论

热门新闻资讯