jeffy

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            70 Posts :: 1 Stories :: 14 Comments :: 0 Trackbacks

          2007年8月15日 #


          查看tomcat的錯誤日志, 錯誤原因是:javax.xml.transform.TransformerFactoryConfigurationError: Provider org.apache.xalan.processor.TransformerFactoryImpl not found

          是由于jdk1.5 與 tomcat5.0之間的關(guān)于 TransformerFactoryImpl 類的沖突造成的。

          用高版本的tomcat就可以解決。

          posted @ 2008-08-28 22:22 Live-in Java 閱讀(579) | 評論 (0)編輯 收藏

           1.  打開HKEY_CURRENT_USER\Software\Microsoft\Office\11.0(如果是Outlook XP,此處為10.0)\Outlook\Preferences項目
            2.  建立一個DWord的值(雙字節(jié)值),名稱為"MinToTray", 取值改成 1
          posted @ 2008-08-21 16:35 Live-in Java 閱讀(247) | 評論 (0)編輯 收藏

          ---刪除用戶及其用戶下面的所有對象
          drop user ca cascade;(刪除用戶下面的所有對象,注意關(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;

          ---運行SQL文件
          @D:\workspace\JATMP\ChannelAge.sql

          posted @ 2008-08-15 11:11 Live-in Java 閱讀(3468) | 評論 (0)編輯 收藏

          關(guān)于axis1.2中對象的序列化和發(fā)序列化                            

          我從開始使用wtp來開發(fā)web service開始, 就在思考一個問題:
          那些java的對象是可以序列化為xml的, 并且可以從xml反序列化為java對象的?
          那些對象與xml之間不能夠序列化和反序列化?
          在開發(fā)的時候應(yīng)該注意哪些問題?

          根據(jù)我的理解, 有如下幾種對象:
          1)axis1.2內(nèi)在支持的幾種對象類型。
                    這幾種內(nèi)在支持的對象包括:
                    java基本類型 : int, float,,,,
                    基本類型包裝類 : Integer, Float, Long...
                    還有String, Date, Calendar, BigDecimal, BigInteger, List, Map.
              凡是這些內(nèi)在支持的對象, 不管他們作為某個Service的input 還是 output, 我們在服務(wù)端的axis1.2的WEB-INF/server-config.wsdd的該Service的定義中都不需要加入<beanMapping>或者是<typeMapping>的聲明。

          2)簡單的javabean對象類型。
                 對于簡單的javabean對象, 比如對象中所有的field都是上面提到的基本類型。 axis1.2也提供了很好的支持。
                 比如:
                 public class JavaBeanInputService { 
                     public void testJavaBeanInput(MyBean bean) {
                         ......
                    }
                 }
                  由于MyBean是一個自定義的JavaBean對象, 所以在server-config.wsdd中就必須加上<beanMapping ...../>的聲明, 讓axis知道怎么把request中xml數(shù)據(jù)deserialize為MyBean對象, 又如何把MyBean對象serialize為xml數(shù)據(jù)作為response.用wtp自動為JavaInputService生成的wsdl中, MyBean是作為一個complexType在wsdl中定義的。

          3)復雜一點的JavaBean對象。
                  比如JavaBean對象中的一些field又是自定義的JavaBean,  這種情況下, wsdl中生成的complextype會有多個, 而在wsdd定義的<beanMapping .../>也會有多個, axis1.2支持起來都是易如反掌。

          4)普通的非javabean對象。
                對于一些不是javaBean的對象, wtp也會替你生成對應(yīng)的wsdl的ComplexType, 依據(jù)的是對象的getter方法。但是顯然這是不夠的。 比如說有些對象的數(shù)據(jù)結(jié)構(gòu)比較復雜, 像java.util.HashMap(雖然這個已經(jīng)被axis內(nèi)在支持了。)這些對象如果想要把自己的狀態(tài)進行serialization和deserialization, 就得自己編寫serializer和deserializer,  而且還必須保證wsdl中的該complexType的描述是正確的。

          5)java中的List, Map問題。
                 試想一下如果一個service的樣子是這樣子的。
                 public class ListService{
                       public List listTest(List list) {
                              for(Iterator iter = list.iterator(); iter.hasNext(); ) {
                                     (MyBean)list.next();//進行強轉(zhuǎn)。
                              }
                        }
                 }
                  用wtp為這個service生成的wsdl中把list映射為一個type為xsd:anyType的maxOccurs="unbound"的complexType。這樣的話客戶端生成的Stub中的接口中類似于:
                  public interface ListService{
                       public Object[] listTest(Object[] list) ;
                  }
                  如果Client端用戶傳遞的入口參數(shù)是String[],那么在服務(wù)端執(zhí)行的必然會發(fā)生轉(zhuǎn)型錯誤。
                  因此,在webservice中把List, Map作為service的input, output的做法都是不可行的。至少在jdk1.4的版本中是這樣的。
                 
          一個更好的方法就是:

          6)java中的數(shù)組。
                上例中的ListService如果改造為下面這樣,基本上就沒有上面提到的問題了。
                public class ListService{
                       public MyBean[] listTest(MyBean[] list) {
                             ...
                       }
                 }
                 這樣在wsdl中, MyBean被映射為一種ComplexType,MyBean[]為映射為ComplexType為映射為可以重復出現(xiàn)的MyBean類型。在客戶端的Stub的接口跟這個也是類似的。從而也成功地避免了List, Map中型別問題。
                 要注意的是,在server-config.wsdd中需要配置<arrayMapping.../>
                 似乎List, Map的問題用數(shù)組就可以解決了。事實上就是如此。但是還得注意的是:
             javabean里邊也不能含有List. 如果MyBean跟其它某個對象是1:n的關(guān)系,那么也只能寫成數(shù)組的形式,而不能是List的形式。

          7)特殊對象java.lang.Object
                 如果一個service寫成了下面的形式:
                 public class ObjectService{
                       public Object objInvoke(Object obj) {
                             ...
                       }
                 }
                  想把它發(fā)布為web service, 那么幾乎是不太可能的。遇到obj類型,wsdl里邊只能定義為xsd:anyType類型,而這種類型如果給客戶端返回一個比如MyBean類型,那么必然會導致xml的serialization的失敗。結(jié)論就是:
                  web service中如果input 或者是output是java.lang.Object類型,那么將會導致嚴重問題。

                 
                 
          上面的幾種對象類型基本上能夠涵蓋將java class發(fā)布為web service時需要考慮的對象類型。可以看到開發(fā)web service的時候,并不是所有的java都能夠輕而易舉地發(fā)布為web service, 一些復雜的類的對象類型,還有一些特殊的對象類型都是要考慮的。最后一個問題是:子類是否也很容易的得到序列化和反序列化?
                   答案是肯定的。如下的Service:
                    public class PolymorphicService{
                       public MyBean objInvoke(MyBean obj) {
                             ...
                       }
                   }
                    客戶端的Stub如下:
                    public class PolymorphicServiceStub{
                       public MyBean objInvoke(MyBean obj) {
                             ...
                       }
                   }
                   如果在客戶端調(diào)用stub時傳入的不是MyBean類的對象,而是它的子類的一個對象,那么也可以被序列化而傳到服務(wù)端。同樣,如果服務(wù)端返回的對象是MyBean類的字類的一個對象,也可以成功的被序列化到客戶端。

          posted @ 2008-04-10 14:14 Live-in Java 閱讀(5523) | 評論 (1)編輯 收藏

            服務(wù)器端定義:

          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;
           }

          }





          server-config.wsdd中的配置:

          自定義類
          <typeMapping deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory" encodingStyle="" qname="ns6:Bean" serializer="org.apache.axis.encoding.ser.BeanSerializerFactory" type="java:com.test.bean.Bean" xmlns:ns6="http://bean.test.com"/>

          數(shù)組
          <typeMapping xmlns:ns7="http://bean.test.com" qname="ns7:ArrayOf_Bean" type="java:com.test.bean.Bean[]" serializer="org.apache.axis.encoding.ser.ArraySerializerFactory" deserializer="org.apache.axis.encoding.ser.ArrayDeserializerFactory" encodingStyle="" /> 

          客戶端調(diào)用:
                    String endpoint = "http://localhost:8081/axistest/services/TestService";

                      Service service3 = new Service();
                      Call call3 = (Call) service3.createCall();
                      QName qn3 = new QName("http://bean.test.com","ArrayOf_Bean");
                      //注冊 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())); 


           
          posted @ 2008-04-01 16:07 Live-in Java 閱讀(550) | 評論 (0)編輯 收藏

          當互聯(lián)網(wǎng)吵吵嚷嚷的進入2.0時代,當互聯(lián)網(wǎng)的技術(shù)不再是那么高不可攀,當復制變成家常便飯,互聯(lián)網(wǎng)熱鬧起來了

               myspace火了,中國冒出更多的myspace

               youtube剛剛起來,中國的視頻網(wǎng)站就遍地開花

               51拔地而起,中國出了無數(shù)的SNS

               facebook則改變了中國站長的抄襲方式,不再學chianren了,校內(nèi)火了
               ..........

               當抄襲變成習慣,我想說的是,模仿,站長,你準備好了嗎?

               如果你打算做垃圾站,或者賺點廣告費的網(wǎng)站,請不要點擊這篇文章,我從技術(shù)角度方面談?wù)刉EB2.0網(wǎng)站的模仿問題。

               當投資和流量都不是問題的時候,我想說的是,您真的一帆風順嗎?

               拿SNS網(wǎng)站來說,當匆匆上線的2.0,當一筆筆投資砸進去的時候,當流量上去的時候,您的困惑在什么地方?

               我做過多個2.0公司的技術(shù)顧問,簡單的談?wù)?.0公司遇到的問題(涉及隱私,我用A B C D代替),這里就不再贅述大家眾所周知的頁面靜態(tài)化,緩存和代碼安全等問題了,有點技術(shù)的2.0公司的CTO都知道這些東西,我們談點發(fā)展之后的問題

          A公司

               A公司做的是SNS網(wǎng)站,程序是兩個毛頭小伙子做的,目標直指51,程序開發(fā)是一帆風順,功能也比51牛多了,推廣也是一帆風順(A公司有自己獨到的推廣 方式。但是當ALEXA到2W的時候問題出來了,每天下午4點左右,網(wǎng)站速度慢的驚人,基本上打不開,公司三臺服務(wù)器CPU100%,讓人郁悶的是公司的 網(wǎng)絡(luò)配置方式,居然是雙WEB的集群,而單獨一臺DB數(shù)據(jù)庫。整個瓶頸在數(shù)據(jù)庫,于是我建議做DB的集群,分析了一下數(shù)據(jù)結(jié)構(gòu),MD,典型的WEB程序員 的作品,沒有一點數(shù)據(jù)庫設(shè)計規(guī)范,功能實現(xiàn)是可以,如果要擴展,不可能,集群基本上是不可能的,怎么辦?不能辦,于是,一個月的時間修改程序,數(shù)據(jù)結(jié)構(gòu)基 本上換了一遍 前期砸進去的幾十萬打了水飄,用戶走光了。

               結(jié)論:WEB2.0前期設(shè)計的時候不應(yīng)該只考慮功能,應(yīng)該認真考慮一下底層和數(shù)據(jù)結(jié)構(gòu)了。

          B公司

               B公司也是做的SNS網(wǎng)站,程序是3個人開發(fā)的,CEO是某名牌大學的經(jīng)濟學碩士,有點知己網(wǎng)的味道,又有一些特色出來,說實話,公司的潛力不錯,CEO 有很強的運作能力,感覺前景不錯。系統(tǒng)架構(gòu)還行,但是---但是系統(tǒng)崩潰了,why?系統(tǒng)沒有考慮到用戶有個海量的說法,文件也有個海量的說法,用戶的相 冊,圖片全部存貯在WEB服務(wù)器的一個分區(qū)上,每個用戶一個目錄,而打開性能監(jiān)視器,磁盤的IO高的驚人,基本上無暇響應(yīng)。眾所周知,文件系統(tǒng)也是一個數(shù) 據(jù)庫,單獨大文件無所謂,關(guān)鍵是整個是300多個G的零碎文件,大量的讀寫操作,系統(tǒng)崩潰,數(shù)據(jù)丟失,文件系統(tǒng)的一個鏈斷了,用戶數(shù)據(jù)全部丟失!!!這是 一個非常沉重的問題,系統(tǒng)整整停了一個月來做數(shù)據(jù)恢復(單獨文件很容易,但是海量文件目前還沒有一個軟件能組織起來軟件架構(gòu))。解決方案:修改程序架構(gòu), 做分布式文件存貯(程序修改用了8天,但是文件轉(zhuǎn)移卻又用去了將近一個月),20萬用戶損失殆盡

               結(jié)論:WEB2.0前期的設(shè)計應(yīng)該有應(yīng)付海量存貯的考慮,整個涉及了程序架構(gòu)的修改,前期規(guī)劃不好的話基本上思路一條。

          C公司

               C公司是一個值得尊敬的公司,CEO技術(shù)出身,和比爾蓋茨一樣,大學未畢業(yè)出來做網(wǎng)絡(luò),01到03年做短信狠賺了一筆,后來做的小項目也小有所成,說實 話,我很佩服。公司做的是校友方面,但是更偏重myspace風格,注重個人主頁,推廣方面也下了大手筆。系統(tǒng)崩潰的原因其實很簡單,由于采用的是微軟的 SqlServer,而微軟直接就告訴了我們,SQLSERVER不支持集群,他們的數(shù)據(jù)庫超負載,100%就沒有下去過,只能橫向增加配置,采用了4路 4核CPU系統(tǒng),但是系統(tǒng)還是崩潰了... 高互動注定了高負載。解決方案: 現(xiàn)從基本入手,解決掉幾個程序耗能大戶,對數(shù)據(jù)庫采用橫向切割,將用戶每10萬進行分組,同時對數(shù)據(jù)庫系統(tǒng)進行散列,將多個表垂直分割,同時進行文件分組 ,解決問題. 因為修改了數(shù)據(jù)結(jié)構(gòu),程序也基本上大動了一下。 好在系統(tǒng)沒有出大錯,損失不算很大,不過對用戶體驗造成了很壞的影響。

               結(jié)論:WEB2.0前期設(shè)計應(yīng)該有良好的散列考慮,程序應(yīng)該能有配合的擴充性,符合數(shù)據(jù)庫的擴充

          D公司

               D公司是一個各個方面做的比較好的公司,做了CDN加速,圖片也獨立分出了N個服務(wù)器,數(shù)據(jù)庫不錯的一個,(CTO是個數(shù)據(jù)庫專家),系統(tǒng)崩潰的原因在于 WEB,按道理說WEB很容易做集群的,但是發(fā)現(xiàn)集群并解決不掉問題,他們的集群只允許做4臺的WEB集群,但是4臺都當?shù)袅恕W屑毞治觯业皆颍夜?計整個也是大部分CTO最容易犯的一個錯誤,或者說他們根本就想不到的問題,就是WEB上傳的問題,上傳的時候由于時間的原因,線程是保持鏈接的,300 個線程就可以把一個WEB Server當?shù)袅恕=鉀Q方案:這個最簡單,把上傳和其他耗能大戶分離出獨立出來。程序改動不是很大,但是之前半個月速度滿對用戶體驗的損失也不可小視。

               結(jié)論:沒有什么結(jié)論了,畢竟有海量訪問經(jīng)驗的CTO不多,也就是那幾個大站的。

               總結(jié):不是潑冷水,模仿其實是很容易的,隨便找?guī)讉€WEB程序員就能做到,并且很簡單,速度可能還很高效,因為WEB2.0無非就是跟數(shù)據(jù)庫打交道,會操 作數(shù)據(jù)庫就會做。但是真正做大并不容易,因為能應(yīng)付海量訪問的程序并不簡單,現(xiàn)在的程序員都太自命不凡,其實真正有經(jīng)驗的并不多,不要相信一個月薪5K- -10K的程序員能給你多大的驚喜,能應(yīng)付海量訪問的程序員不是那個價格。如果您想做2.0,想做大,有幾個個建議:

               一.找DBMS的專家設(shè)計好數(shù)據(jù)庫,大部分程序員都不知道分區(qū)視圖,數(shù)據(jù)散列,數(shù)據(jù)組的概念

               二.設(shè)計好程序架構(gòu)(這個其實不難,有個高人指導就行了),保持良好的擴展性,成本考慮可以找兼職的系統(tǒng)架構(gòu)設(shè)計師做好系統(tǒng)架構(gòu),確定將來的發(fā)展瓶頸。

               三.考慮好文件存貯的問題。文件存貯的技術(shù)含量看起來很低,其實是很高的,可以考慮反向代理的方案。文件存貯出問題了,站點基本上就完蛋了,不僅僅是RAID的問題和存貯服務(wù)器的問題,不過道理倒是一點就破的

               四.中國國情考慮,這個最致命,需要考慮電信和網(wǎng)通的問題,CDN并不能解決所有問題。互動性的東西并CDN并不是很有效。最關(guān)鍵的是,現(xiàn)有的雙線機房遇 到DDOS攻擊基本上都會當?shù)簦蚝芎唵危p線機房都是私人機房,本身就不會有太高的帶寬,隨便攻擊一下就可以D掉(順帶提一個笑話,我知道一個雙線機 房的老總總共1G的帶寬卻買了4G的金盾墻,很簡單800M的攻擊就可以搞定)。

               五.網(wǎng)絡(luò)延遲的問題,這是分布式系統(tǒng)必須要考慮的,程序要能容忍0到100秒的數(shù)據(jù)延遲的功能,也就是同步的問題。不要小看這幾十秒,問題很大的,如果你 的站點有交互式功能,比如即時聊天,你可以想象一下是個什么結(jié)果。對于即時聊天的東西,可以用反向代理來解決(成本較高)。但是對于留言和評論的影響不 大,但是如果系統(tǒng)為了健壯做了緩存和靜態(tài)化的時候,這個東西可能就是災(zāi)難性的了。

               六.分散你的程序,如果你沒有太多的資金構(gòu)筑動輒百萬的服務(wù)器,建議把功能分散開來,比如相冊一臺服務(wù)器,留言一臺服務(wù)器

               七.看好你的程序員,如果沒有很好的激勵措施的話你的程序員很容易寫出敷衍性的代碼,而這個可能就是將來的大患,程序架構(gòu)定下來后要修改可能就要費牛勁了。最好你的CTO能對你100%的衷心,100%的負責。

               八.文件同步的問題,這個問題可能你覺得沒有必要,如果你看一下網(wǎng)通和電信的TTL就明白了,同步要支持續(xù)傳,并且不能是持續(xù)的,否則你的成本會高出N倍,不要期望能通過你的軟件實現(xiàn),交給你的程序員吧,把上面的話告訴他他就知道怎么做了。

               九.最狠的一個問題了,也是吃虧最大的問題,不管您跟網(wǎng)警的關(guān)系多好,看好你的用戶,審核好你的東西,一被停機可能就致命,本人就吃過N次虧。




          一個小型的網(wǎng)站,比如個人網(wǎng)站,可以使用最簡單的html靜態(tài)頁面就實現(xiàn)了,配合一些圖片達到美化效果,所有的頁面均存放在一個目錄下,這樣的網(wǎng)站對系統(tǒng)架構(gòu)、性能的要求都很簡單,隨著互聯(lián)網(wǎng)業(yè)務(wù)的不斷豐富,網(wǎng)站相關(guān)的技術(shù)經(jīng)過這些年的發(fā)展,已經(jīng)細分到很細的方方面面,尤其對于大型網(wǎng)站來說,所采用的技術(shù)更是涉及面非常廣,從硬件到軟件、編程語言、數(shù)據(jù)庫、WebServer、防火墻等各個領(lǐng)域都有了很高的要求,已經(jīng)不是原來簡單的html靜態(tài)網(wǎng)站所能比擬的。

          大型網(wǎng)站,比如門戶網(wǎng)站。在面對大量用戶訪問、高并發(fā)請求方面,基本的解決方案集中在這樣幾個環(huán)節(jié):使用高性能的服務(wù)器、高性能的數(shù)據(jù)庫、高效率的編程語言、還有高性能的Web容器。但是除了這幾個方面,還沒法根本解決大型網(wǎng)站面臨的高負載和高并發(fā)問題。

          上面提供的幾個解決思路在一定程度上也意味著更大的投入,并且這樣的解決思路具備瓶頸,沒有很好的擴展性,下面我從低成本、高性能和高擴張性的角度來說說我的一些經(jīng)驗。

          1、HTML靜態(tài)化

          其實大家都知道,效率最高、消耗最小的就是純靜態(tài)化的html頁面,所以我們盡可能使我們的網(wǎng)站上的頁面采用靜態(tài)頁面來實現(xiàn),這個最簡單的方法其實也是最有效的方法。但是對于大量內(nèi)容并且頻繁更新的網(wǎng)站,我們無法全部手動去挨個實現(xiàn),于是出現(xiàn)了我們常見的信息發(fā)布系統(tǒng)CMS,像我們常訪問的各個門戶站點的新聞頻道,甚至他們的其他頻道,都是通過信息發(fā)布系統(tǒng)來管理和實現(xiàn)的,信息發(fā)布系統(tǒng)可以實現(xiàn)最簡單的信息錄入自動生成靜態(tài)頁面,還能具備頻道管理、權(quán)限管理、自動抓取等功能,對于一個大型網(wǎng)站來說,擁有一套高效、可管理的CMS是必不可少的。

          除了門戶和信息發(fā)布類型的網(wǎng)站,對于交互性要求很高的社區(qū)類型網(wǎng)站來說,盡可能的靜態(tài)化也是提高性能的必要手段,將社區(qū)內(nèi)的帖子、文章進行實時的靜態(tài)化,有更新的時候再重新靜態(tài)化也是大量使用的策略,像Mop的大雜燴就是使用了這樣的策略,網(wǎng)易社區(qū)等也是如此。

          同時,html靜態(tài)化也是某些緩存策略使用的手段,對于系統(tǒng)中頻繁使用數(shù)據(jù)庫查詢但是內(nèi)容更新很小的應(yīng)用,可以考慮使用html靜態(tài)化來實現(xiàn),比如論壇中論壇的公用設(shè)置信息,這些信息目前的主流論壇都可以進行后臺管理并且存儲再數(shù)據(jù)庫中,這些信息其實大量被前臺程序調(diào)用,但是更新頻率很小,可以考慮將這部分內(nèi)容進行后臺更新的時候進行靜態(tài)化,這樣避免了大量的數(shù)據(jù)庫訪問請求。

          2、圖片服務(wù)器分離

          大家知道,對于Web服務(wù)器來說,不管是Apache、IIS還是其他容器,圖片是最消耗資源的,于是我們有必要將圖片與頁面進行分離,這是基本上大型網(wǎng)站都會采用的策略,他們都有獨立的圖片服務(wù)器,甚至很多臺圖片服務(wù)器。這樣的架構(gòu)可以降低提供頁面訪問請求的服務(wù)器系統(tǒng)壓力,并且可以保證系統(tǒng)不會因為圖片問題而崩潰,在應(yīng)用服務(wù)器和圖片服務(wù)器上,可以進行不同的配置優(yōu)化,比如apache在配置ContentType的時候可以盡量少支持,盡可能少的LoadModule,保證更高的系統(tǒng)消耗和執(zhí)行效率。

          3、數(shù)據(jù)庫集群和庫表散列

          大型網(wǎng)站都有復雜的應(yīng)用,這些應(yīng)用必須使用數(shù)據(jù)庫,那么在面對大量訪問的時候,數(shù)據(jù)庫的瓶頸很快就能顯現(xiàn)出來,這時一臺數(shù)據(jù)庫將很快無法滿足應(yīng)用,于是我們需要使用數(shù)據(jù)庫集群或者庫表散列。

          在數(shù)據(jù)庫集群方面,很多數(shù)據(jù)庫都有自己的解決方案,Oracle、Sybase等都有很好的方案,常用的MySQL提供的Master/Slave也是類似的方案,您使用了什么樣的DB,就參考相應(yīng)的解決方案來實施即可。

          上面提到的數(shù)據(jù)庫集群由于在架構(gòu)、成本、擴張性方面都會受到所采用DB類型的限制,于是我們需要從應(yīng)用程序的角度來考慮改善系統(tǒng)架構(gòu),庫表散列是常用并且最有效的解決方案。我們在應(yīng)用程序中安裝業(yè)務(wù)和應(yīng)用或者功能模塊將數(shù)據(jù)庫進行分離,不同的模塊對應(yīng)不同的數(shù)據(jù)庫或者表,再按照一定的策略對某個頁面或者功能進行更小的數(shù)據(jù)庫散列,比如用戶表,按照用戶ID進行表散列,這樣就能夠低成本的提升系統(tǒng)的性能并且有很好的擴展性。sohu的論壇就是采用了這樣的架構(gòu),將論壇的用戶、設(shè)置、帖子等信息進行數(shù)據(jù)庫分離,然后對帖子、用戶按照板塊和ID進行散列數(shù)據(jù)庫和表,最終可以在配置文件中進行簡單的配置便能讓系統(tǒng)隨時增加一臺低成本的數(shù)據(jù)庫進來補充系統(tǒng)性能。

          4、緩存

          緩存一詞搞技術(shù)的都接觸過,很多地方用到緩存。網(wǎng)站架構(gòu)和網(wǎng)站開發(fā)中的緩存也是非常重要。這里先講述最基本的兩種緩存。高級和分布式的緩存在后面講述。
          架構(gòu)方面的緩存,對Apache比較熟悉的人都能知道Apache提供了自己的緩存模塊,也可以使用外加的Squid模塊進行緩存,這兩種方式均可以有效的提高Apache的訪問響應(yīng)能力。
          網(wǎng)站程序開發(fā)方面的緩存,Linux上提供的Memory Cache是常用的緩存接口,可以在web開發(fā)中使用,比如用Java開發(fā)的時候就可以調(diào)用MemoryCache對一些數(shù)據(jù)進行緩存和通訊共享,一些大型社區(qū)使用了這樣的架構(gòu)。另外,在使用web語言開發(fā)的時候,各種語言基本都有自己的緩存模塊和方法,PHP有Pear的Cache模塊,Java就更多了,.net不是很熟悉,相信也肯定有。

          5、鏡像

          鏡像是大型網(wǎng)站常采用的提高性能和數(shù)據(jù)安全性的方式,鏡像的技術(shù)可以解決不同網(wǎng)絡(luò)接入商和地域帶來的用戶訪問速度差異,比如ChinaNet和EduNet之間的差異就促使了很多網(wǎng)站在教育網(wǎng)內(nèi)搭建鏡像站點,數(shù)據(jù)進行定時更新或者實時更新。在鏡像的細節(jié)技術(shù)方面,這里不闡述太深,有很多專業(yè)的現(xiàn)成的解決架構(gòu)和產(chǎn)品可選。也有廉價的通過軟件實現(xiàn)的思路,比如Linux上的rsync等工具。

          6、負載均衡

          負載均衡將是大型網(wǎng)站解決高負荷訪問和大量并發(fā)請求采用的終極解決辦法。
          負載均衡技術(shù)發(fā)展了多年,有很多專業(yè)的服務(wù)提供商和產(chǎn)品可以選擇,我個人接觸過一些解決方法,其中有兩個架構(gòu)可以給大家做參考。
          硬件四層交換
          第四層交換使用第三層和第四層信息包的報頭信息,根據(jù)應(yīng)用區(qū)間識別業(yè)務(wù)流,將整個區(qū)間段的業(yè)務(wù)流分配到合適的應(yīng)用服務(wù)器進行處理。 第四層交換功能就象是虛IP,指向物理服務(wù)器。它傳輸?shù)臉I(yè)務(wù)服從的協(xié)議多種多樣,有HTTP、FTP、NFS、Telnet或其他協(xié)議。這些業(yè)務(wù)在物理服務(wù)器基礎(chǔ)上,需要復雜的載量平衡算法。在IP世界,業(yè)務(wù)類型由終端TCP或UDP端口地址來決定,在第四層交換中的應(yīng)用區(qū)間則由源端和終端IP地址、TCP和UDP端口共同決定。
          在硬件四層交換產(chǎn)品領(lǐng)域,有一些知名的產(chǎn)品可以選擇,比如Alteon、F5等,這些產(chǎn)品很昂貴,但是物有所值,能夠提供非常優(yōu)秀的性能和很靈活的管理能力。Yahoo中國當初接近2000臺服務(wù)器使用了三四臺Alteon就搞定了。

          軟件四層交換

          大家知道了硬件四層交換機的原理后,基于OSI模型來實現(xiàn)的軟件四層交換也就應(yīng)運而生,這樣的解決方案實現(xiàn)的原理一致,不過性能稍差。但是滿足一定量的壓力還是游刃有余的,有人說軟件實現(xiàn)方式其實更靈活,處理能力完全看你配置的熟悉能力。
          軟件四層交換我們可以使用Linux上常用的LVS來解決,LVS就是Linux Virtual Server,他提供了基于心跳線heartbeat的實時災(zāi)難應(yīng)對解決方案,提高系統(tǒng)的魯棒性,同時可供了靈活的虛擬VIP配置和管理功能,可以同時滿足多種應(yīng)用需求,這對于分布式的系統(tǒng)來說必不可少。

          一個典型的使用負載均衡的策略就是,在軟件或者硬件四層交換的基礎(chǔ)上搭建squid集群,這種思路在很多大型網(wǎng)站包括搜索引擎上被采用,這樣的架構(gòu)低成本、高性能還有很強的擴張性,隨時往架構(gòu)里面增減節(jié)點都非常容易。這樣的架構(gòu)我準備空了專門詳細整理一下和大家探討。

          對于大型網(wǎng)站來說,前面提到的每個方法可能都會被同時使用到,我這里介紹得比較淺顯,具體實現(xiàn)過程中很多細節(jié)還需要大家慢慢熟悉和體會,有時一個很小的squid參數(shù)或者apache參數(shù)設(shè)置,對于系統(tǒng)性能的影響就會很大,希望大家一起討論,達到拋磚引玉之效。

          posted @ 2008-01-03 13:30 Live-in Java 閱讀(292) | 評論 (0)編輯 收藏

          找到投資人的幾種途徑和方法   http://zz.itjj.net/yingli/20071122/265135.html

          posted @ 2007-12-15 12:35 Live-in Java 閱讀(180) | 評論 (0)編輯 收藏

           

          對創(chuàng)業(yè)團隊的成員的要求:

                   第一,團隊成員是否是創(chuàng)業(yè)型的人才。創(chuàng)業(yè)考驗的不是你的技術(shù),而是你承受壓力的能力,你忍受寂寞的能力,你放棄原有的輕松生活的犧牲精神,你以項目為核心的凝聚力……有很多人一時沖動加入進來,實際上,激情很快散去,覺得苦,覺得壓力太大,覺得時間不自由(因為要占用你很多的業(yè)余時間)……如果大家都是吃苦耐勞、樂于犧牲的人,那這個團隊無論結(jié)構(gòu)是否完善,已經(jīng)算是一個好的團隊;
              第二,在組建團隊以前,一定要弄清楚,成員加入進來是為了什么?一個成員要加入創(chuàng)業(yè)團隊,一定要有至少50%的因素是來自于認可這個項目。如果不是對事情不利。
          posted @ 2007-12-15 12:07 Live-in Java 閱讀(248) | 評論 (1)編輯 收藏

             spring環(huán)境中想配置一個Quartz方式的時間調(diào)度任務(wù) ,啟動時候,拋出例外,說*.qrtz_locks 表找不到.
            錯誤原因,使用了 default-autowire="byName" 方式 , 而配置文件中又有一個dataSource配置,它自動設(shè)置到Quartz的相關(guān)類里面,導致出錯, 解決辦法,要么不用 autowire="byName" 方式,要么修改spring配置文件中的dataSource的bean,如改成dataSource1.

          字段   允許值   允許的特殊字符
            0-59   , - * /
            0-59   , - * /
          小時   0-23   , - * /
          日期   1-31   , - * ? / L W C
          月份   1-12 或者 JAN-DEC   , - * /
          星期   1-7 或者 SUN-SAT   , - * ? / L C #
          年(可選)   留空, 1970-2099   , - * /
          posted @ 2007-11-26 14:23 Live-in Java 閱讀(382) | 評論 (0)編輯 收藏

           用Lucene做搜索碰到的問題  http://www.javaeye.com/topic/82686?page=1
          http://www.javaeye.com/topic/70305

          posted @ 2007-08-31 17:34 Live-in Java 閱讀(1023) | 評論 (1)編輯 收藏

            當用js的alert 方法顯示ajax以responseText顯示返回結(jié)果時候, 顯示的是個xml結(jié)構(gòu)文檔, 但以responseXML解析xml的時候, 所有節(jié)點長度都為0,  這個問題關(guān)鍵是服務(wù)器端沒有指定正確的文檔格式:
                  response.setContentType("text/xml;charset=UTF-8"); (正確)
                   response.setContentType("text/html;charset=UTF-8");(錯誤)
          posted @ 2007-08-17 17:35 Live-in Java 閱讀(2987) | 評論 (2)編輯 收藏

          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

           

          posted @ 2007-08-15 17:11 Live-in Java 閱讀(465) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 晋江市| 乐安县| 浮山县| 沭阳县| 通州市| 故城县| 屯留县| 巍山| 孙吴县| 从江县| 鲜城| 兰西县| 舞阳县| 巍山| 承德县| 徐闻县| 卢龙县| 依安县| 英山县| 上思县| 邹平县| 邓州市| 南京市| 清原| 卓尼县| 襄垣县| 大英县| 霍邱县| 余干县| 和林格尔县| 建昌县| 新和县| 咸丰县| 渭源县| 克东县| 广宁县| 麻栗坡县| 北宁市| 宜宾县| 五家渠市| 准格尔旗|