1. 程式人生 > >Rest服務的健壯性考慮

Rest服務的健壯性考慮

之前寫了個六步實現Rest風格的API,詳述了怎麼開發Rest風格的服務。Rest是基於HTTP的,有必要知道,HTTP是一個簡單的基於“請求/響應”的協議,它初始時候只是設計用來獲取靜態的或動態生產的內容。HTTP不支援事務,簡單的來說,在接受處理完請求像想客戶端傳送完響應後,HTTP伺服器即認為它的工作已經完成了。這個時候網路或者客戶端發生了錯誤,伺服器端是完全不知道的。如果客戶端決定重試請求,伺服器只會將同樣的事情再做一遍,有的時候這會造成應用資料的不一致。因此,在開發支援內容更改的Rest服務的時候,需要特別小心。

忽略TCP連線建立的過程,一個HTTP請求的全過程包括:

  1. 客戶端組裝請求資料,包括HTTP的頭,內容等等
  2. 客戶端發出請求,向網路發出資料,伺服器端接受資料
  3. 伺服器將請求解析成自己的資料格式
  4. 伺服器端按照請求資料處理請求
  5. 伺服器端處理完請求後傳送響應回客戶端,客戶端接受到響應
  6. 客戶端解析響應
  7. 客戶端做後續業務處理

要保證Rest服務的健壯性,就必須考慮HTTP請求的整個過程。在整個過程的任何一個階段出現問題的時候,都必須有一個合理的後續處理。

一,客戶端組裝資料並通過網路發出請求

在這個階段出現問題是很容易處理的,這個時候請求還沒到達伺服器。

伺服器沒有處理請求,也即還沒做任何改變資料的操作。客戶端一段檢測到錯誤,可以根據錯誤的原因做下一步處理。如果是組裝資料的過程中資料有問題,那中止當前處理即可;如果是通過網路傳送資料的時候有問題,比如連線不到主機或者網路連線中斷,那客戶端可以根據系統特點選擇重試幾次請求。

二,伺服器解析請求

這個時候,伺服器也還沒有開始處理資料,所以也還不會對資料產生影響。

這個階段出錯的原因可能多重多樣,比如請求資料格式不對,或者伺服器的某些元件出問題造成無法繼續處理請求,或者伺服器出現了某些沒有預料到的異常。但總的來說,錯誤應該分為兩類:一類是客戶端應該重試的,一類是客戶端不該重試的。假如伺服器突然發生了一個沒預料到的異常,比如到資料庫的連線突然中斷,這個時候客戶端重試請求有很大可能會成功;而如果伺服器發現客戶端傳送過來的資料不符合規範,那可以直接要求客戶端解決問題後在傳送重試。更好的分類方法是按照HTTP協議關於響應碼http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

的定義,將錯誤分類,伺服器不需要告訴客戶端怎麼處理,客戶端應該根據自己的需要選擇重試還是直接中斷。比如伺服器返回400,那基本可以認為是客戶端請求不符合要求,客戶端應該解決問題後在重試;伺服器返回500,那有可能是伺服器發生了一個未預料的異常,客戶端可以選擇重試一次請求。

三,伺服器端處理請求

這一階段其實和"伺服器解析請求,準備處理資料"階段類似。不同點是這一階段可以已經開始處理資料並在處理過程中出現問題。

解決方法就是,伺服器應該保證,一旦開始修改資料,那就必須是完全的修改,或者是完全的不修改。說白了就是,伺服器應該保證請求的處理應該在單一的完整的事務中。所以如果這個階段出現問題,事務回滾後,伺服器的狀態就和"伺服器解析請求,準備處理資料"階段一樣了,皆可按"伺服器解析請求,準備處理資料"階段的處理方式處理。

四,伺服器端傳送響應回客戶端,客戶端接受響應

伺服器如果成功的處理了請求並提交了資料,這個時候伺服器已經完全的接受並處理了請求,差的只是將處理的結果告訴客戶端。

這個階段的問題有兩種:一種是伺服器在組裝返回資料的時候出現了異常;另外一種是伺服器在通過網路向客戶端傳送資料的時候網路出現異常。

如果一個請求處理到了這個階段,不管是那種問題,這個時候出現的任何問題應該都和客戶端無關了。伺服器既然已經接受並處理了請求,那說明客戶端發來的請求是正確的,如果伺服器在準備返回結果的時候出錯,要麼是伺服器的bug,要麼是伺服器出現異常。忽略bug的情況,如果伺服器出現異常,那麼這個時候伺服器應該返回給客戶端一個特殊的標示(比如一個特別的響應嗎),代表已經處理請求。

