我正在構建一個涉及重要圖像處理的應用程序。我們正在建立一個分佈式莊園,任意數量的渲染機器接收來自RabbitMQ交換機的圖像渲染請求。正在使用mySQL列來實現全局鎖定嗎?
由於在渲染過程中可能會有圖像請求,並且因爲我不想讓兩個渲染服務器重複工作,所以我在mySQL圖像表中創建了一個名爲is_rendering的列作爲布爾值。
當渲染服務器收到使其遵循一系列的步驟,看起來像這樣的請求:
- 選擇用於更新的圖像行
- 如果is_rendering ==真中止呈現請求
- 設置is_rendering == true並提交事務
- 渲染圖像並將縮略圖存儲在全局可訪問的商店中
- 設置is_rendering == false並返回
它絕對有效,但我擔心這些頻繁的數據庫更新似乎有點愚蠢。此外,我正在考慮渲染服務器在渲染過程中失敗的邊緣情況,並將is_rendering == true離開,從而阻止渲染該圖像。我正在考慮解決此問題的解決方案是將is_rendering列從tinyint(1)更改爲datetime字段,並將鎖定日期存儲爲「true」值,將null作爲「false」值存儲。週期性的服務運行狀況檢查可以在特定時間段內選擇所有具有is_rendering值的行,並在這種情況下釋放鎖。
這是一個理智的方法來解決這個問題,還是有其他更優雅的方法,我應該考慮?
我已經成功實施了多次日期時間字段鎖定方法 – ilanco 2012-04-28 22:40:06
除了引入這樣的列之外,我沒有看到任何其他鎖定方式。只有我會讓它成爲一個狀態,比如'0 = not_rendered,1 =渲染,2 =渲染'。但是也許我誤解了你的工作流程。當然,使用'InnoDB'事務將確保只有一個併發查詢可以將圖像設置爲呈現狀態。 – 2012-04-28 22:40:47
這個方法本身是否合理我不知道,但作爲一個列的另一種選擇,單獨的1:1'is_rendering(int)'表似乎更易於管理。只需添加/刪除記錄,您就不必掃描健康檢查中的所有圖像記錄。但是,如果您同時需要圖像本身,則可能需要額外的工作。 – mkjeldsen 2012-04-28 22:43:08