GS2 Blog

Game Server Services(https://gs2.io/) の最新情報をお届けします

【新機能】マイクロサービス間の連携を補助するためのサービスを追加します

みなさんこんにちは。GS2 CEO の丹羽です。

近日公開予定の新機能のお知らせをしたいと思います。
今回お知らせするサービスは2つで、どちらもGS2のマイクロサービス間を協調動作させるために重要な役割を果たす事になる機能です。

GS2-Lock

これは名前の通り、排他処理を実現するための機能となっています。
機能としては非常に単純で、『特定のリソースに対してロックを取得する』という宣言と『特定のリソースのロックを解除する』という宣言の2つが主な機能です。

用途例

たとえば、GS2-Stamina でスタミナを回復するために GS2-Money で 課金通貨を消費する。というプロセスを例に考えてみましょう。
GS2-Lock が無い状態でこれを実現すると、『GS2-Stamina でスタミナを回復する』『GS2-Money で 課金通貨を消費する』という2つの操作はそれぞれ独立した操作になります。
そのため、『GS2-Stamina でスタミナを回復する』と『GS2-Money で 課金通貨を消費する』のわずかな間に他の処理で GS2-Money の消費が割り込んでくる可能性があります。
その結果、スタミナは回復したにも関わらず、GS2-Money の残高が不足していて減らせない。ということが起こりえます。

このような問題を避けるためには GS2-Lock で GS2-Money の残高を増減する前後に、GS2-Money のウォレットのロックの取得/解除を行うようにします。
そうすることで、『GS2-Stamina でスタミナを回復する』と『GS2-Money で 課金通貨を消費する』のわずかな間に他の処理で GS2-Money の消費が割り込んできたとしても
割り込んできた側の処理がロックが取れずに失敗することになり、このような問題を避けることが出来るようになります。

そのほかの特徴

GS2-Lock ではロックを取得する際に『トランザクションID』というものを指定します。
そして、同一トランザクションからのロック取得リクエストだった場合はロック参照カウンターを増加させ、ロック解除リクエストはロック参照カウンターを減算し、実際のロック解除は参照カウンターが0になるまで行わないようになっています。
こうすることで、一つの処理系の中で同じリソースのロックを取ろうとしてデッドロックする。というような問題を避けることが出来るようになっています。

また、GS2-Lock のリリースにあわせて『リクエストID』という機能が導入されます。
リクエストIDとは、APIリクエスト毎にユニークなIDで、さらに APIリクエストによって発火した GS2-Script の中で GS2-SDK を使用して通信をした場合は同じリクエストIDが使用される。という特徴があります。
つまり、GS2-Lock のトランザクションIDにこのリクエストIDを指定することによってピタゴラ装置的に起動するGS2-Script全てで共通のトランザクションIDを使用することが出来ます。

f:id:kazutomo:20180210013805p:plain

ちなみに、ロックの解放を忘れてしまってどうにもならなくなってしまうことを避けるために、ロック取得時にTTLを秒単位で指定することが出来ます。
TTLの長さはロック取得時に指定出来ますので、この後の処理にかかりそうな時間に対して十分な時間でTTLを指定してロックを取得することで何らかの事故によってロックを解除出来なかったとしてもデッドロックすることは無くなります。

GS2-JobQueue

GS2-Lock は複数のマイクロサービスを超えて一貫性のある排他処理を実現するための機能でしたが、GS2-JobQueue は複数のマイクロサービスを超えて結果整合の処理を実現するための機能です。

名前の通り、このサービスはユーザ毎にジョブキューを提供します。
ジョブには GS2-Script のスクリプト名と引数、最大リトライ回数 を指定出来ます。

ジョブキューはFIFO先入れ先出し)を保証しており、1回のAPIリクエストで最大10件のジョブを一気に登録出来ます。
一気にジョブを登録する際には、リクエスト時に指定した順番に優先度が付いて登録が行われます。
ジョブキューの実行は明示的にAPIを通して実行リクエストを出す必要があり、API実行は排他処理が行われているため同時に複数のジョブを走らせることは出来ません。
ジョブには最大リトライ回数を指定したことから推測出来るように、GS2-Script が 200 以外のステータスコードを返した場合は、次回ジョブ実行リクエストの際にリトライを行います。
ジョブキューの実行リクエストのレスポンスにはジョブとして動いた GS2-Script の実行結果が返るほか、ジョブキューの終端まで処理を終えたかも取得出来ます。

