[转]分布式缓存问题解决

[不指定 2008/08/11 23:30 | by ipaddr ]
缓存产品目标锁定在支持分布式应用的3种开源产品身上:JbossCache、OSCache和SwarmCache,JbossCache采用数据复制策略,OSCache又大又全,重点在页面缓存上,SwarmCache虽然很小巧,但分布式是核心,采用的是失效机制。最终采用SwarmCache实现。全面了解一种开源产品,首要的是看它的文档了,随后的日志我会贴出他的Tutorial。

Hibernate3对各种缓存的提供了很好的支持,细看它的文档才发现它支持的额外3种缓存产品正好是上面列出的,EHCache是Hibernate自身的缓存实现,不支持分布式应用。这下子倒免去了写CacheProvider的工作。下载swarmcache-1.0RC2a二进制和源码,将jgroups-all.jar和swarmcache-1.0RC2.jar拷贝至 \WEB-INF\lib\下,

配置Hibernate.cfg.xml将provider_class换为指定的Provider
<property name="hibernate.cache.provider_class">net.sf.hibernate.cache.SwarmCacheProvider</property>

打开查询缓存的支持
<property name="hibernate.cache.use_query_cache">true</property>

配置

<class-cache class="com.foo.YourCacheEntity" usage="nonstrict-read-write" region="cache.region"/>
关于最后一行配置的说明,因为SwarmCache不支持严格的读写缓存,所以要配置成nonstrict-read-write,各个缓存之间需要用名字隔离,如cache.region。

重新启动Tomcat后,SwarmCache中的组播服务启动:

-------------------------------------------------------
GMS: address is pysh:1967
-------------------------------------------------------

如果另外一个也作了同样配置的web启动,他们之间通过组播消息可以相互通知:

2006-09-19 17:49:06 INFO JavaGroupsCommunicator:76 - A host has joined the cache notification bus: pysh:1967

测试应用:

在机器A上,通过Hibernate对Entity做了修改,机器B得知缓存Entity已经无效,机器B会remove此缓存,重新从数据库里加载。

Flickr Architecture

[不指定 2008/08/06 14:32 | by ipaddr ]

http://highscalability.com/flickr-architecture

Flickr is both my favorite bird and the web's leading photo sharing site. Flickr has an amazing challenge, they must handle a vast sea of ever expanding new content, ever increasing legions of users, and a constant stream of new features, all while providing excellent performance. How do they do it?

Site: http://www.flickr.com/

最近应聘系统架构师,面试回答一些问题,加上之前做的一些功课,搜索到一些文章,感觉有必要总结一下,到底如何做一个成功的系统架构师呢?
首先,何谓系统架构师?
IBM工程师的说明是:
  架构师的主要责任是提供开发人员和项目经理之间的共用沟通媒体。他们负责让业务规则及需求与工程实践及限制相适应,以确保成功
中文Wiki上的说明是:
  系统架构师负责设计系统整体架构,从需求到设计的每个细节都要考虑到,把握整个项目,使设计的项目尽量效率高,开发容易,维护方便,升级简单
这两个解释,加起来基本说明了系统架构师的定义。

JAVA系统架构师应该看的几本书
Thinking in Java
Effective Java
UML基础、案例与应用
UML入门提高
软件工匠
设计模式——可复用面向对象软件的基础
重构-改善既有代码的设计
敏捷软件开发-原则、模式、实践
企业应用架构模式
Expert One-on-One J2EE Development without EJB

