當您放置一個集合時,您要麼插入整個集合,要麼將現有集合替換爲一個資源。它與GET,DELETE或POST集合非常相似。這是一個原子操作。使用是作爲替代個別呼籲PUT聯繫人可能不是很RESTfull(但這是真正開放的辯論)。
您可能想看看HTTP pipelining併發送同一套接字的多個PutContact請求。通過每個請求,您可以返回該單個請求的標準HTTP狀態。
我在過去使用SOAP實現了批量更新,並且在系統加載時我們遇到了一些無法預料的問題。如果你不注意,我懷疑你會遇到同樣的問題。
- 例如,數據庫可以在批量更新的中間超時和所有的地獄中失敗兩方面打破了鬆動,可靠性,交易等,以及可憐的客戶必須弄明白髮生了什麼實際進行了更新,並嘗試再次。
- 當有太多記錄要更新時,HTTP請求會超時,因爲我們花費的時間太長。這打開了另一罐蠕蟲。
- 另一個問題是我們在更新過程中會接受多少數據?足夠的10MB的接觸?也許1MB?內存使用和安全性方面,較大的緩衝區有很多含義。
因此,我建議查看HTTP pipelining。
更新
我的建議是處理批創建聯繫人作爲一個異步的過程。假設「工作」與「批量創建」過程相同。因此,該服務可能如下所示:
public class JobService
{
// Post
public void Create(CreateJobRequest job)
{
// 1. Create job in the database with status "pending"
// 2. Save job details to disk (or S3)
// 3. Submit the job to MSMQ (or SQS)
// 4. For 20 seconds, poll the database to see if the job completed
// 5. If the job completed, return 201 with a URI to "Get" method below
// 6. If not, return 202 (aka the request was accepted for processing, but has not completed)
}
// Get
public Job Get(string id)
{
// 1. Fetch the job from the database
// 2. Return the job if it exists or 404
}
}
後臺進程是從隊列中可以更新數據庫或交替進行投入到服務,以更新作業的狀態運行,並完成消費的東西。
你需要另一種服務,通過剛加工,地址錯誤等數據進行導航。
您後臺進程可能需要寬容驗證錯誤。如果沒有,或者如果你的服務做驗證(假設你是不是做數據庫調用等,爲它的響應時間不能得到保證),你可以返回一個結構類似,其中包含您的客戶端來解決這個問題,並重新提交請求足夠的信息CreateJobResponse。如果您必須進行一些費時的驗證,請在後臺進程中執行此操作,請將作業標記爲失敗並使用允許客戶修復錯誤並重新提交請求的信息更新作業。這假定客戶可以通過工作失敗的事實做些事情。
如果創建方法打破了作業請求成許多較小的「工作」你必須要處理的事實,它可能不是原子,並造成諸多挑戰監視作業是否已成功完成。
什麼保證你有沒有在服務器上請求尺寸方面,你的數據庫的用戶數量,用戶類型,數據的質量,時間限制和可靠性?這些會影響您可以使用的設計選擇? – bloudraak 2012-03-01 21:00:56
我有一個API爲每個API請求創建1個作業。到目前爲止,API一次只能完成1項工作。這種限制已經引起了大客戶的頭痛,他們需要提出多達200,000個請求。每個單一的API調用都會作爲一條消息進入Amazon SQS,因此併發性一直不是問題,僅僅是讓大量客戶感到頭疼。謝謝! – 2012-03-01 22:02:41
您的業務流程是否允許異步處理?例如,當我在一家我們曾經在排隊計算報價的保險公司工作時,客戶提交了數據,並且必須在報價創建時進行輪詢。這取決於可用資源,從第二或第二到第三十分鐘採取任何措施。 – bloudraak 2012-03-01 22:14:35