GS2-Lock

GS2-Lock は排他処理を実現するためのサービスです。

GS2 のサービスはマイクロサービスアーキテクチャを採用しており、

ゲームに必要なコンポーネントを分割したサービスとして提供しています。

ゲームの挙動の多くは複数のマイクロサービスにまたがった操作を要求します。

たとえば、GS2-Stamina でスタミナを回復するために、GS2-Money でウォレットの残高を減らす。という具合です。

これを実装するとき以下のようなステップで処理を実装することになります。

  1. スタミナを回復する直前にウォレットの残高を確認
  2. 残高が足りていればスタミナを回復
  3. ウォレットの残高を減らす

しかし、1 と 2 の間にウォレットの残高を減らす処理が割り込んできた場合、3 で残高を減らそうと思っても減らせない。という事になります。

そのような問題を避けるために必要なのが GS2-Lock が提供する排他処理です。

  1. ウォレットのロックを取得
  2. スタミナのロックを取得
  3. スタミナを回復する直前にウォレットの残高を確認
  4. 残高が足りていればスタミナを回復
  5. ウォレットの残高を減らす
  6. スタミナのロックを解除
  7. ウォレットのロックを解除

このようにリソースを操作する前後にリソースのロックを取得するように実装することで、

割り込み処理が発生したとしても割り込み側のロック取得が失敗することで、このような問題を避けることが出来ます。

なお、ロックはユーザ単位で取得しますので、同一リソース名を指定したとしても異なるユーザ間であればロックを取得することが出来ます。

これは、複数のユーザで単一のリソースにアクセスする際には GS2-Lock は使用出来ないことを意味しますが、

そのような実装を行うとユーザ間でロックの取り合いになって、なかなかロックが取れずに処理が進まず不具合となってしまう可能性が高いため、意図的にそのような設計になっています。