用途例

現在のGS2の機能としては提供していませんが、クエストをクリアした際に、あたらしいユニットを入手し、新しいユニットを入手したことでユニット図鑑を解放する。という処理を実現するとしましょう。
エストをクリアした報酬としてユニットを入手する箇所に関しては、UX的に同期的に処理した方がよさそうですが、図鑑の解放はプレイヤーがすぐに目にすることは無いでしょうから、結果整合でよさそうです。

ユニットを入手した際に GS2-Script を発火するように設定し、そのスクリプトでは GS2-JobQueue に対して『ユニット入手というスクリプトを呼び出すジョブ』を登録します。
『ユニット入手というスクリプト』では、入手したユニットが図鑑で解放されているかを確認し、解放されていなければ解放するというスクリプトにします。
あとはゲーム内で余裕があるときに GS2-JobQueue のジョブを実行すれば結果整合で図鑑の解放が実現出来ます。
図鑑の解放済み確認や解放処理をユニットを入手した際に発火するスクリプトで記述する方が楽じゃない?と感じられるかもしれませんが、そのようにしてしまうと、処理エラーやクオーターリミットによるエラーでユニットの入手処理まで巻き添えになってしまいますが、GS2-JobQueue を通すことで非同期処理でリトライ付で実行出来ることによってリスクを最小限に抑えることが出来ます。

そのほかの特徴

最大リトライ回数を超えてエラーが発生した場合はデッドレターキューに追加されます。
デッドレターキューには GS2-Script の実行時エラーの内容も一緒に保存されますので、問題の解決や復旧にも役立つでしょう。

定期的に GS2-JobQueue のジョブを実行すればいい。って言われても常にポーリングするのはちょっと…。と思われた方には GS2-InGamePushNotification との連携機能をご紹介します。
この連携機能を使うことで、ジョブキューに新しいジョブが登録されたときにプッシュ通知を受けることが出来ます。
これを使えば、ジョブキューが空になるまで実行したら、GS2-InGamePushNotification からの通知が来るまではジョブキューは触らず、通知を受けたらもう一度ジョブキューが空になるまで実行する。という風にすることで無駄なポーリングを回避出来ます。


利用料金や実装例については実際に機能をご利用いただけるようになった際にこのブログで告知します。
GS2 ではマイクロサービスの数も増えてきて、これからは1回の操作で複数のマイクロサービスのデータを読み書きすることが増えてくることになります。
今回は、そのようなケースで活用出来る機能のご紹介でした。

それでは、また。

【新機能】GS2 SDK for Unity がパワーアップしました

みなさんこんにちは。GS2 CEOの丹羽です。

本日は GS2 SDK for Unity の大幅なパワーアップについてお知らせします。
これまで、Unity から GS2 のサービスをご利用いただくには GS2 SDK アセットをインポートし、手順に従ってコーディングを行うことでゲームにネットワーク機能を組み込んできました。

GS2 SDK はより Unity Editor との統合を進め、より簡単にゲームにネットワーク機能を組み込めるようになったことをお知らせします。
本日時点では GS2-Account と GS2-Money の機能をより簡単に組み込めるよう uGUI によるインターフェースやエラーハンドリングの実装が含まれた状態のプレハブが提供されます。
今後対応サービスを拡充していきますが、とりあえずこの2つの機能であればプログラムを一切記述せず GS2 の機能をゲームに組み込めるようになりました。


【GS2】QuickStart GS2-SDK for Unity

