本記事は、サムザップ Advent Calendar 2019 #2 の12/8の記事です。
はじめに
本記事では、サムザップが提供するマルチ陣取りバトル「リンクスリングス」で導入したPub/Subサービス「Pusher」の紹介と導入事例を記載します。
主な用途
まずはじめに、ゲーム内の用途として以下のようなものが予定されていました。
- チャット
- ミッション達成通知
- メンテナンス通知
- リアルタイムなマッチング
etc.
サービスの選定
これらを実現するにあたり、様々なサービスを検討・検証しました。
- Google Cloud Pub/Sub
- PubNub
- AmazonSNS
- AmazonIoT
- RealtimeFramework
etc.
開発中は、RealtimeFrameworkを利用していたのですが、問い合わせのレスポンスが悪かったことや、ホームページの証明書の期限が切れていた時期等があり、運用で利用するにはリスクが高いと判断し、開発途中で乗り換え先未定のまま乗り換えることだけを決めました。
そこから急ピッチで選定を開始し、以下のような選定基準でPusherを選択することになりました。
- 料金
- リアルタイム性
- スケーラビリティ
- サービス信頼性
- 実装難易度
Pusher以外のほとんどのサービスは、料金もしくはリアルタイム性において今回の要件を満たさなかったため、不採用となりました。
Pusherとは
ここでPusher…というか、PubSubについてもう少し説明したいと思います。
非同期メッセージングパラダイムの一種であり、メッセージの送信者(出版側)が特定の受信者(購読側)を想定せずにメッセージを送るようプログラムされたものである。
引用元:ウィキペディア
以下の図のように、送信者(publisher)は、チャンネルに対してメッセージを送信するだけで、受信者(subscriber)を知る必要がなく、受信者は送信者を知らずとも、必要なチャンネルを購読することで、必要なメッセージを受信する仕組みです。
Pusherは、このPubSubを簡単に実現し、かつスケーラブルでリアルタイムなサービスとなっています。
基本的なシーケンス
以下Pusherのドキュメントより引用させていただきました。
かなりシンプルなシーケンスで、クライアント/サーバー共にSDKが用意されているのもあって、導入も容易でした。
サンプルのjavascriptがあったり、ダッシュボードにデバッグ用のツールがあったりするので、サーバ側だけで動作確認することも出来ました。
その他
- webhook
- ユーザーがチャネルに入ったり、抜けたりしたイベントを通知してくれる機能があります。
- リンクスリングスでは、マッチングの入退場処理に利用していました。
- 注意点として、追加・削除のイベントはそれぞれエンドポイントを設定することが出来ず、1つのエンドポイントに両方のイベントが飛んでくるので、エンドポイント内の処理でイベント切り分けが必要です。
- またイベントに対して、Httpステータスとして200を返すまでリトライが来るのも注意ポイントです。
- 従量課金
- メッセージ数(1メッセージあたりのサイズ上限あり)による従量課金のため、メッセージ数が多くなり過ぎないように見積りが必要です。
- 送信自体もメッセージ数にカウントされるので注意が必要です。
- とはいえ、他のサービスに比べると格安でしたし、開発中は無料版で十分でした。
- 海外のサービスなので、契約する場合は先方と英語でやり取りする必要があります。
- 最初メールを送ったら、「電話で話せるか」と返信があって焦りました。。
- ただそれくらい問い合わせのレスポンスもよく、サービスも安定していました。
最後に
Pusherはお手軽に使えて、リアルタイム性も良く、スケーラブルで、営業の方も色々柔軟に対応してくれる(サービスを東京リージョンに作ってくれました)、良いサービスなので、PubSubサービスの選択肢の1つとして頭の片隅に持っておくと良いかもしれません。
それでは、快適な開発ライフを〜。
明日は @kotaroy さんの記事です。