伺服器在傳送資料給客戶端的時候出問題是整個系統裡最難處理的部分,因為客戶端只知道網路出問題,但是完全不知道伺服器對請求處理結果如何。如果伺服器沒處理這個請求的話,客戶端重試請求,伺服器會再將錯誤傳送給客戶端一次,這通常沒大問題;但是如果伺服器已經處理了第一次的請求,客戶端重試就會造成同樣的請求被處理了兩次。為了確保伺服器即便對同一個請求處理了多次也不影響資料一致,伺服器必須保證HTTP方法的“冪等”,簡單的說就是,任何一個Rest請求都是可以重複請求多次的,如果不出現異常,伺服器處理完一次的結果和處理完多次的結果應該是一樣的。我們可以利用Rest服務資源都有一個ID的原則處理這個問題,在客戶端的任何請求(包括建立)裡都必須附上請求資源的ID,伺服器每次處理的時候都是處理對應ID的那條資料,這樣任何一個資源的最終狀態必定是最後一個請求的結果,如果一個請求被重複多次處理,也不會產生資料的不一致。特別指出,建立一條資源的時候也要附上ID(ID可以客戶端生成或者伺服器提供介面生成),不然的話,伺服器必然會產生兩條一樣的資料。

五,客戶端解析響應並做後續業務處理

這個階段和“客戶端組裝資料並通過網路發出請求”類似,其實它已經和伺服器沒太大關係了。伺服器如果完全傳送了響應,但是客戶端解析不正確,多是伺服器和客戶端不一致造成;如果認為是伺服器響應的問題,有了前一步我們討論的保證,再重試一次也是可以的。

參考資料:http://hc.apache.org/httpclient-3.x/exception-handling.html#Transport%20exceptions

關鍵字: REST,健壯性,robust

 版權所有,轉載請註明來源




相關推薦

Rest服務健壯考慮

之前寫了個六步實現Rest風格的API,詳述了怎麼開發Rest風格的服務。Rest是基於HTTP的,有必要知道,HTTP是一個簡單的基於“請求/響應”的協議,它初始時候只是設計用來獲取靜態的或動態生產的內容。HTTP不支援事務,簡單的來說,在接受處理完請求像想客戶端傳送完

驅動程式的健壯考慮

驅動程式的健壯性要考慮硬體出問題的時候不會導致核心的工作異常。比如驅動註冊的時候要對硬體的識別,裝置硬體是否存在或者硬體是否正常。如果硬體模組不正常,但是還要去註冊,訪問的時候會出現問題,如果處理不當會導致核心CRAS

linux服務能(網卡流量、CPU、內存、磁盤使用率)監控

平均值 行數據 blog sar 處理 行為 amp 利用 %d   廣義的網站的監控涵蓋所有的非業務行為的數據采集與管理,包括數據分析師和產品設計師使用的網站用戶行為日誌、業務運行數據,以及供運維工程師和開發工程師使用的性能統計數據等。 本文主要是通過shell

JEESZ REST服務接口文檔

spring mvc+my batis kafka dubbo+zookeerper restful redis分布式緩存 目 錄1、 引言......................................................................

服務能調優(netstat監控大量ESTABLISHED連接與Time_Wait連接問題)

r報錯 nginx vim 個數字 syn攻擊 並發 tco dir XML netstat監控大量ESTABLISHED連接與Time_Wait連接問題 問題描述: 在不考慮系統負載、CPU、內存等情況下,netstat監控大量ESTABLISHED連接與Tim

springboot構建rest服務,打包docker鏡像

eas mod 過程 output key spring odin fig ted 場景 項目提供rest服務,需要導出rest接口文檔,並把服務打包成docker鏡像。 過程 1.使用SpringBoot實現rest服務 Maven的pom.xml <project

spring與dubbo分布式REST服務開發實戰

spring boot spring dubbo 分布式服務架構 本課程主要是使用 Spring技術棧 + dubbo 開發一個類似當當的圖書電商後臺的實戰教程。課程特點:1.課程的技術體系足夠系統、全面以及細致:課程中涉及的主要技術包括:Spring IO (依賴版本管理),Spring B

服務能測試 TPS

