2009-06-10 40 views
1

我想知道在處理返回XML的Web服務API時,是否更好(更快)每次調用外部服務並解析XML(使用ElementTree)以顯示在您的網站上或將記錄保存到數據庫(解析一次或每天需要多次),然後進行數據庫調用,以獲取相同的信息。解析外部XML或命中數據庫更高效嗎?

回答

4

在回答這個問題時,每個人都很有禮貌:「這取決於......」「你應該測試......」等等。

的確,這個問題沒有詳細討論涉及的應用程序和網絡拓撲結構,但如果問題甚至被問到,那麼可能是a)數據庫對於應用程序是「本地」的(在同一子網上,或者同一臺機器,或者內存中),以及b)web服務不是。畢竟,OP使用短語「外部服務」和「在自己的網站上顯示」。短語「解析它一次或無論你每天需要多少次」也表明一組數據不會每秒都發生改變。

傳統的SOA神話是網絡總是可用的;更進一步,我認爲網絡始終可用於低延遲是個謬論。除非您自己的內部系統是廢話,否則通過Internet發送HTTP查詢將始終比對本地數據庫或數據庫集羣的查詢慢。造成這種情況的原因有很多:遠程服務器的跳數,遠程或遠程無法控制的降級問題以及遠程Web服務應用程序分析您的請求的內部處理時間,自己的持久性後端(又名數據庫),並返回結果。

啓動您的應用程序。對數據庫執行一些延遲和響應時間。現在對遠程Web服務也一樣。除非您的數據庫也在互聯網上,否則您會注意到巨大的差異。

對於一個有能力的技術人員來說,擴展一個數據庫或者使用memcached和其他模式完全從緩存中刪除數據庫並不難;在數據中心中彼此靠近的服務器之間的延遲比互聯網上的機器之間的延遲小(並且更安全,可以啓動)。即使實現這種規模需要一些思考,它是在你的控制之下,不像遠程Web服務的縮放和延遲對你完全不透明。舉個例子,我認爲我網站的可用性和響應速度完全基於其他人的想法並不令人滿意。

最後,如果遠程Web服務不可用會發生什麼?設想一個世界,每個請求到您的網站涉及通過互聯網到其他網站的請求。如果其他網站不可用,會發生什麼情況?你的用戶是否在觀看幾個小時的旋轉光標?他們喜歡錯誤5​​00,而您的網站在這種意外的外部依賴關係上發揮作用?

如果您發現自己採用的架構的基本功能取決於每個請求的遠程Internet調用,請在決定是否可以承受後果之前仔細考慮您的應用程序。

+0

您是否仔細閱讀過這個問題?聽起來主要結果總是來自外部Web服務,所以網絡中斷已經是需要處理的事情了。 另外它聽起來像是有問題的Web服務只是客戶端主機的外部,但可能在本地事務的宏偉計劃。 – StaxMan 2009-06-11 02:29:12

3

消費Web服務更有效率,因爲您可以通過更多的事情來擴展Web服務和Web服務器(通過緩存等)。通過消費中間層,您還可以選擇更改返回的數據格式(例如,您可以決定使用JSON而不是XML)。縮放數據庫要困難得多(涉及複製等),所以一般來說,如果可以的話,減少對數據庫的命中。

6

首先關閉的措施。不要只假定一個比另一個更好或更差。第二,如果你真的不想測量,我猜數據庫要快一點(假設數據庫相對於Web服務而言是相對本地的)。除非我們談論一個非常複雜的數據庫或非常複雜的XML,否則網絡延遲通常不僅僅是分析時間。

1

在一般情況下沒有足夠的信息可以肯定地說。你爲什麼不做一些測試並找出答案?因爲它聽起來像你正在使用Python,你可能會想使用timeit模塊。

有些事情會影響結果:

  • 性能您所使用的Web服務的
  • 可靠性的網絡服務使用的是
  • 服務器之間的距離數據的
  • 金額是的返回

我猜如果它是可緩存的,緩存版本的數據將會速度更快,但這並不一定意味着使用本地RDBMS,它可能意味着像memcached或應用程序中的內存緩存中的內容。

+0

也許更重要的是:遠程站點更新的頻率與本地站點的訪問頻率。 – 2009-06-11 00:09:03

1

這取決於誰在調用Web服務?每次用戶點擊頁面時都會調用Web服務?如果是這種情況,我建議引入某種緩存層 - 許多Web服務API都會節省每小時可以產生的點擊量。

無論您選擇快速解析緩存的XML還是從數據庫中調用數據,都可能無關緊要(除非我們在此討論企業擴展)。就個人而言,我寧願做一個簡單的SQL調用,而不是編寫一個DOM解析器(這更容易出現異常情況)。

0

它依情況而定,你必須測量(或至少作出有教育的猜測)。

你必須考慮幾件事情。

Web服務

  • 它可能擊中數據庫本身
  • 它可以被緩存
  • 將推出網絡延遲,並可能導致不可靠的
  • ,也可能是在本地網絡和比訪問速度更快即使是本地磁盤

DB

  • ,因爲它需要訪問磁盤(儘管數據庫有內部緩存,但那些通常沒有針對性)
  • 應該是可靠的

技術本身並沒有多大的意義在速度方面可能很慢 - 在一種情況下,數據庫解析SQL,在其他XML解析器中解析XML,並且數據庫通常也通過套接字進行處理,因此無論在哪種情況下都有解析和網絡。

在您的應用程序中緩存數據(如果適用)可能是一個好主意。

0

正如少數人所說,這取決於,你應該測試它。

通常外部服務速度很慢,並且將它們本地緩存(在內存中的數據庫中,例如使用memcached)會更​​快。但也許不是。

幸運的是,它很便宜且易於測試。

0

確定測試。作爲一個經驗法則,XML適用於應用程序之間的通信,但是一旦將數據存儲在應用程序中,一切都應該放入數據庫表中。這可能不適用於所有情況,但95%的時間對我有用。任何時候,我曾試圖以任何其他方式存儲數據(例如內容管理系統中的XML),我最終希望自己能夠使用好的舊版sprocs和sql server。

0

這聽起來像你基本上想要緩存結果,並想知道它是否值得。但如果是這樣,我不會使用數據庫(我假設你正在考慮關係數據庫):RDBMSs不適合緩存;儘管許多人使用它們。你不需要持久性,也不需要ACID。 如果在Oracle/MySQL和外部Web服務之間進行選擇,我將從使用服務開始。

相反,考慮真正的高速緩存系統;本地或不是(memcache,簡單的內存緩存等)。 或者如果你必須使用數據庫,使用鍵/值存儲,BDB運作良好。將響應消息以其序列化格式(XML)存儲,嘗試從緩存中獲取,如果沒有,則從服務中解析。或者如果有一個方便和更緊湊的序列化,存儲和獲取它。

+0

爲什麼這會被拒絕?我認爲這是很好的答案:) – rick 2009-06-18 01:20:56