手机之家的架构分享

在上周日奇遇花园咖啡馆举办的 Beta 技术沙龙上,手机之家高春辉和他的战友们带来了他们网站技术架构与大家分享。

之前就手机之家的架构采访过老高,这次是来了图文并茂版了。希望过几天能有个视频的 :) 读了 PPT 之后,比较感兴趣的是关于 Cache 的处理:

…对数据库记录的缓存的访问做了一定的抽象处理,开发出了Cache 处理器。所有的数据访问都经过cache处理器。这样,系统代替程序员接管了缓存的存取访问。缓存的KEY和VALUE由系统处理,从而避免了冲突和混乱。Cache 处理器的引入减少了40%的数据访问层代码!最重要的是,我们采用了Namespace的方法使得缓存能自动清除了。

Arch_Cache_imobile.png

因为身在杭州,不能分身参加。不过第一时间从老高那里要来了 PPT。共享一下。

最后(最重要的是),手机之家还在招聘 PHP/Java 人手,有意者给老高发邮件: [email protected]

EOF


13 thoughts on “手机之家的架构分享

  1. xLight

    DAL好东西。
    如果能开源出来就爽了,
    或者老高是不是有意出售这部分代码?

    Reply
  2. jeffz.myopenid.com

    我对缓存处理器有些不解,它是怎么使用(没错,是使用,比如API如何)的呢?听上去是非常“自动化”的一个组件,但是例如,它怎么知道比如什么某个数据获取什么时候过期呢?例如:有的数据条目应该在修改时过期,这一点如何让缓存处理器得知的呢?

    Reply
  3. tosimple

    楼上的,我的理解是它的自动化应该是通过配置实现的。 根据业务的实际需求,来配置不同数据的更新策略。

    Reply
  4. jeffz.myopenid.com

    在我看来,配置就是代码的一部份啊,呵呵。
    还有就是,手机之家最后的演变,已经颇有LINQ的腔调了,也就是说,如果是用.NET平台实现,可以实现一个LINQ Provider,这个思想非常了得,值得借鉴。

    Reply
  5. jeffz.myopenid.com

    @手机之家的马甲
    DataAccessor能够获得数据库更新的通知?那么DataAccessor如何知道某次数据库更新是否要清除某个缓存呢?能否多谈一下这方面的话题呢?
    非常感谢。

    Reply
  6. 许超前

    to jeffz.myopenid.com:
    数据统一流过DA,此时的DA充当拦截器的作用,它可以对数据做任何处理。
    CRUD,DA自然知道。

    Reply
  7. jeffz.myopenid.com

    @许超前
    你说的我自然知道,但是这难道不需要为DA编写一个缓存控制逻辑吗?这个逻辑是和业务相关的,怎么能自动完成?单个对象可以缓存,那么批量查询的对象呢?一些聚合数据呢?一个U操作可能会清空n个缓存项,DA能“自动”作吗?

    Reply
  8. 许超前

    to jeffz.myopenid.com:
    嗯。这些疑问,在上次的beta会议上,也有人提及,我们也已经作了详细的说明和解释。
    分库切表智能化、缓存透明化是DAL的两大目标。说白了,就是想尽量自动化一些繁琐的细节,从而简化程序的编写。
    在PPT里,我们提到,缓存是不应该紧耦合于业务逻辑的。基于这个理念,我们想方设法把缓存的控制逻辑从业务逻辑当中抽象出来。
    这些逻辑现在是DAL的一部份。要想自动化、必须规则化,意思就是说,缓存的结构(特别是KEY值)必须是有规律的。
    对象的批量查询,大部份都可以转化为对单个对象的查询。PPT里也说了,就是[单个条目+Id List]的办法。
    在实践当中,我们发现,这样处理后,单个条目的命中率是相当高的,在80%~90%之间。
    Id List和聚合查询的缓存有一个容忍度的问题。我们认为这是提高网站承载能力的关键所在。起码是千万级流量网站可选的一个解决方案。
    至于您提到的1:n自动化问题,DAL目前已经解决了。接下来要做的就是改进、改进、再改进。
    感谢您的关注。

    Reply
  9. Syu(余沛)

    不知道老高的DAL怎么触发更新缓存。
    不过MYSQL的话,通过触发器+自定义函数接口(UDF),倒可以很方便的实现。我以前做过memcached+mysql的东西。
    不过老高这个要更高级。

    Reply
  10. matin

    @许超前
    你说的我自然知道,但是这难道不需要为DA编写一个缓存控制逻辑吗?这个逻辑是和业务相关的,怎么能自动完成?单个对象可以缓存,那么批量查询的对象呢?一些聚合数据呢?一个U操作可能会清空n个缓存项,DA能“自动”作吗?

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *