欢迎光临

木子屋

标题: 淘宝客网站架构设计方案

作者: dnawo

日期: 2012-12-21 10:38 AM

分类: 淘宝网

内容: 案例一：无缓存实时架构
这是一个最简单的模型。用户在访问网站的时候，程序接受用户访问请求后直接通过API获取数据，再显示在网页上。
优点：
数据的实时获取
缺点：
1.网站页面加载的速度慢
2.网站访问量大的时候造成API次数超过限制，导致网站挂掉
3.淘宝API服务器发生故障或维护，导致网站挂掉
案例二: 文件缓存
这个案例中以文件的形式作为缓存，通过API取到数据序列化后并将序列化之后的数据存入文件中，一般以json的方式存储，也有的php程序中采用数组来存储。
优点：
淘宝API服务器发生故障或维护时，保证了网站的正常使用
缺点：
1.页面显示速度慢，主要是在用户访问页面的时候触发API请求的
2.网站访问量大的时候造成API次数超过限制，导致网站挂掉
案例三：使用memcached 作为缓存
这个方案中加入了缓存判断，程序首先从memcached取缓存中的数据，如果数据失效或者过期的话，即没有命中，那么程序就通过API去请求数据，取到数据后更新缓存，同时返回数据。如果数据存在且在有效期内的话，那么将直接返回缓存中的数据，这比用文件缓存速度快得多。硬盘快不过内存就是这个道理。

优点：
页面显示速度快，在API服务器正常的时候还能自动更新缓存数据
缺点：
1.缓存命中率的提高有难度，有过mm集群开发经验的同学应该感受到了
2.网站访问量大的时候造成API次数超过限制网站挂掉
3.服务器重启后缓存数据全部丢失（单机的情况下）
案例四：缓存+持久层结合架构
在案例三的基础上引入一个持久存储层MySQL，这样子可以避免重启，淘宝API服务器异常的情况。

优点：
有持久层存储，数据不丢失。 服务器重启，淘宝API服务器维护等各种伤不起都是浮云。
缺点：
1.用不多久，你会看着数据库中那高达几十GB的表而疯掉
2.网站访问量大的时候造成API次数超过限制，导致网站挂掉
3.数据迅速递增，查询相当缓慢
综合上面几个典型的案例，我们不难看出淘宝客网站在架构方面或多或少存在的问题:

1.数据实时性问题
2.读取数据的速度问题（网站页面显示速度）
3.缓存失效问题
4.API次数超过限制问题
在以上4个问题中，尤其以API次数超过限制问题为主，如何解决呢？看下图架构：

该架构中，引入开源nosql产品 redis。在数据每秒都发生变化的时候，关系性数据库mysql 等扛不住递增的海量新数据，而redis等可以，为什么？ Key! 大多的时候我们不用缓存淘宝的所有数据，一个好的key设计比什么都强。
在大多数应用中可以使用提交的参数md5的值为key。
获取key的方法详解：
如调用taobao.user.get接口，
所有入参有method=taobao.user.get，session=xxx，timestamp=xxxx,format=json,app_key=123456,v=2.0,sign=ERJLJGDSFSDFSD,sign_method=md5,fields=nick,sex,nick=淘宝帐号。
由于timestamp，sign这两个参数几乎每时每刻都在变化，而session每次授权都在变化，所以先排除session，timestamp，sign这三个参数。再按照首字母升级排列：
app_key=12345
fields=nick,sex
format=json
method=taobao.user.get
nick=淘宝账号
sign_method=md5
v=2.0
拼接字符串为：app_key12345fieldsnick,sexformatjsonmethodtaobao.user.getnick淘宝账号sign_methodmd5v2.0key=md5（app_key12345fieldsnick,sexformatjsonmethodtaobao.user.getnick淘宝账号sign_methodmd5v2.0）
可以使用这样的key为32位。新的数据只能刷新缓存值，增加的缓存能有多少。
taobao.taobaoke.items.get你能取多少页？按照不同的排序有多少？

具体的实现思路见上面流程图。其中网关实际上就是自己搭建一个读数据的接口，所有数据都从这里单点读取，由它来分发。网关的数据来源有：memcached缓存, Redis数据库。 在memcached缓存数据失效或者没有命中的时候通过API取数据，这里的API 不是直接去淘宝取数据，引入了自己设定的每分钟频率，比如100次/分钟，超过的时候直接去redis 取数据返回，当然这里的redis最好不要设置比较长的refresh time，一般5~10分钟就可以。
淘宝客网站的架构中缓存是非常重要的一个环节，控制不好就会带来各种困扰。关键点是在部署缓存和缓存key的设计上。
优点： 自己搭建数据来源网关， 内存缓存与永久存储层的合理搭配。
需要了解的知识：
1.Memcache合理部署
2.redis的基本功能及安装、维护。

建议：这里的memcached 部署一个缓存集群，在单点失效的情况下，数据不丢失，新机器恢复的时候自动从backup机器里恢复缓存。 Redis部署两台，一主一从。

+ 查看当前日志评论 (0)

登录

────────────

木子屋

PJBlog3 v3.2.9.518 Inside.

Processed In 0.975 ms

返回

标题: 淘宝客网站架构设计方案

你没有权限发表评论

────────────

木子屋

PJBlog3 v3.2.9.518 Inside.

Processed In 0.975 ms

返回

暂无评论

返回

────────────

木子屋

PJBlog3 v3.2.9.518 Inside.

Processed In 1.022 ms

返回