最近我遇到了一個系統問題,我們一些以 Ruby Rake 任務形式編寫的批次作業最終出現重複調用,這導致資料庫中出現重複記錄或在 Slack 中出現重複警報。這絕對是基礎設施問題,但在從基礎設施修復它之前,我需要從編碼角度找到解決它的方法。嘗試將所有內容重寫為盡可能冪等的並不太現實,增強應用程式級驗證或資料庫唯一性約束也不是一個選擇,因為並非所有作業都可以是冪等的,也並非所有作業都會寫入資料庫,此外問題是由競爭條件引起的,不是來自兩個線程,而是來自兩個進程。經過一些研究和實驗,我決定使用「Redis」作為一個簡單的分散鎖解決方案,它已經在我們的應用程式中可用,不需要任何額外的設置,而且它是一個單一實例,因此不需要考慮複製同步問題。 「Redis」 是單執行緒架構,無論有多少並發客戶端嘗試寫入它,它都能保證結果是順序的和原子的。我發現可以利用這種性質來解決所面臨的問題。
用於快速遷移 redis 的命令列表。