SOA帶來的效能思考

2021-08-24 19:10:44 字數 3763 閱讀 4349

做效能測試的乙個專案,仔細觀察了sotown的框架,有了乙個思考,soa的效能如何?

soa 的優點

我已經在前面幾個關於soa的文章中,其中soa優點也是ibm soa 架構師認證考試中重點提到的soa的優點。

敏捷性。組 成 soa 應用程式的**是模組化的;換句話說,**被包含在可重用的塊中,可以用這些**塊構建其他應用程式。可以通過抽象進一步提高程式設計生產力,抽象把技術細節 (比如程式語言、伺服器平台和作業系統、應用伺服器型別、dbms、資料庫模式等)隱藏在提供服務的程式後面,服務消費程式的開發人員看不到,也不需要了 解這些細節。當發現新的應用程式功能需求時,soa 使組織的 it 人員能夠快速地做出反應。

質量。復 雜應用程式的結構就像是一團亂麻,在程式和資料庫物件之間存在著許許多多點到點連線。(一團亂麻這個比喻不是我說的,我最初是聽一家金融公司的 it 執行官這麼說的。)soa 會大大減少應用程式中連線點的數量,並大量使用標準語言描述應用程式提供的服務(web services description language[wsdl] 是用來描述服務的一種 xml 格式)和呼叫服務(常常通過另一種 xml 格式 ****** object access protocol[soap] 來實現)。簡化的 soa 結構會降低應用程式的脆弱性;也就是說,**修改不容易損壞應用程式。

運營靈活性。在 soa 中會使用抽象和標準介面,這意味著 it 系統人員可以為應用程式基礎結構的不同部分使用不同的平台和作業系統。還可以混合使用不同的程式語言、dbms 和應用伺服器。

聽起來不錯,不是嗎?

soa 的效能可能會成為問題,這是因為抽象要通過額外的**來實現,這通常會增加機器指令路徑長度。減少應用程式元件介面也會增加路徑長度(為了處理一團亂麻的 點到點連線,必須增加集中式服務訪問基礎結構)。因此,就出現了乙個問題:基於 soa 的應用程式能夠產生良好的效能嗎?我的答案是 「可以」。我相信產生良好的效能取決於三個關鍵措施:對修改資料的操作使用非同步處理,對資料獲取請求進行快取,對批作業進行事務化處理。

非同步處理。在 本文中,我將討論如何解除應用程式的客戶端與後端資料庫修改之間的關聯。例如,假設一位使用者通過零售商的基於 web 的銷售應用程式提交了乙個訂單。這個操作會在應用程式所用的資料庫中進行一些修改。如果應用程式是基於 soa 的,那麼與老式的整體式體系結構的應用程式相比,使這些資料修改生效所需的時間會長一些。但是,這是否意味著在單擊 「submit」 之後使用者必須等待更長時間呢?不一定。

假設當把使用者的訂單資訊放到乙個訊息佇列中之後(佇列可能由 ibm 的 websphere mq 管理),訂單輸入應用程式就認為事務已經結束。這個過程會非常快。佇列可以配置為可恢復的資源,所以即使整個應用程式系統崩潰了,仍然可以保留訂單輸入數 據。使用者可以做其他事情,與此同時乙個過程從佇列中取出訂單資訊訊息並適當地修改資料庫。

這樣做會有風險嗎?是 的,但是我認為風險不大。因為訂單輸入資料庫的更新對於終端使用者對 「submit」 的單擊操作是非同步的,所以如果使用者馬上單擊訂單確認頁面上的 「view order history」 鏈結,那麼產生的檢視很可能不包含剛才提交的訂單。如果還沒有用 mq 佇列中剛才提交的訂單資訊更新(獲取 「訂單歷史」 資訊的)資料庫,就會發生這種情況。我相信這種風險變成現實的可能性相當小,因為使用者很可能過幾秒才會想要檢視訂單歷史,他還要花時間找到並單擊 「view order history」 鏈結。對於訂單輸入應用程式的後端從 mq 佇列中獲取訂單資訊訊息並相應地修改資料庫來說,幾秒時間應該足夠了。

通過對資料庫更新操作使用非同步處理,可以 改進效能(從使用者的角度來看);另外,mq 還會提高應用程式的可用性(同樣是從使用者的角度來看)。如果後端資料庫系統無法執行更新處理(可能由於伺服器或作業系統故障、程式邏輯錯誤或資料庫維護操 作),前端佇列仍然能夠接收訊息,應用程式仍然可以向單擊 「submit」 按鈕的使用者顯示 「order received」。訊息會儲存在佇列中;當資料庫恢復正常時,就會繼續處理訊息。同樣,在使用者的 「submit」 單擊操作和對應的後端資料庫更新之間增加乙個佇列,也有助於避免後端伺服器負載過大,伺服器負載過大可能導致系統崩潰和非常顯著的應用程式服務停頓。(在 這種情況下,訊息佇列的作用相當於汽車引擎的膨脹罐,這個裝置有助於避免引擎過熱。)

