• (转)强烈推荐:著名社交网站LinkedIn的Java架构技术
    时间:2008-09-07   作者:佚名   出处:互联网

    强烈推荐:著名社交网站LinkedIn的Java架构技术

    在JavaOne 2008的会议上,著名社交网站LinkedIn的开发者做了2个关于LinkedIn

    网站的架构技术的演讲,目前这两个演讲的PPT已经可以下载了。下载地址如下:

    LinkedIn - A Professional Social Network Built with Java™ Technologies and Agile Practices
    LinkedIn Communication Architecture
    需要注册才可以下载,能下载PDF版本。

    可以看一下LinkedIn网站的基本情况:

    1。2千2百万用户
    2。每个月4百万独立用户访问
    3。每天4千万page view
    4。每天2百万搜索流量
    5。每天25万邀请发送
    6。每天1百万的回答提交
    7。每天2百万的email消息发送

    这是一个世界顶尖级别流量的网站了,看看LinkedIn的系统架构:

    * 操作系统:Solaris (running on Sun x86 platform and Sparc)
    * 应用服务器:Tomcat and Jetty as application servers
    * 数据库:Oracle and MySQL as DBs
    * 没有ORM,直接用JDBC No ORM (such as Hibernate); th** use straight JDBC
    * 用ActiveMQ在发送JMS. (It’s partitioned by type of messages. Backed by MySQL.)
    * 用lucene做搜索Lucene as a foundation for search
    * Spring做逻辑架构Spring as glue

    下面是随着流量增加,LinkedIn的架构演化:

    2003-2005
    1。一个整体的web程序,
    2。一个核心数据库,
    3。在Cloud中缓存所有network图,Cloud是用来做缓存的独立server。
    4。用lucene做搜索,也跑在Cloud中。

    2006年
    1。复制另外一个数据库,减少直接load核心数据库,另外一个server来管理非只读数据库的数据更新。
    2。把搜索从Cloud中移出来,单独一个server跑搜索
    3。增加Databus数据总线来更新数据,这是通过分布式更新的核心组件,任何组件都需要Databus

    2008年
    1。WebApp不再任何事情都它自己做,把业务逻辑分成很多部分,通过server群来做。WebApp仍然提供用户界面给用户,但是,通过server群来管理用户资料,小组等等。
    2。每个服务有自己的域数据库
    3。新的架构允许其他应用链接LinkedIn,比如增加的招聘和广告业务。

    The Cloud
    1。Cloud是整个架构最重要的部分,整个LinkedIn的网络图都缓存在Cloud里面
    2。Cloud大小:22M nodes, 120M edges
    3。需要12GB RAM
    4。在生产环境要跑40个实例
    5。从硬盘重建Cloud一个实例需要8个小时
    6。Cloud通过databus实时更新
    7。关闭时持久化到硬盘
    8。缓存通过C++实现,用JNI调用,LinkedIn选择C++而不是Java有两个原因:
    1)尽可能的减少RAM的使用
    2)垃圾收集暂停会杀死整个系统,LinkedIn用了最新的GC程序,也就是就是说java的的垃圾搜集性能不太好
    9。将所有东西放在缓存里面是一种限制,但是LinkedIn指出,分割业务图将更麻烦
    10。Sun提供了2TB的RAM

    Communication Architecture交流架构包括:

    Communication Service

    Communication Service是用来提供永久信息的,比如收件箱里面的消息和email
    1。整个系统通过JMS异步通讯
    2。客户端用JMS发送消息
    3。消息通过路径服务器来到达相应的邮箱或者直接放到email进程中
    4。消息发送:同时使用Pull主动寻求信息(如用户需要信息)和Push发送信息(如发email)
    5。使用Spring和LinkedIn专业Spring插件完成,使用HTTP-RPC

    Scaling Techniques
    1。通过功能来划分:发送,接受,文档等。
    2。通过类别来划分:用户信箱,访问者信箱等
    3。等级划分:用户ID等级,Email等级等
    4。所有的操作都是异步的。

    推荐阅读:LinkedIn架构图:99%都是用Java写的


    以下是网友回复:


    很不错,LinkedIn的思路正是我一直倡导分布式计算思路。

    特别是Cloud,是一个内存计算的典型特征,有三个特征:
    1. 从硬盘重建Cloud一个实例需要8个小时,很显然Clound不能随便当机,而且是不依赖持久化媒介如DB的。
    2。Cloud通过databus实时更新 这是技术难点。
    3。关闭时持久化到硬盘,7/24全年99%几乎无需关闭,一旦关闭,用户就不能使用了。

    从以上看出,Cloud是一个脱离DB技术的架构.

    技术难点是如何同步问题:

    Fenng 认为:如何保证数据在各个 RAM 块(也就是不同的计算服务器)中是同步的呢? 需要一个比较理想的数据总线(DataBus)机制。

    在不同分布式服务器的内存RAM中进行同步有两个方向:
    1. 在server之间拷贝RAM中数据。
    2. 使用DB,也就是Fenng 提到的Oracle的dataBus概念。

    目前Java架构中,都是倾向于使用第一种,内存之间直接刷新异动,应该比先回数据库,再从数据库触发多个服务器要快速得多。

    当然,具体怎么做不得而知,是核心秘密。大家猜猜而已。

    楼上有人提到:我们相信不使用昂贵的EJB就可以实现世界一流级的项目
    这对EJB有误解,首先EJB不昂贵,使用普通PC就能完成分布式计算;昂贵的是集中式DB模式,需要更大更强的主机;EJB使用很方便,只要加上@stateless就变成EJB了。

    EJB是一个通用的商务解决方案,是各个因素的综合折中考虑,尤其是事务安全和性能中和,而社区网站则侧重于高性能,事务安全可以忽视,因此EJB不一定适合社区网站,而且一个自己的网站要杰出,当然必须走手工定制分布式计算这条路,而不是选择通用的解决方案。

    OO + 分布式计算 = 软件架构的方向
    http://www.jdon.com/artichect/architecture.html

    EJB+IBatis这种做法合理吗?
    http://www.jdon.com/jivejdon/thread/34262.html

    网友留言/评论

    我要留言/评论