查看tomcat的錯(cuò)誤日志, 錯(cuò)誤原因是:javax.xml.transform.TransformerFactoryConfigurationError: Provider org.apache.xalan.processor.TransformerFactoryImpl not found
是由于jdk1.5 與 tomcat5.0之間的關(guān)于 TransformerFactoryImpl 類的沖突造成的。
用高版本的tomcat就可以解決。
2008年8月28日 #
2008年8月21日 #
2008年8月15日 #
---刪除用戶及其用戶下面的所有對(duì)象
drop user ca cascade;(刪除用戶下面的所有對(duì)象,注意關(guān)鍵字cascade)
---刪除表空間及其表空間里的所有內(nèi)容
drop tablespace ATMV INCLUDING CONTENTS;(刪除表空間)
drop tablespace INDX INCLUDING CONTENTS;(刪除表空間)
----創(chuàng)建表空間,指定數(shù)據(jù)文件,初始化100M 自增加50M
create tablespace ATMV datafile 'D:/oracle/product/10.2.0/oradata/orcl/ATMV.dat' size 100m autoextend on next 50m maxsize unlimited;
create tablespace INDX datafile 'D:/oracle/product/10.2.0/oradata/orcl/INDX.dat' size 100m autoextend on next 50m maxsize unlimited;
-----創(chuàng)建用戶,指定表空間
create user ca identified by atm123 default tablespace ATMV ;
---給用戶授權(quán)
grant dba to ca;
---運(yùn)行SQL文件
@D:\workspace\JATMP\ChannelAge.sql
2008年4月10日 #
我從開(kāi)始使用wtp來(lái)開(kāi)發(fā)web service開(kāi)始, 就在思考一個(gè)問(wèn)題:
那些java的對(duì)象是可以序列化為xml的, 并且可以從xml反序列化為java對(duì)象的?
那些對(duì)象與xml之間不能夠序列化和反序列化?
在開(kāi)發(fā)的時(shí)候應(yīng)該注意哪些問(wèn)題?
根據(jù)我的理解, 有如下幾種對(duì)象:
1)axis1.2內(nèi)在支持的幾種對(duì)象類型。
這幾種內(nèi)在支持的對(duì)象包括:
java基本類型 : int, float,,,,
基本類型包裝類 : Integer, Float, Long...
還有String, Date, Calendar, BigDecimal, BigInteger, List, Map.
凡是這些內(nèi)在支持的對(duì)象, 不管他們作為某個(gè)Service的input 還是 output, 我們?cè)诜?wù)端的axis1.2的WEB-INF/server-config.wsdd的該Service的定義中都不需要加入<beanMapping>或者是<typeMapping>的聲明。
2)簡(jiǎn)單的javabean對(duì)象類型。
對(duì)于簡(jiǎn)單的javabean對(duì)象, 比如對(duì)象中所有的field都是上面提到的基本類型。 axis1.2也提供了很好的支持。
比如:
public class JavaBeanInputService {
public void testJavaBeanInput(MyBean bean) {
......
}
}
由于MyBean是一個(gè)自定義的JavaBean對(duì)象, 所以在server-config.wsdd中就必須加上<beanMapping ...../>的聲明, 讓axis知道怎么把request中xml數(shù)據(jù)deserialize為MyBean對(duì)象, 又如何把MyBean對(duì)象serialize為xml數(shù)據(jù)作為response.用wtp自動(dòng)為JavaInputService生成的wsdl中, MyBean是作為一個(gè)complexType在wsdl中定義的。
3)復(fù)雜一點(diǎn)的JavaBean對(duì)象。
比如JavaBean對(duì)象中的一些field又是自定義的JavaBean, 這種情況下, wsdl中生成的complextype會(huì)有多個(gè), 而在wsdd定義的<beanMapping .../>也會(huì)有多個(gè), axis1.2支持起來(lái)都是易如反掌。
4)普通的非javabean對(duì)象。
對(duì)于一些不是javaBean的對(duì)象, wtp也會(huì)替你生成對(duì)應(yīng)的wsdl的ComplexType, 依據(jù)的是對(duì)象的getter方法。但是顯然這是不夠的。 比如說(shuō)有些對(duì)象的數(shù)據(jù)結(jié)構(gòu)比較復(fù)雜, 像java.util.HashMap(雖然這個(gè)已經(jīng)被axis內(nèi)在支持了。)這些對(duì)象如果想要把自己的狀態(tài)進(jìn)行serialization和deserialization, 就得自己編寫serializer和deserializer, 而且還必須保證wsdl中的該complexType的描述是正確的。
5)java中的List, Map問(wèn)題。
試想一下如果一個(gè)service的樣子是這樣子的。
public class ListService{
public List listTest(List list) {
for(Iterator iter = list.iterator(); iter.hasNext(); ) {
(MyBean)list.next();//進(jìn)行強(qiáng)轉(zhuǎn)。
}
}
}
用wtp為這個(gè)service生成的wsdl中把list映射為一個(gè)type為xsd:anyType的maxOccurs="unbound"的complexType。這樣的話客戶端生成的Stub中的接口中類似于:
public interface ListService{
public Object[] listTest(Object[] list) ;
}
如果Client端用戶傳遞的入口參數(shù)是String[],那么在服務(wù)端執(zhí)行的必然會(huì)發(fā)生轉(zhuǎn)型錯(cuò)誤。
因此,在webservice中把List, Map作為service的input, output的做法都是不可行的。至少在jdk1.4的版本中是這樣的。
一個(gè)更好的方法就是:
6)java中的數(shù)組。
上例中的ListService如果改造為下面這樣,基本上就沒(méi)有上面提到的問(wèn)題了。
public class ListService{
public MyBean[] listTest(MyBean[] list) {
...
}
}
這樣在wsdl中, MyBean被映射為一種ComplexType,MyBean[]為映射為ComplexType為映射為可以重復(fù)出現(xiàn)的MyBean類型。在客戶端的Stub的接口跟這個(gè)也是類似的。從而也成功地避免了List, Map中型別問(wèn)題。
要注意的是,在server-config.wsdd中需要配置<arrayMapping.../>
似乎List, Map的問(wèn)題用數(shù)組就可以解決了。事實(shí)上就是如此。但是還得注意的是:
javabean里邊也不能含有List. 如果MyBean跟其它某個(gè)對(duì)象是1:n的關(guān)系,那么也只能寫成數(shù)組的形式,而不能是List的形式。
7)特殊對(duì)象java.lang.Object
如果一個(gè)service寫成了下面的形式:
public class ObjectService{
public Object objInvoke(Object obj) {
...
}
}
想把它發(fā)布為web service, 那么幾乎是不太可能的。遇到obj類型,wsdl里邊只能定義為xsd:anyType類型,而這種類型如果給客戶端返回一個(gè)比如MyBean類型,那么必然會(huì)導(dǎo)致xml的serialization的失敗。結(jié)論就是:
web service中如果input 或者是output是java.lang.Object類型,那么將會(huì)導(dǎo)致嚴(yán)重問(wèn)題。
上面的幾種對(duì)象類型基本上能夠涵蓋將java class發(fā)布為web service時(shí)需要考慮的對(duì)象類型。可以看到開(kāi)發(fā)web service的時(shí)候,并不是所有的java都能夠輕而易舉地發(fā)布為web service, 一些復(fù)雜的類的對(duì)象類型,還有一些特殊的對(duì)象類型都是要考慮的。最后一個(gè)問(wèn)題是:子類是否也很容易的得到序列化和反序列化?
答案是肯定的。如下的Service:
public class PolymorphicService{
public MyBean objInvoke(MyBean obj) {
...
}
}
客戶端的Stub如下:
public class PolymorphicServiceStub{
public MyBean objInvoke(MyBean obj) {
...
}
}
如果在客戶端調(diào)用stub時(shí)傳入的不是MyBean類的對(duì)象,而是它的子類的一個(gè)對(duì)象,那么也可以被序列化而傳到服務(wù)端。同樣,如果服務(wù)端返回的對(duì)象是MyBean類的字類的一個(gè)對(duì)象,也可以成功的被序列化到客戶端。
2008年4月1日 #
public class TestService {
public String getStr(String input) {
return "Input string:"+input;
}
public Bean getBean(Bean bean) {
System.out.println("Bean Name:"+bean.getName());
bean.setName(bean.getName()+"OK");
Bean bb = new Bean();
bb.setName("haha");
return bb;
}
public Bean[] getBeans(String str) {
Bean[] rets = new Bean[2];
Bean bean1 = new Bean();
bean1.setName("name 1");
Bean bean2 = new Bean();
bean2.setName("name 2");
rets[0] = bean1;
rets[1] = bean2;
return rets;
}
}
Service service3 = new Service();
Call call3 = (Call) service3.createCall();
QName qn3 = new QName("http://bean.test.com","ArrayOf_Bean");
//注冊(cè) bean
call3.registerTypeMapping(Bean.class,qn,new BeanSerializerFactory(Bean.class, qn),new BeanDeserializerFactory(Bean.class, qn));
call3.registerTypeMapping(Bean[].class,qn3,new BeanSerializerFactory(Bean[].class, qn3),new BeanDeserializerFactory(Bean[].class, qn3));
call3.setTargetEndpointAddress(new java.net.URL(endpoint));
call3.setOperationName(new QName("getBeans"));
call3.addParameter("arg1", qn, ParameterMode.IN);
call3.setReturnType(qn,Bean.class);
java.util.ArrayList ret3 = (java.util.ArrayList) call3.invoke(new Object[] {"test--"});
System.out.println((ret3==null)?"null":(""+ret3.size()));
2008年1月3日 #
當(dāng)互聯(lián)網(wǎng)吵吵嚷嚷的進(jìn)入2.0時(shí)代,當(dāng)互聯(lián)網(wǎng)的技術(shù)不再是那么高不可攀,當(dāng)復(fù)制變成家常便飯,互聯(lián)網(wǎng)熱鬧起來(lái)了
myspace火了,中國(guó)冒出更多的myspace
youtube剛剛起來(lái),中國(guó)的視頻網(wǎng)站就遍地開(kāi)花
51拔地而起,中國(guó)出了無(wú)數(shù)的SNS
facebook則改變了中國(guó)站長(zhǎng)的抄襲方式,不再學(xué)chianren了,校內(nèi)火了
..........
當(dāng)抄襲變成習(xí)慣,我想說(shuō)的是,模仿,站長(zhǎng),你準(zhǔn)備好了嗎?
如果你打算做垃圾站,或者賺點(diǎn)廣告費(fèi)的網(wǎng)站,請(qǐng)不要點(diǎn)擊這篇文章,我從技術(shù)角度方面談?wù)刉EB2.0網(wǎng)站的模仿問(wèn)題。
當(dāng)投資和流量都不是問(wèn)題的時(shí)候,我想說(shuō)的是,您真的一帆風(fēng)順嗎?
拿SNS網(wǎng)站來(lái)說(shuō),當(dāng)匆匆上線的2.0,當(dāng)一筆筆投資砸進(jìn)去的時(shí)候,當(dāng)流量上去的時(shí)候,您的困惑在什么地方?
我做過(guò)多個(gè)2.0公司的技術(shù)顧問(wèn),簡(jiǎn)單的談?wù)?.0公司遇到的問(wèn)題(涉及隱私,我用A B C D代替),這里就不再贅述大家眾所周知的頁(yè)面靜態(tài)化,緩存和代碼安全等問(wèn)題了,有點(diǎn)技術(shù)的2.0公司的CTO都知道這些東西,我們談點(diǎn)發(fā)展之后的問(wèn)題
A公司
A公司做的是SNS網(wǎng)站,程序是兩個(gè)毛頭小伙子做的,目標(biāo)直指51,程序開(kāi)發(fā)是一帆風(fēng)順,功能也比51牛多了,推廣也是一帆風(fēng)順(A公司有自己獨(dú)到的推廣 方式。但是當(dāng)ALEXA到2W的時(shí)候問(wèn)題出來(lái)了,每天下午4點(diǎn)左右,網(wǎng)站速度慢的驚人,基本上打不開(kāi),公司三臺(tái)服務(wù)器CPU100%,讓人郁悶的是公司的 網(wǎng)絡(luò)配置方式,居然是雙WEB的集群,而單獨(dú)一臺(tái)DB數(shù)據(jù)庫(kù)。整個(gè)瓶頸在數(shù)據(jù)庫(kù),于是我建議做DB的集群,分析了一下數(shù)據(jù)結(jié)構(gòu),MD,典型的WEB程序員 的作品,沒(méi)有一點(diǎn)數(shù)據(jù)庫(kù)設(shè)計(jì)規(guī)范,功能實(shí)現(xiàn)是可以,如果要擴(kuò)展,不可能,集群基本上是不可能的,怎么辦?不能辦,于是,一個(gè)月的時(shí)間修改程序,數(shù)據(jù)結(jié)構(gòu)基 本上換了一遍 前期砸進(jìn)去的幾十萬(wàn)打了水飄,用戶走光了。
結(jié)論:WEB2.0前期設(shè)計(jì)的時(shí)候不應(yīng)該只考慮功能,應(yīng)該認(rèn)真考慮一下底層和數(shù)據(jù)結(jié)構(gòu)了。
B公司
B公司也是做的SNS網(wǎng)站,程序是3個(gè)人開(kāi)發(fā)的,CEO是某名牌大學(xué)的經(jīng)濟(jì)學(xué)碩士,有點(diǎn)知己網(wǎng)的味道,又有一些特色出來(lái),說(shuō)實(shí)話,公司的潛力不錯(cuò),CEO 有很強(qiáng)的運(yùn)作能力,感覺(jué)前景不錯(cuò)。系統(tǒng)架構(gòu)還行,但是---但是系統(tǒng)崩潰了,why?系統(tǒng)沒(méi)有考慮到用戶有個(gè)海量的說(shuō)法,文件也有個(gè)海量的說(shuō)法,用戶的相 冊(cè),圖片全部存貯在WEB服務(wù)器的一個(gè)分區(qū)上,每個(gè)用戶一個(gè)目錄,而打開(kāi)性能監(jiān)視器,磁盤的IO高的驚人,基本上無(wú)暇響應(yīng)。眾所周知,文件系統(tǒng)也是一個(gè)數(shù) 據(jù)庫(kù),單獨(dú)大文件無(wú)所謂,關(guān)鍵是整個(gè)是300多個(gè)G的零碎文件,大量的讀寫操作,系統(tǒng)崩潰,數(shù)據(jù)丟失,文件系統(tǒng)的一個(gè)鏈斷了,用戶數(shù)據(jù)全部丟失!!!這是 一個(gè)非常沉重的問(wèn)題,系統(tǒng)整整停了一個(gè)月來(lái)做數(shù)據(jù)恢復(fù)(單獨(dú)文件很容易,但是海量文件目前還沒(méi)有一個(gè)軟件能組織起來(lái)軟件架構(gòu))。解決方案:修改程序架構(gòu), 做分布式文件存貯(程序修改用了8天,但是文件轉(zhuǎn)移卻又用去了將近一個(gè)月),20萬(wàn)用戶損失殆盡
結(jié)論:WEB2.0前期的設(shè)計(jì)應(yīng)該有應(yīng)付海量存貯的考慮,整個(gè)涉及了程序架構(gòu)的修改,前期規(guī)劃不好的話基本上思路一條。
C公司
C公司是一個(gè)值得尊敬的公司,CEO技術(shù)出身,和比爾蓋茨一樣,大學(xué)未畢業(yè)出來(lái)做網(wǎng)絡(luò),01到03年做短信狠賺了一筆,后來(lái)做的小項(xiàng)目也小有所成,說(shuō)實(shí) 話,我很佩服。公司做的是校友方面,但是更偏重myspace風(fēng)格,注重個(gè)人主頁(yè),推廣方面也下了大手筆。系統(tǒng)崩潰的原因其實(shí)很簡(jiǎn)單,由于采用的是微軟的 SqlServer,而微軟直接就告訴了我們,SQLSERVER不支持集群,他們的數(shù)據(jù)庫(kù)超負(fù)載,100%就沒(méi)有下去過(guò),只能橫向增加配置,采用了4路 4核CPU系統(tǒng),但是系統(tǒng)還是崩潰了... 高互動(dòng)注定了高負(fù)載。解決方案: 現(xiàn)從基本入手,解決掉幾個(gè)程序耗能大戶,對(duì)數(shù)據(jù)庫(kù)采用橫向切割,將用戶每10萬(wàn)進(jìn)行分組,同時(shí)對(duì)數(shù)據(jù)庫(kù)系統(tǒng)進(jìn)行散列,將多個(gè)表垂直分割,同時(shí)進(jìn)行文件分組 ,解決問(wèn)題. 因?yàn)樾薷牧藬?shù)據(jù)結(jié)構(gòu),程序也基本上大動(dòng)了一下。 好在系統(tǒng)沒(méi)有出大錯(cuò),損失不算很大,不過(guò)對(duì)用戶體驗(yàn)造成了很壞的影響。
結(jié)論:WEB2.0前期設(shè)計(jì)應(yīng)該有良好的散列考慮,程序應(yīng)該能有配合的擴(kuò)充性,符合數(shù)據(jù)庫(kù)的擴(kuò)充
D公司
D公司是一個(gè)各個(gè)方面做的比較好的公司,做了CDN加速,圖片也獨(dú)立分出了N個(gè)服務(wù)器,數(shù)據(jù)庫(kù)不錯(cuò)的一個(gè),(CTO是個(gè)數(shù)據(jù)庫(kù)專家),系統(tǒng)崩潰的原因在于 WEB,按道理說(shuō)WEB很容易做集群的,但是發(fā)現(xiàn)集群并解決不掉問(wèn)題,他們的集群只允許做4臺(tái)的WEB集群,但是4臺(tái)都當(dāng)?shù)袅恕W屑?xì)分析,找到原因,我估 計(jì)整個(gè)也是大部分CTO最容易犯的一個(gè)錯(cuò)誤,或者說(shuō)他們根本就想不到的問(wèn)題,就是WEB上傳的問(wèn)題,上傳的時(shí)候由于時(shí)間的原因,線程是保持鏈接的,300 個(gè)線程就可以把一個(gè)WEB Server當(dāng)?shù)袅恕=鉀Q方案:這個(gè)最簡(jiǎn)單,把上傳和其他耗能大戶分離出獨(dú)立出來(lái)。程序改動(dòng)不是很大,但是之前半個(gè)月速度滿對(duì)用戶體驗(yàn)的損失也不可小視。
結(jié)論:沒(méi)有什么結(jié)論了,畢竟有海量訪問(wèn)經(jīng)驗(yàn)的CTO不多,也就是那幾個(gè)大站的。
總結(jié):不是潑冷水,模仿其實(shí)是很容易的,隨便找?guī)讉€(gè)WEB程序員就能做到,并且很簡(jiǎn)單,速度可能還很高效,因?yàn)閃EB2.0無(wú)非就是跟數(shù)據(jù)庫(kù)打交道,會(huì)操 作數(shù)據(jù)庫(kù)就會(huì)做。但是真正做大并不容易,因?yàn)槟軕?yīng)付海量訪問(wèn)的程序并不簡(jiǎn)單,現(xiàn)在的程序員都太自命不凡,其實(shí)真正有經(jīng)驗(yàn)的并不多,不要相信一個(gè)月薪5K- -10K的程序員能給你多大的驚喜,能應(yīng)付海量訪問(wèn)的程序員不是那個(gè)價(jià)格。如果您想做2.0,想做大,有幾個(gè)個(gè)建議:
一.找DBMS的專家設(shè)計(jì)好數(shù)據(jù)庫(kù),大部分程序員都不知道分區(qū)視圖,數(shù)據(jù)散列,數(shù)據(jù)組的概念
二.設(shè)計(jì)好程序架構(gòu)(這個(gè)其實(shí)不難,有個(gè)高人指導(dǎo)就行了),保持良好的擴(kuò)展性,成本考慮可以找兼職的系統(tǒng)架構(gòu)設(shè)計(jì)師做好系統(tǒng)架構(gòu),確定將來(lái)的發(fā)展瓶頸。
三.考慮好文件存貯的問(wèn)題。文件存貯的技術(shù)含量看起來(lái)很低,其實(shí)是很高的,可以考慮反向代理的方案。文件存貯出問(wèn)題了,站點(diǎn)基本上就完蛋了,不僅僅是RAID的問(wèn)題和存貯服務(wù)器的問(wèn)題,不過(guò)道理倒是一點(diǎn)就破的
四.中國(guó)國(guó)情考慮,這個(gè)最致命,需要考慮電信和網(wǎng)通的問(wèn)題,CDN并不能解決所有問(wèn)題。互動(dòng)性的東西并CDN并不是很有效。最關(guān)鍵的是,現(xiàn)有的雙線機(jī)房遇 到DDOS攻擊基本上都會(huì)當(dāng)?shù)簦蚝芎?jiǎn)單,雙線機(jī)房都是私人機(jī)房,本身就不會(huì)有太高的帶寬,隨便攻擊一下就可以D掉(順帶提一個(gè)笑話,我知道一個(gè)雙線機(jī) 房的老總總共1G的帶寬卻買了4G的金盾墻,很簡(jiǎn)單800M的攻擊就可以搞定)。
五.網(wǎng)絡(luò)延遲的問(wèn)題,這是分布式系統(tǒng)必須要考慮的,程序要能容忍0到100秒的數(shù)據(jù)延遲的功能,也就是同步的問(wèn)題。不要小看這幾十秒,問(wèn)題很大的,如果你 的站點(diǎn)有交互式功能,比如即時(shí)聊天,你可以想象一下是個(gè)什么結(jié)果。對(duì)于即時(shí)聊天的東西,可以用反向代理來(lái)解決(成本較高)。但是對(duì)于留言和評(píng)論的影響不 大,但是如果系統(tǒng)為了健壯做了緩存和靜態(tài)化的時(shí)候,這個(gè)東西可能就是災(zāi)難性的了。
六.分散你的程序,如果你沒(méi)有太多的資金構(gòu)筑動(dòng)輒百萬(wàn)的服務(wù)器,建議把功能分散開(kāi)來(lái),比如相冊(cè)一臺(tái)服務(wù)器,留言一臺(tái)服務(wù)器
七.看好你的程序員,如果沒(méi)有很好的激勵(lì)措施的話你的程序員很容易寫出敷衍性的代碼,而這個(gè)可能就是將來(lái)的大患,程序架構(gòu)定下來(lái)后要修改可能就要費(fèi)牛勁了。最好你的CTO能對(duì)你100%的衷心,100%的負(fù)責(zé)。
八.文件同步的問(wèn)題,這個(gè)問(wèn)題可能你覺(jué)得沒(méi)有必要,如果你看一下網(wǎng)通和電信的TTL就明白了,同步要支持續(xù)傳,并且不能是持續(xù)的,否則你的成本會(huì)高出N倍,不要期望能通過(guò)你的軟件實(shí)現(xiàn),交給你的程序員吧,把上面的話告訴他他就知道怎么做了。
九.最狠的一個(gè)問(wèn)題了,也是吃虧最大的問(wèn)題,不管您跟網(wǎng)警的關(guān)系多好,看好你的用戶,審核好你的東西,一被停機(jī)可能就致命,本人就吃過(guò)N次虧。
一個(gè)小型的網(wǎng)站,比如個(gè)人網(wǎng)站,可以使用最簡(jiǎn)單的html靜態(tài)頁(yè)面就實(shí)現(xiàn)了,配合一些圖片達(dá)到美化效果,所有的頁(yè)面均存放在一個(gè)目錄下,這樣的網(wǎng)站對(duì)系統(tǒng)架構(gòu)、性能的要求都很簡(jiǎn)單,隨著互聯(lián)網(wǎng)業(yè)務(wù)的不斷豐富,網(wǎng)站相關(guān)的技術(shù)經(jīng)過(guò)這些年的發(fā)展,已經(jīng)細(xì)分到很細(xì)的方方面面,尤其對(duì)于大型網(wǎng)站來(lái)說(shuō),所采用的技術(shù)更是涉及面非常廣,從硬件到軟件、編程語(yǔ)言、數(shù)據(jù)庫(kù)、WebServer、防火墻等各個(gè)領(lǐng)域都有了很高的要求,已經(jīng)不是原來(lái)簡(jiǎn)單的html靜態(tài)網(wǎng)站所能比擬的。
大型網(wǎng)站,比如門戶網(wǎng)站。在面對(duì)大量用戶訪問(wèn)、高并發(fā)請(qǐng)求方面,基本的解決方案集中在這樣幾個(gè)環(huán)節(jié):使用高性能的服務(wù)器、高性能的數(shù)據(jù)庫(kù)、高效率的編程語(yǔ)言、還有高性能的Web容器。但是除了這幾個(gè)方面,還沒(méi)法根本解決大型網(wǎng)站面臨的高負(fù)載和高并發(fā)問(wèn)題。
上面提供的幾個(gè)解決思路在一定程度上也意味著更大的投入,并且這樣的解決思路具備瓶頸,沒(méi)有很好的擴(kuò)展性,下面我從低成本、高性能和高擴(kuò)張性的角度來(lái)說(shuō)說(shuō)我的一些經(jīng)驗(yàn)。
1、HTML靜態(tài)化
其實(shí)大家都知道,效率最高、消耗最小的就是純靜態(tài)化的html頁(yè)面,所以我們盡可能使我們的網(wǎng)站上的頁(yè)面采用靜態(tài)頁(yè)面來(lái)實(shí)現(xiàn),這個(gè)最簡(jiǎn)單的方法其實(shí)也是最有效的方法。但是對(duì)于大量?jī)?nèi)容并且頻繁更新的網(wǎng)站,我們無(wú)法全部手動(dòng)去挨個(gè)實(shí)現(xiàn),于是出現(xiàn)了我們常見(jiàn)的信息發(fā)布系統(tǒng)CMS,像我們常訪問(wèn)的各個(gè)門戶站點(diǎn)的新聞?lì)l道,甚至他們的其他頻道,都是通過(guò)信息發(fā)布系統(tǒng)來(lái)管理和實(shí)現(xiàn)的,信息發(fā)布系統(tǒng)可以實(shí)現(xiàn)最簡(jiǎn)單的信息錄入自動(dòng)生成靜態(tài)頁(yè)面,還能具備頻道管理、權(quán)限管理、自動(dòng)抓取等功能,對(duì)于一個(gè)大型網(wǎng)站來(lái)說(shuō),擁有一套高效、可管理的CMS是必不可少的。
除了門戶和信息發(fā)布類型的網(wǎng)站,對(duì)于交互性要求很高的社區(qū)類型網(wǎng)站來(lái)說(shuō),盡可能的靜態(tài)化也是提高性能的必要手段,將社區(qū)內(nèi)的帖子、文章進(jìn)行實(shí)時(shí)的靜態(tài)化,有更新的時(shí)候再重新靜態(tài)化也是大量使用的策略,像Mop的大雜燴就是使用了這樣的策略,網(wǎng)易社區(qū)等也是如此。
同時(shí),html靜態(tài)化也是某些緩存策略使用的手段,對(duì)于系統(tǒng)中頻繁使用數(shù)據(jù)庫(kù)查詢但是內(nèi)容更新很小的應(yīng)用,可以考慮使用html靜態(tài)化來(lái)實(shí)現(xiàn),比如論壇中論壇的公用設(shè)置信息,這些信息目前的主流論壇都可以進(jìn)行后臺(tái)管理并且存儲(chǔ)再數(shù)據(jù)庫(kù)中,這些信息其實(shí)大量被前臺(tái)程序調(diào)用,但是更新頻率很小,可以考慮將這部分內(nèi)容進(jìn)行后臺(tái)更新的時(shí)候進(jìn)行靜態(tài)化,這樣避免了大量的數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求。
2、圖片服務(wù)器分離
大家知道,對(duì)于Web服務(wù)器來(lái)說(shuō),不管是Apache、IIS還是其他容器,圖片是最消耗資源的,于是我們有必要將圖片與頁(yè)面進(jìn)行分離,這是基本上大型網(wǎng)站都會(huì)采用的策略,他們都有獨(dú)立的圖片服務(wù)器,甚至很多臺(tái)圖片服務(wù)器。這樣的架構(gòu)可以降低提供頁(yè)面訪問(wèn)請(qǐng)求的服務(wù)器系統(tǒng)壓力,并且可以保證系統(tǒng)不會(huì)因?yàn)閳D片問(wèn)題而崩潰,在應(yīng)用服務(wù)器和圖片服務(wù)器上,可以進(jìn)行不同的配置優(yōu)化,比如apache在配置ContentType的時(shí)候可以盡量少支持,盡可能少的LoadModule,保證更高的系統(tǒng)消耗和執(zhí)行效率。
3、數(shù)據(jù)庫(kù)集群和庫(kù)表散列
大型網(wǎng)站都有復(fù)雜的應(yīng)用,這些應(yīng)用必須使用數(shù)據(jù)庫(kù),那么在面對(duì)大量訪問(wèn)的時(shí)候,數(shù)據(jù)庫(kù)的瓶頸很快就能顯現(xiàn)出來(lái),這時(shí)一臺(tái)數(shù)據(jù)庫(kù)將很快無(wú)法滿足應(yīng)用,于是我們需要使用數(shù)據(jù)庫(kù)集群或者庫(kù)表散列。
在數(shù)據(jù)庫(kù)集群方面,很多數(shù)據(jù)庫(kù)都有自己的解決方案,Oracle、Sybase等都有很好的方案,常用的MySQL提供的Master/Slave也是類似的方案,您使用了什么樣的DB,就參考相應(yīng)的解決方案來(lái)實(shí)施即可。
上面提到的數(shù)據(jù)庫(kù)集群由于在架構(gòu)、成本、擴(kuò)張性方面都會(huì)受到所采用DB類型的限制,于是我們需要從應(yīng)用程序的角度來(lái)考慮改善系統(tǒng)架構(gòu),庫(kù)表散列是常用并且最有效的解決方案。我們?cè)趹?yīng)用程序中安裝業(yè)務(wù)和應(yīng)用或者功能模塊將數(shù)據(jù)庫(kù)進(jìn)行分離,不同的模塊對(duì)應(yīng)不同的數(shù)據(jù)庫(kù)或者表,再按照一定的策略對(duì)某個(gè)頁(yè)面或者功能進(jìn)行更小的數(shù)據(jù)庫(kù)散列,比如用戶表,按照用戶ID進(jìn)行表散列,這樣就能夠低成本的提升系統(tǒng)的性能并且有很好的擴(kuò)展性。sohu的論壇就是采用了這樣的架構(gòu),將論壇的用戶、設(shè)置、帖子等信息進(jìn)行數(shù)據(jù)庫(kù)分離,然后對(duì)帖子、用戶按照板塊和ID進(jìn)行散列數(shù)據(jù)庫(kù)和表,最終可以在配置文件中進(jìn)行簡(jiǎn)單的配置便能讓系統(tǒng)隨時(shí)增加一臺(tái)低成本的數(shù)據(jù)庫(kù)進(jìn)來(lái)補(bǔ)充系統(tǒng)性能。
4、緩存
緩存一詞搞技術(shù)的都接觸過(guò),很多地方用到緩存。網(wǎng)站架構(gòu)和網(wǎng)站開(kāi)發(fā)中的緩存也是非常重要。這里先講述最基本的兩種緩存。高級(jí)和分布式的緩存在后面講述。
架構(gòu)方面的緩存,對(duì)Apache比較熟悉的人都能知道Apache提供了自己的緩存模塊,也可以使用外加的Squid模塊進(jìn)行緩存,這兩種方式均可以有效的提高Apache的訪問(wèn)響應(yīng)能力。
網(wǎng)站程序開(kāi)發(fā)方面的緩存,Linux上提供的Memory Cache是常用的緩存接口,可以在web開(kāi)發(fā)中使用,比如用Java開(kāi)發(fā)的時(shí)候就可以調(diào)用MemoryCache對(duì)一些數(shù)據(jù)進(jìn)行緩存和通訊共享,一些大型社區(qū)使用了這樣的架構(gòu)。另外,在使用web語(yǔ)言開(kāi)發(fā)的時(shí)候,各種語(yǔ)言基本都有自己的緩存模塊和方法,PHP有Pear的Cache模塊,Java就更多了,.net不是很熟悉,相信也肯定有。
5、鏡像
鏡像是大型網(wǎng)站常采用的提高性能和數(shù)據(jù)安全性的方式,鏡像的技術(shù)可以解決不同網(wǎng)絡(luò)接入商和地域帶來(lái)的用戶訪問(wèn)速度差異,比如ChinaNet和EduNet之間的差異就促使了很多網(wǎng)站在教育網(wǎng)內(nèi)搭建鏡像站點(diǎn),數(shù)據(jù)進(jìn)行定時(shí)更新或者實(shí)時(shí)更新。在鏡像的細(xì)節(jié)技術(shù)方面,這里不闡述太深,有很多專業(yè)的現(xiàn)成的解決架構(gòu)和產(chǎn)品可選。也有廉價(jià)的通過(guò)軟件實(shí)現(xiàn)的思路,比如Linux上的rsync等工具。
6、負(fù)載均衡
負(fù)載均衡將是大型網(wǎng)站解決高負(fù)荷訪問(wèn)和大量并發(fā)請(qǐng)求采用的終極解決辦法。
負(fù)載均衡技術(shù)發(fā)展了多年,有很多專業(yè)的服務(wù)提供商和產(chǎn)品可以選擇,我個(gè)人接觸過(guò)一些解決方法,其中有兩個(gè)架構(gòu)可以給大家做參考。
硬件四層交換
第四層交換使用第三層和第四層信息包的報(bào)頭信息,根據(jù)應(yīng)用區(qū)間識(shí)別業(yè)務(wù)流,將整個(gè)區(qū)間段的業(yè)務(wù)流分配到合適的應(yīng)用服務(wù)器進(jìn)行處理。 第四層交換功能就象是虛IP,指向物理服務(wù)器。它傳輸?shù)臉I(yè)務(wù)服從的協(xié)議多種多樣,有HTTP、FTP、NFS、Telnet或其他協(xié)議。這些業(yè)務(wù)在物理服務(wù)器基礎(chǔ)上,需要復(fù)雜的載量平衡算法。在IP世界,業(yè)務(wù)類型由終端TCP或UDP端口地址來(lái)決定,在第四層交換中的應(yīng)用區(qū)間則由源端和終端IP地址、TCP和UDP端口共同決定。
在硬件四層交換產(chǎn)品領(lǐng)域,有一些知名的產(chǎn)品可以選擇,比如Alteon、F5等,這些產(chǎn)品很昂貴,但是物有所值,能夠提供非常優(yōu)秀的性能和很靈活的管理能力。Yahoo中國(guó)當(dāng)初接近2000臺(tái)服務(wù)器使用了三四臺(tái)Alteon就搞定了。
軟件四層交換
大家知道了硬件四層交換機(jī)的原理后,基于OSI模型來(lái)實(shí)現(xiàn)的軟件四層交換也就應(yīng)運(yùn)而生,這樣的解決方案實(shí)現(xiàn)的原理一致,不過(guò)性能稍差。但是滿足一定量的壓力還是游刃有余的,有人說(shuō)軟件實(shí)現(xiàn)方式其實(shí)更靈活,處理能力完全看你配置的熟悉能力。
軟件四層交換我們可以使用Linux上常用的LVS來(lái)解決,LVS就是Linux Virtual Server,他提供了基于心跳線heartbeat的實(shí)時(shí)災(zāi)難應(yīng)對(duì)解決方案,提高系統(tǒng)的魯棒性,同時(shí)可供了靈活的虛擬VIP配置和管理功能,可以同時(shí)滿足多種應(yīng)用需求,這對(duì)于分布式的系統(tǒng)來(lái)說(shuō)必不可少。
一個(gè)典型的使用負(fù)載均衡的策略就是,在軟件或者硬件四層交換的基礎(chǔ)上搭建squid集群,這種思路在很多大型網(wǎng)站包括搜索引擎上被采用,這樣的架構(gòu)低成本、高性能還有很強(qiáng)的擴(kuò)張性,隨時(shí)往架構(gòu)里面增減節(jié)點(diǎn)都非常容易。這樣的架構(gòu)我準(zhǔn)備空了專門詳細(xì)整理一下和大家探討。
對(duì)于大型網(wǎng)站來(lái)說(shuō),前面提到的每個(gè)方法可能都會(huì)被同時(shí)使用到,我這里介紹得比較淺顯,具體實(shí)現(xiàn)過(guò)程中很多細(xì)節(jié)還需要大家慢慢熟悉和體會(huì),有時(shí)一個(gè)很小的squid參數(shù)或者apache參數(shù)設(shè)置,對(duì)于系統(tǒng)性能的影響就會(huì)很大,希望大家一起討論,達(dá)到拋磚引玉之效。
2007年11月26日 #
字段 | 允許值 | 允許的特殊字符 | ||
---|---|---|---|---|
秒 |
0-59 |
, - * / |
||
分 |
0-59 |
, - * / |
||
小時(shí) |
0-23 |
, - * / |
||
日期 |
1-31 |
, - * ? / L W C |
||
月份 |
1-12 或者 JAN-DEC |
, - * / |
||
星期 |
1-7 或者 SUN-SAT |
, - * ? / L C # |
||
年(可選) |
留空, 1970-2099 |
, - * / |
2007年8月31日 #
用Lucene做搜索碰到的問(wèn)題 http://www.javaeye.com/topic/82686?page=1
http://www.javaeye.com/topic/70305
2007年8月17日 #
2007年8月15日 #
mysqldump -u root -p --default-character-set=utf8 --set-charset=utf8 --skip-opt gzwarehouse > warehouse.sql
mysql -u root -p --default-character-set=utf8 backup < backup.sql