こちらの動画がその手順をまとめたものです。
約7分の動画で GS2 SDKプラグインインストールから、GS2-Account 機能の組み込み。ログイン/機種変更時のアカウント引き継ぎの動作確認までを行っています。

是非お試しいただき、フィードバックをください。

それでは、また。

【登壇情報】Gaming Tech Night #2 re:Born (再始動)

みなさんこんにちは。GS2の丹羽です。

開催直前となってしまいましたが、来週AWS主催のイベントの登壇情報です。
gamingtechnight.connpass.com

f:id:kazutomo:20180117174727p:plain

題目はシンプルに『サーバレスアーキテクチャ入門』です。
これまで Serverlessconf などに登壇した際に、ゲーム開発に携わっている方がどのくらいいるか確認してきましたが、それほど多くなかったということもあり、
今回のイベントはゲーム開発者を対象としたイベントですので、サーバレスアーキテクチャって何?これからサーバレスアーキテクチャを実践してみたい。という方を対象とした内容にしました。

ざっくり見出しを紹介すると、こんな感じです。

  • サーバレスアーキテクチャとは?
  • マネージドサービス?フルマネージドサービス?
  • これがAWSのフルマネージドサービス
  • フルマネージドサービスを使えばいいというわけではない
  • 『サーバレスは本質的な開発に注力出来る』というのはまやかし

見出しに興味がわいたら是非上記ページからエントリーしてください。
イベント終了後にこのブログで資料を公開しますので、予定が付かずイベントに参加出来ない場合も見に来てください。
読者登録しておくと更新時に連絡が行くようになります。

それでは、また。

【新サービス公開】GS2-Limit 回数制限管理サービス

みなさん、こんにちは。GS2 CEOの丹羽です。

本日は新サービスの公開を告知します。
GS-Limit はゲーム内のアクション回数に回数制限をつける時に実行回数をサーバサイドで管理する仕組みです。

これによって、アカウントあたり1回だけ購入出来る商品。のような機能を実現出来ます。
また、回数制限にはリセット周期を定義することも出来ますので、
例えば、毎日3回だけ挑戦出来るデイリークエストの挑戦条件判定や、毎週1回だけ無料でガチャが引ける場合の条件判定といったものを実現することも可能です。

使い方は簡単で、Unity SDK を使用する場合は

yield return Gs2.Limit.Up(
    r =>
    {
        if (r.Error != null)
        {
            // 例外が発生
        }
        Debug.Log("Counter Value: " + r.Result.Count);
    },
    Session,                // ゲームセッション
    LimitName,           // 回数制限名
    CounterName);    // カウンター名

これで回数制限をインクリメント出来ます。結果にはカウントアップ後の実行回数も返ります。
制限回数をオーバーした場合は r.Error に ConflictException が返ります。

カウントアップせずに現在のカウント値を取得するには

yield return Gs2.Limit.Get(
    r =>
    {
        if (r.Error != null)
        {
            // 例外が発生
        }
        Debug.Log("Counter Value: " + r.Result.Count);
    },
    Session,                // ゲームセッション
    LimitName,           // 回数制限名
    CounterName);    // カウンター名

これで取得出来ますので、カウントアップ前に条件の確認をすることも出来ます。

GS2-Limit の利用料金は完全従量制で

カウンターの取得 1円/1,000回
カウンターの操作 3円/1,000回
カウンターマスタのエクスポート 1円/回

で利用出来ます。

GS2-Limit は本日よりご利用いただけます。

それでは、また。

【新サービス公開】イベントスケジュール管理機能

みなさんこんにちは。GS2 CEOの丹羽です。

gs2.hatenablog.com

こちらで告知していたイベントスケジュール管理機能を公開しましたのでお知らせします。
機能の説明について同じ話をしても意味が無いので、今回は実装例を紹介します。

イベントマスターデータの管理については以下のページを参照してください。

イベントマスタフォーマット - GS2 Documents