软件工程——实践者的研究方法
软件领导--成功开发软件的指导准则
后面的两本书,其实已经有点属于项目经理的范畴了,不过还不是很深入,看看对做成功的系统架构师是很有好处。
企业应用的系统架构师应该关注的几个方面
数据持久层的设计
在Spring和Hibernate,ibatis出来以前,几乎每家公司都有自己的一套方法和架构,而架构师的50%的精力也会集中到这上面,EJB只是增加架构师的负担。在Spring出来以后,基本上,大多数的架构师都从重复设计这个轮子的无用功中解脱出来了。 Rod的轮子太好用了,基本上,大家只要套上去就行了,或者,剩下最重要的事情,是选择一个合适的数据库连接池的开源项目吧
MVC架构的具体设计
MVC只是个概要的概念,具体如何实现的具体技术很多,根据项目设计最恰当的架构
大并发性访问
使用缓存,在数据量达到一定程度时,使用集群技术,优先考虑利用服务器的集群,其次是硬件集群,最后才是应用本身加入集群功能
超大数据量返回结果
尽量使用分页,优化SQL语句,循环处理数据时尽可能共用对象,只保留关键数据,及时释放内存占用
超大文件的读取和生成
尽可能快的读取大文件,并进行分析。写入大文件时,如何及时释放内存。学会适当利用操作系统的命令行资源来更快完成任务。

多线程的应用和管理
线程池的管理和监控,线程的启动(包括定时启动),结束,回收,线程资源的释放

用户界面可用性设计
平衡速度和可用性,恰当的使用异步和同步技术,展现关键数据为重点
分布式的数据交流和集成
选择恰当的数据交互方式,从最泛滥低效的Web Service到最实用的文件共享
群集系统的管理
如何确保缓存的同步?如何确保对象唯一性?如何保证各台机器的同步?
是否采用EJB?如何利用J2EE的特性(例如JNDI)
复杂的业务规则
规则引擎和工作流引擎场景和应用

其实,作为一个真正的系统架构师,不应该局限于企业应用的系统,这种系统往往有数据库的局限性,有时候,应该考虑是否可以横向跨越,直接对其它系统做一些架构考虑,在没有丰富的实战经验的前提下,而只是看了其它人的系统和代码,就能够给出有效的设计指导。
例如对于一个下载软件,可以有如下考虑:
1. 未明和非法url的检验,已经下载失败的容许,信息记录
2. 多线程下载一个文件,文件的切分和拼合,部分切片丢失的拼合可能性
3. 下载线程管理
4. 服务器或者P2P的机器之间的通讯协议
5. 速度监控和限制
6. 下载进度的监控和显示
作为一个在线播放软件,可以做如下考虑
1. 播放速度的保证
   机器的问题基本不存在了,关键是网络问题。如何在检测网络速度,根据影片的质量,并缓冲足够多的内容,保证播放一直尽可能顺利的完成。
2. 播放质量的保证
   如何利用DirectX等技术,最快的进行渲染,是自己写底层,还是利用已有的API
由于没做过类似的项目,可以写的东西还是少很多了。
系统架构师应该有的素质:
1、 实际的编程经验
  最少2年吧,多了就不说了,其实从大学就开始钻研的话,
2、 书面表达能力和口头交流能力
   综合利用架构图,UML图,文字和代码片断,表达自己设计思想,至于是Word还是ppt,应该通吃
  在开发人员中发现架构师的最有价值标准是有效的沟通。您需要技术娴熟、经验丰富的开发人员,这样的人员需要有就项目中的业务相关问题进行沟通的经历。架构师经常必须对理解方面的差距进行预计,然后才能有所贡献。他们必须愿意克服困难来确保技术和业务观点的融合。他们并不必对意见交换工作进行计划和协调;这仍然主要是项目经理的工作。他们的任务是确定表述系统设计时的最佳工具和构件,以促进有效的意见交换。他们必须能够判断当前方法显得不足而需要采用新方法的情况。写作技能也非常重要,还需要具有制作草图的技能或使用制图软件的能力。
3、 自觉主动;积极解决设计问题
  架构师的日常工作目标经常并不明确。很多开发人员直接参考功能规范来列出任务清单。架构师通常则是向这些开发人员提供所需结构的人员,以便尽可能提高工作效率。好的候选者不仅进行沟通方面的工作,而且也会预计各种设计问题并加以解决——通常在没有任何具体指示的情况下自觉进行。无论所分配的职责如何,积极参与项目的开发人员都有机会从一起工作的人员中脱颖而出。
