9

我們從供應商那裏獲得併發回調到我們的Web應用程序,我們懷疑它會導致我們丟失更新,因爲它們在不同的機器上同時處理。如何並行處理大部分作業,然後序列化一個子集?

當且僅當它們影響相同的用戶記錄時,我們需要將這些調用的處理序列化爲

我的一位同事提出了AWS Kinesis流,我們使用用戶ID作爲分區鍵。這個想法是,相同的分區鍵將記錄放在同一個分片中。每個分片只由一名工作人員處理,並且不會有併發問題。通過設計,將保證屬於同一用戶的記錄不被並行處理。這個解決方案擴展並解決了這個問題,但它會讓我們至少恢復一次衝刺。

我們正在努力尋找可以更快部署的解決方案。

到目前爲止,我們已經討論了

其他的解決方案:

  1. 只需延遲迴調的處理,有可能通過隨機的時間量。在這種情況下,幾個工人同時爲同一個用戶處理工作仍然是可能的(雖然不太可能)。
  2. 任何排隊系統都有缺陷,我們要麼限制在一個工人身上,要麼冒着並行處理的風險,或者像(1)中所述的那樣。

我們正在使用MySQL的Rails堆棧,並且偏向於AWS解決方案。

有沒有解決這個問題的方法,比切換到Kinesis會產生更快的結果?

回答

0

您基本上正在尋找命名分佈式鎖,以便您可以執行串行處理。

如果您在AWS中,可以使用每個customerId將記錄推送到DynamoDB。

每次獲取處理記錄時,請執行一致的讀取(請參閱此處的併發性部分:http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/APISummary.html)。

如果存在記錄,請向其添加消息(一致寫入)。讓正在處理的進程在完成後執行讀取操作,並且如果有消息被追加到發電機記錄中,則將它們串行處理。最後刪除記錄。

有可能你會得到比賽條件,所以你需要做一個補償和重試。我不知道你的音量是多少,但迪納摩速度非常快,所以碰到這種情況的可能性很小。如果失敗次數太多,您可能必須將某些內容轉儲到錯誤隊列中進行清理,但這不太可能。特別是如果你的音量允許你考慮像消息處理任意延遲的解決方案。

0

只有一些理論上的輸入:

如果您有在技術上獨立的,你需要的是將其標記爲依賴或獨立,確保執行順序的序列ID的語義識別回調。用戶ID不夠用。如何確保一個用戶的並行Web請求的正確數據庫執行順序?

如果您擁有唯一的事務id,則可以應用隔離級別(如序列化)。但是在這種情況下,對於「你的」丟失更新也不是無懈可擊的。除非您沒有序列號(版本)和鎖定機制,否則它們也會在您使用序列化時發生。

如果您的意思是「丟失的更新」以避免誤解,請確保您談論「覆蓋未提交的數據」。這將至少用隔離級別「可重複讀取」進行處理。

相關問題