現在有効なイベントの一覧を取得する場合のサンプル

yield return Gs2.Schedule.List(
    r =>
    {
        if (r.Error != null)
        {
            // 例外が発生
        }
        foreach (var eve in r.Result.Events)
        {
            Debug.Log("name: " + eve.Name);        // イベント名
            Debug.Log("meta: " + eve.Meta);        // メタデータ
            Debug.Log("begin: " + eve.Begin);    // 開始日時
            Debug.Log("end: " + eve.End);        // 終了日時
        }
    },
    Session,                            // ゲームセッション
    ScheduleName,                        // スケジュール名
    new []{EventName1, EventName2});    // イベント名のリスト(省略することで全件取得)

現在有効なイベントを取得する場合のサンプル

yield return Gs2.Schedule.Get(
    r =>
    {
        if (r.Error != null)
        {
            // 例外が発生
        }
        Debug.Log("name: " + r.Result.Name); // イベント名
        Debug.Log("meta: " + r.Result.Meta); // メタデータ
        Debug.Log("begin: " + r.Result.Begin); // 開始日時
        Debug.Log("end: " + r.Result.End); // 終了日時
    },
    Session, // ゲームセッション
    ScheduleName, // スケジュール名
    EventName1);        // イベント名

アカウント登録時に相対時間のイベントを開始する

schedule_client = client('schedule')  –- GS2-Schedule のクライアントを初期化
result = schedule_client.pull_trigger({
    scheduleName="schedule-0001", -- スケジュール名 
    triggerName="trigger-0001", -- トリガー名
    userId="user-0001", -- ユーザID
    action="pull_again" -- トリガーの引き方
})
result = {permit=not result.isError} -- トリガーを引くのに失敗した場合失敗とする

このスクリプトを GS2-Script に登録し GS2-Account のアカウント登録イベントでフックすることで、
アカウント登録時にイベントの開始トリガーを引くことが出来ます。


利用料金は完全従量制で

イベントの取得 1円/1,000件
トリガーの操作 3円/1,000回
イベントマスタのエクスポート 1円/回

API呼び出し回数 3円/1,000回

と非常に扱いやすい内容になっています。

それでは、また。

【新サービス発表】イベントスケジュール管理サービス

みなさん、こんにちは。GS2の丹羽です。

本日は近日公開予定の新サービス GS2-Schedule を発表いたします。
GS2-Schedule はゲーム内のイベントの管理を行うマイクロサービスです。

イベントは2種類定義することが可能です。
1つ目は絶対時間、2つ目は相対時間です。

絶対時間は開始日時/終了日時を明示してイベントの開催期間を定義出来ます。
相対時間はユーザ毎にトリガーを引いてから一定期間をイベントの開催期間と定義するものです。

前者は一般的なクリスマスやお正月にあわせたイベント開催に、
後者はチュートリアル突破後24時間限定のイベントなどの定義に使用出来ます。

マスターデータはGS2のマネージメントコンソールで定義することも出来ますが、
マスターデータは最終的にJSON形式のファイルにエクスポートして、実サービスに適用するように設計されています。
これは、開発環境で作成したマスターデータを製品環境に適用するコストを最小に抑えるためと、
イベントの定義をGS2のマネージメントコンソールだけでなく、独自のツールを使ってフォーマットに沿ったJSONを出力することでも定義出来るようにするためです。

GS2-Schedule は今後GS2のマイクロサービスと連携することで本領を発揮します。
たとえば、今後GS2の開発マイルストーンには、ガチャ/アイテムショップ/お知らせ といったサービスの開発が計画されています。
これらのサービスと GS2-Scedule を連携されることで、イベント期間のみガチャを解放したり、チュートリアル突破後24時間限定でショップで買える商品を定義することが出来るようになる計画です。

料金や機能の詳細はサービス提供開始にあわせて後日発表しますので、しばらくお待ちください。

それでは、また。

(C) Game Server Services, Inc.