4、 抽象思维能力和总结能力
  架构师,顾名思义,在系统未搭建好之前,就要能够有一个草图在心。而如果是对现有系统的改造,那么能在看过系统的文档(如果有的话)和代码后,就能总结出系统的架构特点。
  架构师必须能够理解表述模糊的概念并将其变成相关各方能够理解的项目构件。他们必须能够理解抽象概念,并以具体的语言对其进行沟通。开发人员中好的候选者经常要求或自己主动解释开发生命周期中容易混淆的问题。他们能迅速评估各种想法并将其纳入后续工作的操作建议中。
  开发人员经常具有很强的数学能力,而好的架构师则倾向于表现出更强的口头表达能力。管理人员经常说开发人员具有“工程意识”,而这是一个用于评估架构师的非常有意义的方面。架构师应该具有很强的解决技术问题的能力,但还必须能够准确获知更为全面的人员如何与技术交互的信息。这要求具有某种形式的抽象思维(而不再是代码的细节),这种思维能力可能较难形成。
5、 全面的技术资讯吸收能力和选择鉴别能力
  作为开发人员出身,对于某一个具体问题的研究能力(虽然很多人总结为google能力),已经相当具备了。但是对技术资讯的全面接受和选择性深入了解能力,并且做出正确的判断,那些技术无非是厂家的噱头,而那些技术是真正可以用到项目,提高项目质量的好技术,这种能力确实至关重要的。

Java:抽象类和接口的区别

[不指定 2008/08/05 11:45 | by ipaddr ]
在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于abstract class和interface的选择显得比较随意。其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对于问题领域本质的理解、对于设计意图的理解是否正确、合理。本文将对它们之间的区别进行一番剖析,试图给开发者提供一个在二者之间进行选择的依据。

Glow:非常漂亮的GNOME主题(ZT)

[不指定 2008/08/04 10:31 | by ipaddr ]

在上篇日志:Galaxium Messenger中,文中截图的主题风格的讨论差点盖过了Galaxium本身这个客户端。

这是我最近使用GNOME桌面主题:Glow,确实非常漂亮。因为其自带了很多款配色,在统一的Widget样式上,你可以找到自己喜欢的配色。

应朋友要求,所以写篇有关主题的安装与配置。


—–

这款主题名叫:Glow,来自GNOME-Look.org,与一般的GTK+2的主题不同,它需要另外一个系统并没有自带的GTK+引擎才能使用。因此在安装主题前,需要安装这个名为Aurora的GTK+引擎。

Aurora Gtk Engine可以在这里下载到:

http://www.gnome-look.org/content/show.php/Aurora+Gtk+Engine?content=56438

下载的压缩包里面有两个文件,解压后,其中aurora-1.4.tar.gz是引擎相关的,gtkrc_themes.tar.bz2是引擎自带的三个主题,你可以自己试用之。

将其中的aurora-1.4.tar.gz解包,假设解压至主目录~/aurora-1.4。

接下来我们要编译aurora了,确认你已经安装好了相关开发包,如果没有的话,请打开终端执行sudo apt-get install gnome-core-devel

准备好以后,就开始编译吧!打开你的终端,然后执行下面的指令:

cd ~/aurora-1.4
./configure --prefix=/usr --enable-animation(其中enable-animation这个参数用于启用动画效果,aurora引擎具备一些动画效果)
make
sudo make install(或者你可以用sudo checkinstall来打包)

安装完成后,就可以去下载Glow主题了。

访问:http://www.gnome-look.org/content/show.php/Glow?content=85996

下载其中的GTK2 Theme(如果你是xfce桌面,选择Xfwm4),这里强烈建议安装Emerald边框,这样才能达到一致的效果。

安装Glow主题和Emerald的边框不必多言,到“系统”->“首选择”->“外观”即可安装。至于Emerald,首先保证你sudo apt-get install emerald,然后打开Emerald Theme Manager即可安装。

安装后,根据你自己喜欢的配色,选择喜爱的Glow吧!其中我选择的是Glow Water,即截图中显示的主题。还有各种亮色、暗色、绿色、红色等配色,一定有你喜欢的。

至于图标主题的话,我使用的是Linux下普遍的Tango主题,大家也可以根据自己的喜好使用。


如何使用Java Singleton模式

[不指定 2008/08/02 16:14 | by ipaddr ]

