Node.js & Redis:
ゲームに参加するのを待っているユーザーのキューを保存する LIST (users:waiting) があります。
ユーザーを待っているゲームの SORTED SET (games:waiting) があります。これは、新しい日付で 30 秒ごとにサーバーによって更新されます。このようにして、サーバーがクラッシュした場合にゲームが使用されなくなることを確認できます。サーバーが稼働中に満杯になると、ソート済みセットからサーバー自体が削除されます。
各ゲームには、その中にいるユーザーを含む SET (game:id:users) があります。各ゲームには 6 人までしか参加できません。
複数のサーバーが BRPOP を使用して LIST からユーザーを取得しています (users:waiting)。
サーバーがユーザー ID を取得すると、待機中のゲーム ID を取得し、game:id:users SET で SCARD を実行します。この結果が 6 未満の場合、それらをセットに追加します。
問題:
複数のサーバーが一度にこれを行っている場合、一度に 6 人を超えるユーザーがセットに追加される可能性があります。たとえば、あるサーバーが SCARD を要求し、すぐに別のサーバーが SADD を実行した場合、セット内の数は増加しますが、最初のサーバーは認識しません。
とにかくこれを防ぐ方法はありますか?