不同 基本 系統負載 時間設置 負載 衡量 nbsp bsp 處理 針對服務器端的性能,以TPS為主來衡量系統的性能,並發用戶數為輔來衡量系統的性能,如果必須要用並發用戶數來衡量的話,需要一個前提,那就是交易在多長時間內完成,因為在系統負載不高的情況下,將思考時間(思考時

論用例健壯的重要

做了 不同 聯想 否則 span 不能 col 等級 use 最近出了2個類似問題,此處寫下,以作為警醒 問題1: 背景:電商類網站,為了增加用戶回流,增加用戶購買力度,做了一個和用戶等級相關活動 需求:用戶等級為g0 -g5,現在有一批代金券有等級領取限制。用戶等級和代金

【轉】 提升tomcat服務能的七條經驗

ipv tde 內核 兩個 backlog 完成 退出 追加 大量數據 在線上環境中我們是采用了tomcat作為Web服務器,它的處理性能直接關系到用戶體驗,在平時的工作和學習中,歸納出以下七種調優經驗。 1. 服務器資源 服務器所能

請求部署在 IIS7.5 上的 REST 服務的 Put/Post/Delete 操作發生 HTTP Error 405.0 - Method Not Allowed 錯誤之解決

超文本 sha 參考 handlers ron bapi .com rest 通過 背景 請求部署在 IIS7.5 上的 REST 服務的 Put/POST/DELETE 操作發生 HTTP Error 405.0 - Method Not Allowed 錯誤。 Issu

Jmeter監控服務

art filename new t conn 監控服務 出現 版本 int 1.3 JMeter是一款壓力測試工具,我們也可以用它來監控服務器資源使用情況。 JMeter正常自帶可以通過Tomcat的/manager/status來監控服務資源使用情況。這種情況只能監控T

jmeter安裝以及監控服務能指標_華山

jmeter 性能測試 安裝jdk並配置環境變量系統準備安裝“原料”將apache-jmeter-2.13壓縮包解壓到C盤配置jmeter環境變量進入jmeter的bin目錄,找到jmeter.bat,右鍵發送到“桌面快捷方式”雙擊快捷方式,啟動jmeter啟動成功,說明之前的配置都是正確的關閉jme

通過Spark Rest 服務監控Spark任務執行情況

com 理想 ask cin *** lib add pan etime 1、Rest服務   Spark源為了方便用戶對任務做監控,從1.4版本啟用Rest服務,用戶可以通過訪問地址,得到application的運行狀態。   Spark的REST API返回的信息是JS

Web應用服務能壓力測試

簡單的 測試的 content 問題 容錯能力 b站 定性 benchmark testin 壓力測試需要關註三個方面:如何正確產生壓力、如何定位瓶頸、如何預估系統的承載能力產生壓力的方法 通常可以寫腳本產生壓力機器人對服務器進行發包和收包操作,也可以使用現有的工具(像jm

Linux服務能壓力測試

mips 定時 utc tex 5.0 -s locks dir 使用 對於新采購的服務器,需要進行有必要的性能測試。這裏選擇UnixBench工具進行性能測試。記錄如下: 1)安裝使用下面的腳本使用了最新版UnixBench5.1.3來測試,註釋了關於graphic的

服務主機安全考慮

sha ast 網絡隔離 size 關閉 運維 熱備 log 高性能 主機安全包括網絡安全和功能安全(姑且用這個詞,指業務服務正常可用)一、服務主機網絡安全網絡規劃,把服務主機與辦公網絡隔離1、關閉不必要的服務 2、保持所有服務軟件的更新 定時更新 3、設置防護墻 4

Python正則表達式返回首次匹配到的字符及查詢的健壯

ror exe https -m rec last first sta clas re.findall(pattern,string)會搜索所有匹配的字符,返回的是一個列表,獲取首個匹配需要re.findall(pattern,string)[0]訪問, 但是如果finda

jmeter 多機負載壓測與服務能監測

seve gpo 負載 壓測 jmeter 虛擬 prop 修改 禁用 一、 多機負載壓測: 1、修改jmeter.properties配置文件 remote_hosts=127.0.0.1 remote_hosts=192.168.1.133:1099 2、啟動 控制

JMeter PerfMon Metrics Collector服務能監控插件

plugin tps mdr pan mage serve 添加 bin lob 官方文檔地址https://jmeter-plugins.org/wiki/PerfMon/ 啟動JMeter,下載客戶端插件: 服務端下載地址 https://git