Java Singleton模式属于管理实例化过程的设计模式家族。Singleton是一个无法实例化的对象。这种设计模式暗示,在任何时候,只能由JVM创建一个Singleton(对象)实例。
如果实例不存在,你通过创建类的新实例的方法建立一个类来执行这个模式;如果存在类的一个实例,就只会返回那个对象的一个引用。

Singleton模式的运行机制

以下是Singleton模式的一个典型例子:

public class Singleton {

        private final static Singleton INSTANCE = new Singleton(); 

    // Private constructor suppresses generation of

    // a (public) default constructor

    private Singleton() {} 

    public static Singleton getInstance() {

      return INSTANCE;

    }

 }

标准的Singleton模式并不使用直接静态变量实例化进行声明——它实例化构造器中的一个静态实例变量,而不查看它是否已经存在:

public class ClassicSingleton {

    private static ClassicSingleton INSTANCE = null;

    private ClassicSingleton() {

       // Exists only to defeat instantiation.

    }

    public static ClassicSingleton getInstance() {

       if(INSTANCE == null) {

          INSTANCE = new ClassicSingleton();

       }

       return INSTANCE;

    }

 }

Singleton类的默认构造器被设为私有,这样做可防止其它类使用new关键字直接将对象实例化。对返回Singleton对象的实例方法应用一个静态修饰符,这使得它成为一个类级方法,不创建对象即可进行访问。

何时需要使用Singleton

当你只需要一个类实例时,Singleton才真正有用;如果类拥有几个实例,使用Singleton就不再适用。

设计系统时,你通常希望控制对象的用法,防止用户(包括你自己)复制对象或建立新实例。例如,你可以使用它创建一个连接池。每次程序需要往数据库中写入内容时才创建一个新连接的做法并不明智;相反,一个或一组已经在池中的连接就可以使用Singleton模式实例化。

Singleton模式常常和工厂方法模式一同使用,创建一个系统级资源,使用这个资源的代码并不知道它的特殊类型。抽象窗口工具包(AWT)就是组合使用这两个模式的典型例子。在GUI应用程序中,对每个应用程序实例,你一般只需要一个图形元素的实例,如打印(Print)对话框或OK按钮。

注意潜在的问题

虽然Singleton设计模式是最简单的设计模式之一,但它也存在一些缺陷。

多线程应用程序中的构造问题

在多线程应用程序中,你必须仔细构造Singleton模式。当Singleton不存在时,如果两个线程即将同时执行创建方法,这两个线程必须检查Singleton实例,但只有一个线程应当创建新对象。这个问题的典型解决办法就是对类使用相互排斥,指出对象正在被实例化。这是Singleton的一个线程安全的版本:

public class Singleton

 {

   // Private constructor suppresses generation

   //  of a (public) default constructor

   private Singleton() {} 

   private static class SingletonHolder

   {

     private final static Singleton INSTANCE = new Singleton();

   } 

   public static Singleton getInstance()

   {

     return SingletonHolder.INSTANCE;

   }

 }

另一个解决办法是在getInstance()方法声明中添加synchronized关键字:

  public static synchronized Singleton getInstance()

提前考虑克隆预防

你仍然可以使用对象的clone()方法克隆对象,建立一个Singleton对象。要禁用这一功能,你需要禁用对象的克隆方法,这产生一个CloneNotSupportedException例外。

      public Object clone() throws

CloneNotSupportedException {

         throw new CloneNotSupportedException();

}

考虑使singleton类位于最后

你可能希望将Singleton类放在最后,以避免Singleton的子类造成其它问题。

不要忘记垃圾收集

根据不同的执行,你的Singleton类和它的所有数据可能被当作垃圾收集。因此,在应用程序运行时,你必须保证存在一个Singleton类的实时引用。

结论

Singleton模块得到广泛地使用,并证实可用于软件设计。虽然这个模式并非Java专有,但它已成为Java编程的一个典型应用。尽管这个模式相当简单,但还是要记住我在本文中描述的Singleton模式的限制。

分页: 1/1 第一页 1 最后页 [ 显示模式: 摘要 | 列表 ]