在上周日奇遇花园咖啡馆举办的 Beta 技术沙龙上,手机之家的高春辉和他的战友们带来了他们网站技术架构与大家分享。
之前就手机之家的架构采访过老高,这次是来了图文并茂版了。希望过几天能有个视频的 :) 读了 PPT 之后,比较感兴趣的是关于 Cache 的处理:
…对数据库记录的缓存的访问做了一定的抽象处理,开发出了Cache 处理器。所有的数据访问都经过cache处理器。这样,系统代替程序员接管了缓存的存取访问。缓存的KEY和VALUE由系统处理,从而避免了冲突和混乱。Cache 处理器的引入减少了40%的数据访问层代码!最重要的是,我们采用了Namespace的方法使得缓存能自动清除了。
因为身在杭州,不能分身参加。不过第一时间从老高那里要来了 PPT。共享一下。
手机之家新系统介绍及架构分享
View more presentations from Fenng Feng.
最后(最重要的是),手机之家还在招聘 PHP/Java 人手,有意者给老高发邮件: [email protected] 。
–EOF–
DAL好东西。
如果能开源出来就爽了,
或者老高是不是有意出售这部分代码?
我对缓存处理器有些不解,它是怎么使用(没错,是使用,比如API如何)的呢?听上去是非常“自动化”的一个组件,但是例如,它怎么知道比如什么某个数据获取什么时候过期呢?例如:有的数据条目应该在修改时过期,这一点如何让缓存处理器得知的呢?
楼上的,我的理解是它的自动化应该是通过配置实现的。 根据业务的实际需求,来配置不同数据的更新策略。
在我看来,配置就是代码的一部份啊,呵呵。
还有就是,手机之家最后的演变,已经颇有LINQ的腔调了,也就是说,如果是用.NET平台实现,可以实现一个LINQ Provider,这个思想非常了得,值得借鉴。
虽然我用的是.NET,但还是很有借鉴意义的
不需要配置, 所有的数据库变更是通过DataAccessor实现的, DataAccessor会触发缓存的更新操作.
@手机之家的马甲
DataAccessor能够获得数据库更新的通知?那么DataAccessor如何知道某次数据库更新是否要清除某个缓存呢?能否多谈一下这方面的话题呢?
非常感谢。
to jeffz.myopenid.com:
数据统一流过DA,此时的DA充当拦截器的作用,它可以对数据做任何处理。
CRUD,DA自然知道。
@许超前
你说的我自然知道,但是这难道不需要为DA编写一个缓存控制逻辑吗?这个逻辑是和业务相关的,怎么能自动完成?单个对象可以缓存,那么批量查询的对象呢?一些聚合数据呢?一个U操作可能会清空n个缓存项,DA能“自动”作吗?
to jeffz.myopenid.com:
嗯。这些疑问,在上次的beta会议上,也有人提及,我们也已经作了详细的说明和解释。
分库切表智能化、缓存透明化是DAL的两大目标。说白了,就是想尽量自动化一些繁琐的细节,从而简化程序的编写。
在PPT里,我们提到,缓存是不应该紧耦合于业务逻辑的。基于这个理念,我们想方设法把缓存的控制逻辑从业务逻辑当中抽象出来。
这些逻辑现在是DAL的一部份。要想自动化、必须规则化,意思就是说,缓存的结构(特别是KEY值)必须是有规律的。
对象的批量查询,大部份都可以转化为对单个对象的查询。PPT里也说了,就是[单个条目+Id List]的办法。
在实践当中,我们发现,这样处理后,单个条目的命中率是相当高的,在80%~90%之间。
Id List和聚合查询的缓存有一个容忍度的问题。我们认为这是提高网站承载能力的关键所在。起码是千万级流量网站可选的一个解决方案。
至于您提到的1:n自动化问题,DAL目前已经解决了。接下来要做的就是改进、改进、再改进。
感谢您的关注。
不知道老高的DAL怎么触发更新缓存。
不过MYSQL的话,通过触发器+自定义函数接口(UDF),倒可以很方便的实现。我以前做过memcached+mysql的东西。
不过老高这个要更高级。
很有借鉴意义,受益匪浅
@许超前
你说的我自然知道,但是这难道不需要为DA编写一个缓存控制逻辑吗?这个逻辑是和业务相关的,怎么能自动完成?单个对象可以缓存,那么批量查询的对象呢?一些聚合数据呢?一个U操作可能会清空n个缓存项,DA能“自动”作吗?