开发高性能的WebService应用 zhuan
一、????? WebService概述
1、????? 性能
?設(shè)計(jì)時(shí)就考慮性能
?不要在事后再加入性能!
?在項(xiàng)目開發(fā)的整個(gè)過程中反復(fù)測試
?兩種量化Web性能的方法:
1) 機(jī)器吞吐率(requests/sec)
2) 響應(yīng)時(shí)間(time tofirst/last bytes)
?
2、面向?qū)ο?/p>
?應(yīng)用于同一平臺和運(yùn)行環(huán)境
?共享類型而不是schemas
?采用便宜, 透明通信
?對象的標(biāo)識與生命周期由系統(tǒng)維護(hù)
?客戶機(jī)和服務(wù)器的同步的部署
?容易概念化,因而提供一個(gè)自然的模型
?一般不需要狀態(tài)管理
?應(yīng)用于一個(gè)可預(yù)測的序列、期限和結(jié)果
?目標(biāo)是遠(yuǎn)程透明地使用方法和類型
3、面向服務(wù)
? 應(yīng)用于異構(gòu)平臺和運(yùn)行環(huán)境
? 共享schemas而不是類型
? 采用高成本, 明確通信
? 服務(wù)是自治的: 安全和失效是隔離
? 允許的連續(xù), 分離部署客戶機(jī)和服務(wù)器
? 基于軟件組件和分布的對象,依賴服務(wù)的協(xié)議
? 擁有并維護(hù)狀態(tài)
? 基于消息, 異步的, 和長通信
? 目標(biāo)是提供服務(wù)隔離和調(diào)用的標(biāo)準(zhǔn)。
4、Web Service性能設(shè)計(jì)的考慮
? 設(shè)計(jì)"大塊頭"的接口減少往返。
? 基于消息的編程而不是遠(yuǎn)程過程調(diào)用(RPC) 。
? 使用XML字串作為參數(shù)。
? 盡量使用原始數(shù)據(jù)類型參數(shù)。
? 避免在調(diào)用之間維護(hù)服務(wù)器狀態(tài)。
? 考慮為復(fù)雜的WebMethod提供輸入校驗(yàn)。
? 考慮對WebMethod的結(jié)果進(jìn)行緩存。
? 選擇適用的大數(shù)據(jù)包傳送方式。
? 避免調(diào)用本地的WebService。
5、基于消息編程和RPC
? 消息
//Client
string msg = "<Items>...</Items>";
MyMethod(msg);
//Server
[WebMethod]
void MyMethod(string msg){ . . . }
? RPC
Serv.SendItemsToBePurchased(Array[] items);
Serv.ShippingAddress(string Address);
Serv.CheckOut();
二、WebService性能最佳實(shí)踐
? 連接與線程優(yōu)化
? WebMethod的優(yōu)化
? 高效地調(diào)用WebMethod
? 設(shè)置超時(shí)
? 緩存
? 狀態(tài)管理
1、連接
?配置maxconnection 屬性。
示例:
<connectionManagement>
<add address="*" maxconnection="12"/>
</connectionManagement>
修改:
<connectionManagement>
<add address="WebServiceA" maxconnection="8">
<add address="WebServiceB" maxconnection="4">
</connectionManagement>
?對WebService按優(yōu)先級分配連接資源
?使用單一身份進(jìn)行調(diào)用。
serv = new WebService1();
serv.PreAuthenticate=true;
ICredentials conCredentials =new
NetworkCredential("UId","Pwd","NPSTest" );
serv.Credentials = conCredentials;
serv.AllowAutoRedirect=false;
serv.ConnectionGroupName = "SameForAllUsers";
?為集成認(rèn)證使用UnsafeAuthenticatedConnectionSharing 。
?為基本驗(yàn)證使用PreAuthenticate 。
2、WebMethods
?使用原始類型參數(shù)。
?考慮使用緩沖。
?將WebMethod的返回緩存。
?只在需要會(huì)話狀態(tài)時(shí)才使用它。
大數(shù)據(jù)包的處理
?使用字節(jié)數(shù)組作為參數(shù)或返回值
?返回一個(gè)URL
?使用串行化流
<configuration>
<system.web>
<httpRuntime maxRequestLength="8096"
useFullyQualifiedRedirectUrl="true"
executionTimeout="45"/>
</system.web>
</configuration>
串行化
?使用XmlIgnore減少串行化。
?減少往返。
?考慮使用XML 壓縮。
public class MyClass
{
// The str1 value will be serialized.
public string str1;
/* This field will be ignored when
serialized--unless it's overridden. */
[XmlIgnoreAttribute]
public string str2;
}
異步WebMethod
?用異步Webmethods對I/O 操作。
?當(dāng)Webmethods依賴于工作線程時(shí),不要使用異步。
//webservice
[WebMethod]
IAsyncResult BeginMyProc(...)?????????? //the WSDL will show the method as MyProc(...)
[WebMethod]
EndMyProc(...)
單工通信
?如果不需要返回,考慮使用OneWay屬性。
[SoapDocumentMethod(OneWay=true)]
[WebMethod(Description="Return immediately")]
public void SomeMethod()
{...}
COM交互
?建議: 盡量避免交互
?最好將COM代碼移植到.NET
?? ?可能會(huì)很昂貴, 尤其對于數(shù)組操作
?? ?“受管” 與“不受管” 轉(zhuǎn)換
?注意單元線程組件
?? ?缺省情況ASP.NET 使用MTA線程
?? ?損害STA 組件性能
注意所有VB6組件!
3、異步調(diào)用
?當(dāng)有并發(fā)任務(wù)時(shí)例用異步調(diào)用WebService。
?使用異步調(diào)用多個(gè)不相關(guān)的WebService。
?異步叫調(diào)用WebService可以增加UI 響應(yīng)。
4、超時(shí)
?適當(dāng)?shù)卦O(shè)置代理的超時(shí)。
?設(shè)置您的ASP.NET 超時(shí)大于您的WebService的超時(shí)。
?如果頁面超時(shí),則放棄頁面與WebService的連接。
MyWebServ obj = new MyWebServ();
obj.Timeout = 15000; // in milliseconds
5、緩存
?對時(shí)效性不強(qiáng)的數(shù)據(jù)進(jìn)行緩存。
?考慮提供與緩存所相關(guān)的信息給客戶。
?考慮使用邊界緩存,如ISA上的緩存。
6、狀態(tài)管理
?只在需要會(huì)話狀態(tài)時(shí)才使用它。
?減少應(yīng)用狀態(tài)與服務(wù)器的親合力。
? ?InProc
? ?StateServer
? ?SQLServer
注:主要資料來自王興明的WebCast。
Demo下載
OscarXie.net
關(guān)注質(zhì)量與體驗(yàn)——電子商務(wù)與自動(dòng)化測試
http://www.cnblogs.com/oscarxie/
轉(zhuǎn)載于:https://www.cnblogs.com/csj007523/archive/2010/04/07/1706341.html
總結(jié)
以上是生活随笔為你收集整理的开发高性能的WebService应用 zhuan的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: YUI Grid CSS的优雅设计(转)
- 下一篇: SQL Server2005重装Perf