2010-06-22 54 views
11

在SOA中,我們不應該在客戶端和服務器之間建立或保持狀態(或設計依賴關係)。這是可以理解的。但是,如果客戶想要使用可能返回開放式數量的「行」的實時服務,那麼可以遵循哪些模式?SOA/Web Service分頁

Web應用程序類似於SOA,但允許狀態(會話)已通過分頁解決了這一問題。分頁需要(在大多數情況下,特別是在SQL中)服務器保存數據並且客戶端以塊的形式請求數據。

如果我們在哪裏考慮Web服務的分頁式場景,那麼遵循什麼樣的模式,仍然可以遵守SOA(或儘可能地接近)的原則。

的思想家的一些規則:由SQL數據庫支持 1)(因而在選定的一組沒有行號的概念) 2)不跳過行或重複行是很重要的分頁 3)數據可以被插入時設置以及其他客戶 4)無需考慮數據集的實時(更新能)數據集

個人在任何時間刪除到數據庫中,我認爲1上述2已經通過限制解決方案空間與需求來拼寫我們的解決方案。

我建議的解決方案應該將數據(與選擇的一樣多)存儲在只讀存儲器/緩存中,可以在結果集中爲其分配行號,並允許在此數據快照上進行分頁。我有基礎設施來存儲快照(服務器,外部緩存,memcached或ehcache - 這必須相當大)。這種查詢的結果是一個快照ID,客戶端可以使用快照API(Web服務)和快照ID從快照中檢索數據。在x是合理的情況下,結果將以x只記錄的只讀方式進行處理。

不勝感激的想法和想法,批評或讚譽將不勝感激。

+0

我會告訴你twitter如何處理他們的分頁。這可能對您有所幫助https://dev.twitter.com/rest/public/timelines – 2014-10-06 05:33:09

回答

0

Web服務中的分頁結果實際上很容易實現。

您只需將兩個參數添加到Web服務調用中:頁面大小,頁碼。

頁面大小是要包含在頁面中的結果數量。頁碼是您正在查找的結果頁面的編號。

將您的網絡服務可以追溯到數據庫(或高速緩存),retreives結果,計算出所請求的頁面結果符合,只有返回這些結果。

然後,客戶端必須對他們希望從服務獲得的每頁結果提出一個請求。

+1

謝謝 - 但不符合要求。回到數據庫不能提供一致的結果,數據可以在調用之間添加,刪除或更改,從而使一致性變得困難。您可以通過這種方式跳過行,因爲上面刪除了數據。如果排序標準我們不是唯一的,你也不能保證順序。請記住,我正在尋找一種我可以全球應用的模式,也可以解決這些問題。不錯,儘管。 – cmdematos 2010-06-22 19:26:03

0

您對memcached的建議也適用於緩存表。第一次服務調用將(1)INSERT結果返回到具有快照ID的緩存表(2),返回緩存表中的第一頁和快照ID。隨後的調用將通過使用快照ID查詢緩存表來根據頁面大小和頁碼返回頁面。

我覺得這也可以通過使用一個內存中緩存表的優化,但是這取決於你的數據庫是否支持INSERT-INTO從磁盤表在內存中的表。儘管如此,這可能會在集羣環境中變得複雜。

這樣的緩存是其本質狀態,如果你保持請求之間的特定客戶端拷貝,存儲是否在一個會話對象,數據庫表或memcached的數據存儲。儘管有這些要求,但您別無選擇,只能以某種形式緩存結果,除非您有機會將已刪除或不再相關的記錄作爲合法結果返回。

1

SOA並不意味着這種低級功能。

SOA是爲了業務領域,而不是前端到後端粘合在一起。不是因爲您的應用程序使用Web服務與後端進行對話,而是使用「SOA」應用程序。這是沒有意義的,因爲SOA在1個孤立系統的背景下是沒有意義的。

從這個角度來看,它是那麼清楚,在SOA中,主叫方不應該對你的分頁SQL表知道,這是一個實現細節,SOA應該隱藏。另一方面,服務器不應該知道客戶的狀態,因爲它應該是不可知的客戶的細節,真正開放。

所以,只要明白分頁不是SOA。按照你的意願去做,只要理解你用來分頁的web服務是應用程序的內部工件,而不是用於SOA總線中的外部客戶端。另請記住,它不能與服務器中的輸出狀態保持一致。可能問題在於,您只有一個服務層用於應用程序的UI和SOA總線,您需要將它們分開。

在SOA總線使用此WebService會很糟糕。當用戶分頁並且其他應用程序掛起時,我無法保持一致,因此它們與特定的SQL綁定。

...那你還不如直接授予SQL訪問表的所有事項。

SOA是系統之間的業務信息,而不是膠水的應用程序的前端到後端。

+0

我將不勝感激評論的投票。如果是因爲我的寫作,我很抱歉,仍然有評論會有所幫助。如果確實是因爲你認爲SOA中的分頁是正確的,請再檢查一次,事實並非如此。我建議:http://blogs.msdn.com/b/rogerwolterblog/archive/2006/04/20/580353.aspx – 2013-09-30 22:24:55

0

同樣的問題,使用Navision方法解決。

$ws->getList($first_record_id, $limit) 

這個返回$限制元素的頁從傳入ID

select * from collection where collection.id > $first_record_id ASC limit $limit 

通過ID ASC下令開始

Navision的使用密鑰(每個元素都有一個鍵),但在MySQL自動增量id更好。

在這種情況下分頁是用於處理大的結果集,而不是一個前端分頁...

0

我不知道,如果SOA是關注在這裏。你的問題似乎與您的API分頁。我會告訴你twitter如何處理他們的分頁dev.twitter.com/rest/public/timelines