重要な画像処理を伴うアプリケーションを構築しています。RabbitMQ交換から画像をレンダリングするリクエストを受信する任意の数のレンダリングマシンを使用して、分散マナーで構築しています。
レンダリングがすでに処理されている間に画像のリクエストが届く可能性があり、2つのレンダリングサーバーで作業を複製したくないため、mySQL画像テーブルにis_renderingという列をブール値として作成しました。
レンダリングサーバーがレンダリングの要求を受信すると、次のような一連の手順に従います。
- 画像行を更新するために選択します
- is_rendering==trueの場合レンダリング要求を中止します
- is_rendering == trueに設定し、トランザクションをコミットします
- 画像をレンダリングし、サムネイルをグローバルにアクセス可能なストアに保存します
- is_rendering == falseを設定し、
それは間違いなく機能しますが、これらの頻繁なデータベース更新が少しばかげているように見えるのではないかと心配しています。さらに、レンダリングサーバーがレンダリングの途中で失敗し、is_rendering == trueのままになって、その画像がレンダリングされないようにするエッジケースを検討しています。この問題に対して私が検討している解決策は、is_rendering列をtinyint(1)からdatetimeフィールドに変更し、ロックの日付を「true」値として保存し、nullを「false」値として保存することです。定期的なサービスヘルスチェックでは、特定の期間を過ぎたis_rendering値を持つすべての行を選択し、この場合はロックを解除できます。
これはこの問題に対する正しいアプローチですか、それとも私が検討すべき他のよりエレガントなアプローチがありますか?