我正在使用WCF服務來幫助我們的新代碼與舊系統進行互操作。該過程如下所示:WCF服務只有在客戶端收到結果時才寫入日誌
- 客戶端通過請求傳統系統來調用該服務。
- 服務將請求寫入數據庫。
- 傳統的系統服務請求從DB自己的時間,並寫入結果回數據庫(更新狀態標誌說結果準備)。
- 客戶端通過調用第二個服務方法來檢索結果,該方法輪詢數據庫,直到設置就緒標誌。
- 就在返回結果之前,服務將狀態標誌更新爲客戶端的結果爲,以便可以刪除相關的DB行。
我擔心的是最後一步的競賽狀況。我可以看到這樣的情況:
- 服務的更新狀態客戶端有結果。
- 客戶端在等待服務輪詢數據庫後超時。
- 服務嘗試返回結果。歡鬧隨之而來。
解決此問題的一種方法是有三個服務調用而不是兩個:第二個調用檢索結果,最後一個是客戶端顯式確認它具有它們。我想知道是否有一種方法不會給客戶帶來額外的「協議」負擔。
我已經簡要介紹了在WCF中使用事務,聽起來他們可能能夠做我需要的事情。客戶端(可選)啓動一個事務,將其傳遞給服務,如果它存在,服務將使用它,並在完成時提交。這看起來好像它隱含地做了「第三次電話」。
這個想法有什麼優點嗎?你能看到什麼缺點?我還可以探索其他途徑嗎?
感謝您的回答!對服務進行投票的理由是,只有一個地方可以制定調查數據庫的頻率政策,而不是將其交給個人客戶。如果我們部署並發現我們正在狠狠地抨擊它,那麼我們不需要推出數十或數百個客戶端更新。沒有人說這是做互操作的一種優雅的方式,唉:)你從來沒有100%肯定的觀點是好的,但交易(如果他們以我認爲他們這樣做的方式工作)具有超時的好處,並被回滾如果沒有承諾。 – shambulator
@Anton:如果您擁有客戶端代碼,那麼您可以在調用(nother!)服務的客戶端中添加一些邏輯,以詢問客戶被允許調用「我的結果就緒」服務的頻率。通過這種方式,您仍然可以通過在一個地方(服務器端)更改閾值來限制客戶端調用;你不需要更新客戶端上的代碼來完成它。 – razlebe
@Anton:另一個建議:服務器端的工作是否足夠可預測,以便您可以計算結果何時準備好的估計值,並將結果傳遞給客戶端(實際上,調度第一次客戶端調用結果)? – razlebe