我有一個兩難之間的特定表格的處理,也許你能幫助我。
我有一個表,其功能是作爲一個工作隊列。記錄被插入並需要處理。記錄處理完成後,將從隊列中刪除。 有幾個限制:
- 只有一個實體可以處理在任何給定時間的記錄(以及由「實體」,我的意思是:一個線程,或連接到同一個數據庫在單獨的計算機)
- 實體有些動態。它們可能會發生變化(實體數量或特徵)
- 實體處理1個事務中的記錄
- 處理必須並行發生(如果entity1選擇batch1,entity2必須能夠並行處理batch2,而不必等待使用實體來完成處理)
- 一旦實體回升記錄處理,記錄整個「批」這一屬於,不得被其他實體來採摘。當我說 「批量」,我的意思是表(邏輯)安排如下:
- ROW1(BATCH1)
- 2行(BATCH1)
- ROW3(batch2)
- ROW4(batch2)
- ROW5(batch2)
- ....等。
因此,可以說使用實體和ENTITY2既要挑從表中處理芯片。 如果使用實體挑選ROW1,然後ENTITY2可以挑選任何其他除外BATCH1(任何其他除外ROW1和2行)。
讓抽象的處理部分,因爲它並不重要的實際處理是什麼。我很想知道如何才能阻止實體之間的衝突,只使用一個mysql數據庫,但也保持處理的並行性質。
從我的角度來看,我看到了兩個很一般方向:
- 使用某種狀態字段,這表明一個特定實體已經選擇了一個批次,而這一次必須從未來的排除選秀權。這個想法的缺點是,如果挑選批次的實體崩潰,那麼恢復其他實體的處理有點困難。
- 下使用mysql的鎖,其具有的缺點是很難保證的並行處理,而不是連續的。例如我可以做一個select ... for update,用於entity1。但是entity2不能執行相同的select ... for update,因爲這會等待第一個實體在獲取所需批次之前完成處理。
我想知道:
- 將導致最小的編碼工作的方向
- 是否有任何其他的方向,我在這裏失蹤(記住,實體不能保持溝通除非通過數據庫)
- 如果有這種問題的標準模式
- 如果您可以指向我的文章辯論這類問題。
- 什麼是解決這個問題的最有效的方法。
因此,我在這裏的是,數據庫必須拆分表不同實體之間進行處理,並想知道做到這一點的最好辦法。我幾乎認爲我是第一個處理這個問題的人,並且想知道你的想法。 另外,請注意,這些記錄可分批通過一個非常簡單的標準(比如,batchId)
親切的問候,
安德烈被拆分。
請添加一些格式到您的問題和要求特定的東西,它將很難通過這個長長的描述。 – Rachel
謝謝;格式添加。我同意它有點長,但不能做其他事情。第一部分總結了描述;第二部分增加了一些解釋。 – Andrei