セットアップは Rails 3 で、ロード バランサーの背後に 6 つのアプリ サーバーと 1 つの PostgreSQL データベースがあります。
私たちのアプリでは、ユーザーはパフォーマンス中に「チップ」とアーティストをすることができます。
プロセス フローは次のようになります。
- ユーザーが「ヒント」ボタンをクリックする
- ヒント オブジェクトが作成されます
- after_create コールバックは、ユーザー アカウントに十分なお金があることを確認します。それ以外の場合は、ロールバック例外が発生します。
ユーザーがヒント ボタンを「スパム」すると、複数のヒントが同時に処理される可能性があります。これが発生すると、「このユーザーは十分なお金を持っていますか?」check は、金融取引がまだ発生していないため、多くのヒントに対して同じ値を返します。
必要なのは、各「ヒント」が順番に処理されるようにすることです。そうすれば、ヒント #2 の残高チェックは、ヒント #1 が残高を更新する前に行われます。
私たちはすでに Resque を他のものに使用しているので、それが 1 つの解決策になるかもしれません。複数の作品が並行してジョブの処理を開始して同じ問題を引き起こさないようにする方法はわかりませんが。私たちのアプリは特定の瞬間に多くのチップを処理するため、1 人のワーカーにチップの仕事をさせることは現実的な解決策ではありません。