2010-10-15 73 views
0

試想3分系統組成: 1.外部電子商務網站的服務來處理信用卡交易 2.本地數據庫來存儲處理結果 3.本地UI(或服務取勝)執行的支付處理客戶訂單文件架構穩健的支付處理

外部網絡服務顯然不是事務性的,所以如何保證: 1.即使數據庫在當時不可訪問,網絡服務接收到的結果最終仍會保留到數據庫中(網絡問題,數據庫超時) 2.防止客戶在客戶訂單處理客戶訂單時由其他客戶發起付款,但結果不符合essfully堅持數據庫(並在等待某種恢復隊列)

其目的是做處理非事務性系統組件,並保證交易將不會由其他進程在失敗的情況下重複。

(請看看它在後賣出支付處理,其中多個運營商可能會嘗試手動付款處理的情況下,不是web結賬應用程序)

回答

0

分佈式消息。

當您的支付網關返回時,將消息提交給一個持久隊列,以確保處理程序最終獲得並處理該消息。處理程序將更新數據庫。如果在此時發生故障,處理程序可以將消息留在隊列中或重新發送到隊列中,或發佈備用消息。

如果稍後發生使事務無效的事件,則可以排隊另一條消息以「撤消」更改。

最近有相當多的關於最終一致性和分發消息的嗡嗡聲。 NServiceBus是新的組件熱點。我建議看看這個,我知道我們是。

+0

這或多或少是我用MSMQ完成的,只是想看看其他人如何解決問題。我也檢查NServiceBus,這給了我一些額外的觀點。謝謝。 – Tomek 2010-10-16 15:58:18

1

在任何這樣的系統,需要強大的錯誤處理和錯誤報告。在處理付款時,這是非常正確的,在這種情況下,您絕對不想意外收取某人的錢並且不交付貨物。

由於您將付款處理外包給第三方,您最終非常依賴具有健壯的錯誤處理和報告系統的網關。

一般來說,您將控制權交給支付網關,並啓動等待網關響應的任務,即「接受付款」或「付款被拒收」。當你得到這個迴應時,你將進入你的過程中的下一步,並且一切都很好。

當你沒有得到所有(超時)響應,或響應是無效的,你再如何進行非常依賴於支付網關:

  • 如果網關支持其發送'取消支付'式的請求。如果付款成功取消,那麼您可能希望將用戶發送到「對不起,請重試」樣式頁面。

  • 如果網關不支持取消,或者您沒有與網關通信,那麼您需要手動(親自打電話等)與第三方聯繫,以發現問題所在以及如何進行。爲了幫助這一點,你需要轉儲儘可能多的細節你必須錯誤日誌,如日期/時間,客戶ID,交易價值,產品ID等

一旦你回到你的網站(和付款被接受),那麼你對錯誤的控制就更多了,但簡而言之,如果你不能完成訂單,那麼你應該將細節轉儲到磁盤(比如csv文件進行手動處理),或者聯繫網關取消付款。

它也值得有一個系統來追蹤錯誤發生的時間,如果發生過多的數字,那麼就要考慮應該發生什麼。例如,如果它是一個高流量的網站,您可能想暫時阻止更多的客戶在調查問題時下單。

+0

感謝Paul,同意錯誤處理和報告對於瞭解系統運行狀況和及時應對故障至關重要。儘管我的系統中沒有發生很多故障,但我一直在尋找更加穩固和自動化的方式來處理它們。感謝你的回答。 – Tomek 2010-10-16 16:04:49

1

詢問支付處理器是否可以根據您提供的訂單ID檢測到重複交易。然後,如果由於數據庫故障而無法存儲響應,則可以安全地重新提交請求,而不必擔心發生雙重充電(至少有一個我使用過的PSP在此場景中返回了相同的響應/授權碼,還有一個標誌說這是重複的)。

或者,您只需在訂單上設置一個標誌,在之前立即嘗試付款,如果標誌已設置,則不要嘗試付款。如果在付款過程中發生錯誤,您可以隨時調查和修復數據。

我不願意走下去嘗試自動取消訂單並重新提交的路線,因爲這只是令人困惑(例如,如果取消失敗 - 如果您重試或不重新?)。最好保持邏輯簡單,所以當出現問題時,你確切知道你的立場。

+0

在處理事務之前標記訂單的想法很有趣,現在只是在數據庫故障的情況下存儲事務結果的可靠方法......謝謝 – Tomek 2010-10-15 21:28:28

+0

假設支付服務有一個API調用,沿着「給我的狀態的交易「,你可以使用一旦數據庫恢復獲得並存儲結果?否則,他們肯定有一個Web界面,您可以使用手動查詢狀態並手動更新?聽起來有點毛骨悚然,但如果失敗不經常發生,那可能就足夠了。 – SimonJ 2010-10-15 21:41:21