對資料獲取操作進行快取。同 樣,這個思想也是使用技術和應用程式體系結構讓 soa 發揮其優勢(敏捷性、質量和靈活性),同時產生使用者滿意的效能。資料快取的概念相當簡單:把經常獲取的資料拷貝儲存在接近應用程式體系結構邊界的快取服務 器上,這樣的話資料獲取請求就不必通過很長的路徑訪問後端資料庫(記錄資料庫)。在資料快取技術中,比較複雜的問題是如何以及時精確的方式把後端資料庫的 更新傳播到快取伺服器。這個問題是可以解決的,而且不同的組織採用不同的方法更新資料快取伺服器。一些組織採取 「自產」 的辦法,利用自行開發的**使中間層資料儲存與後端記錄資料庫保持近似同步(從技術上說,可以讓快取資料儲存與後端資料庫保持絕對同步,但是近似同步的開 銷通常比較小,而且常常足以滿足使用者的需要)。其他組織使用不同廠商提供的資料快取解決方案。無論資料快取實現是自行開發的,還是購買的,組織都能夠通過 使用資料快取顯著改進資料獲取效能。在 soa 環境中,不同的功能層、抽象和基於標準的應用程式子系統介面以及與 soa 特有資料的關聯都會增加事務響應時間,資料快取產生的速度收益可以抵消這些時間開銷,所以在 soa 環境中尤其有意義。

對批作業進行事務化處理。我 在以前的專欄文章 「do you mq?」 中討論過批量事務化(參見參考資料)。這種技術的基本思想是,對於乙個批量輸入檔案包含的所有記錄,按照事務程式輸入的形式來處理。這通常需要在批作業開 始時增加乙個步驟,讀取輸入檔案記錄並把包含的資訊放到乙個佇列中的訊息中。連線這個佇列的應用程式可以讀取訊息並執行程式邏輯來處理輸入資訊(這個處理 過程可以包括資料庫更新)。與這個訊息處理過程相關聯的輸出資料也可以放到乙個佇列中的訊息中,輸出最終可以組合成乙個檔案並傳輸給客戶機。

當然,與傳統的批處理形式相比,以這種事務化方式處理批檔案的 cpu 效率並不高;而且如果事務以序列方式執行,採用事務化方式會增加處理輸入檔案所需的時間。並行地執行事務(也就是,讓多個同時執行的事務處理輸入檔案記 錄,而不是在乙個事務內實現並行)可以顯著減少所需的時間,但是這要求伺服器上的 cpu 足以支援多執行緒(如果主機伺服器的空閒處理能力很少,程序就難以實現有效的並行)。

我並不擔心事務化批處理會導致在特定的時間段內集中過大的負載,相反,我認為事務化是消除傳統批處理時間窗的好方法。如果批處理已經事務化了,就不再需要以檔案形式接收輸入。乙個隊 列包含來自檔案的輸入記錄,這個佇列可以(以可靠的方式)作為 web 服務向最初傳送檔案的客戶機公開。這樣做的好處是,客戶機可以在生成輸入記錄時隨時傳送它們,而不必把記錄集中在乙個檔案中並在特定時間傳送。由於採用事 務化處理,與處理客戶機輸入記錄相關聯的輸出可以在生成時及時地返回給客戶機。因此,如果客戶機在上午 9 點生成輸入記錄並傳送給您的組織,那麼在上午 9:05 就能夠收到響應(甚至更快),而不需要等待 24 小時才收到包含其他許多響應輸出的批量響應輸出檔案。使用者會對組織離線地(也就是以非同步方式)處理輸入記錄的能力感到吃驚。這個特色會給您的組織提供重大 的競爭優勢。

思考 —— 但是要以不同的方式思考

soa 看起來似乎會損害效能,但這往往是一種誤解,在我的前一篇文章中也認為soa會有效能的開銷,比如esb。因為人們習慣於按照老式應用程式的思路考慮 soa 應用程式的效能。如果把 soa 應用程式看作完全不同於老式應用程式的工作方式,您就會發現不但能夠實現相似的效能,而且通過改進服務質量,客戶機的效能水平甚至可能出現重大突破。實現這個目標容易嗎?當然不。這涉及許多步驟:決定應用程式處理應該非同步執行還是同步執行,確定實現資料快取的方式和位置,決定如何在事務化環境中處理傳統的批功能,評估和實現企業服務匯流排和工作流組合技術以幫助設計和執行複雜的離線事務處理

危機帶來的思考

世界上已經發生了很多次經濟危機,中國人這次切身感受到了金融危機對大家生活的影響。這次金融危機對中國來說真正的走上經濟復甦,那就是房地產商的破產,和破產帶出來一些 汙吏的浮出水面。因為房地產商卷走了太多的人一生創造的財富,有很多人窮其一生竟僅僅是為了擁有一棟房子,而這部分人顯然成了新時代的房奴,也就是...

工作帶來的思考

2014 5月版本 事件 版本管理員離職 版本交付 新平台交接 開發人員程式已經完成,但是測試環境由開發人員裝版,整合環境直接拷貝了測試環境,沒有按照交付版本進行安裝,無法測試交付版本的完整性。專案管理方面 關鍵環節人員變動,需要及時安排跟進人員,並且並行一段時間直到新進人員完全接手工作,完成工作1...

C 棧帶來的思考

今天要講的總結下兩個要點 變數的生存期和記憶體管理機制是兩碼事 棧頂的位址是編譯時候確定的。上 class cc private int t public cc cc tt std cout 樓主深知看別人 的痛苦所以最大限度有最少 說明問題。那麼問題切入點在哪兒?當然是 t可能輸出正確了 原因正是...