シンプルなユースケースでは Redis を分散ロックとして使用する

最近、システムの問題に遭遇しました。Ruby Rake タスクとして記述されたバッチ ジョブの一部が重複呼び出しになり、データベースのレコードが重複するか、Slack でアラートが重複するという問題です。これは間違いなくインフラの問題ですが、インフラ側で修正されるまでは、コーディングの観点から対処する方法を見つける必要があります。すべてを可能な限りべき等に書き直すことは選択肢ではなく、アプリケーション レベルの検証やデータベースの一意性制約を強化することも選択肢ではありません。すべてのジョブがべき等になるわけではなく、すべてのジョブがデータベースに書き込むわけでもないからです。さらに、問題は 2 つのスレッドではなく 2 つのプロセスの競合状態によって引き起こされます。調査と実験を行った後、シンプルな分散ロック ソリューションとして Redis を使用することにしました。これは既にアプリケーションで使用可能で、追加の設定は不要です。また、単一インスタンスであるため、レプリケーション同期の懸念もありません。Redis はシングル スレッド アーキテクチャであるため、同時にいくつのクライアントが書き込もうとしても、シーケンシャルかつアトミックであることが保証されます。私はこの性質を利用して、直面している問題を解決できると考えました。

Redis データベース移行

Redis の迅速な移行を実行するためのコマンドのリスト。