コンテンツに移動
アプリケーション モダナイゼーション

フリップアウト: クラウド接続でクラシックなピンボール マシンをモダナイズ

2024年11月19日
https://storage.googleapis.com/gweb-cloudblog-publish/images/pinball.max-2500x2500.jpg
Drew Brown

Developer Advocate

Max Saltonstall

Developer Advocate

※この投稿は米国時間 2024 年 11 月 5 日に、Google Cloud blog に投稿されたものの抄訳です。

クラウドが中心となっている今日の世界では、アプリケーションをありとあらゆる強力なクラウド サービスと簡単に統合できるのが当然のことのように思われています。しかし、統合が容易ではないレガシー システムやその他の制約のある環境が依然として数多く存在しています。

私たちは、Backlogged Pinball を開発する際に、この課題に真正面から立ち向かいました。Backlogged Pinball はクラウド サービスを一般的ではない環境で統合するためのデモとして構築したカスタム ピンボール ゲームです。Backlogged Pinball は、クラウドに接続してさまざまなサービス(現在のゲームや完了したゲームに関するデータの追跡、リーダーボードの更新など)を利用できる物理的なピンボール マシンです。ゲームコードとクラウドへの統合に集中するため、このマシンの構築には市販のプログラム可能なピンボール マシンをベースとして使用しました。しかし、このマシンのソフトウェア環境には制限があり、17 年前に初めてリリースされた .NET Framework 3.5 のサンドボックス バージョンで実行されていました。これは、C# で利用できる最新の Google Cloud SDK を使用できず、gcloud のようなクラウドとの通信をサポートするツールもインストールできないことを意味しました。

https://storage.googleapis.com/gweb-cloudblog-publish/images/1_M6pQAZF.max-2000x2000.png

問題点

私たちは、データベース(ハイスコアやゲームの統計情報)、ロギング(ゲームイベントと結果)、カスタム サービス(ゲーム エクスペリエンスの迅速な変更)にクラウドを活用したいと考えていました。しかし、このような制約のある環境向けのソフトウェア開発には、次のようなさまざまな課題がありました。読者の皆様にはおなじみの課題かもしれません。

最小限のライブラリ サポート: スタックを完全に制御できる場合は、クラウド サービスへ接続するための優れたライブラリが不足することはありません。しかし、ソフトウェアの実行場所を選べない場合もあります。私たちのピンボール マシンでは、必要なクラウド サービスと統合できる互換性のあるライブラリを見つけるのが困難でした。たとえば、ゲーム内で起こっていることをすべてリアルタイムで可視化するために、Firestore データベースにレコードを挿入したいと考えていました。Firestore には優れた SDK がありますが、.NET Framework 4.6.28 年前のバージョン)以前のものはサポートされていませんでした。TCP 接続を使用して従来のリレーショナル データベースに接続することもできたかもしれませんが、使用できるクラウドツールやサービスが限られるのは避けたいと考えていました。データをブラウザにリアルタイムで push するようにゼロから設計された Firestore ではなく、MySQL を使用してリアルタイム ウェブ アプリケーションを構築するのは、言うまでもなくはるかに非実用的です。

困難なデプロイ プロセス: 新しい機能やクラウド統合を追加したいけれど、デバイス上でのソフトウェア更新を困難にする他の制限がある場合もあります。サードパーティ デベロッパーとして、開発中は USB メモリを使用してゲームの各バージョンを手動でインストールする必要がありました。このような制限のせいで、コードの新バージョンをテスト、デプロイ、出荷するスピードが遅くなります。これは決して良いことではありません。最新の柔軟なクラウド環境では、新しい機能を追加するのがはるかに簡単です。

基本的に、不確実な従来の環境で最新のクラウド サービスを使用することは困難であることがわかりました。

スクリプトをフリップ

一見したところ、必要なすべてのサービスをピンボール マシンで実行されるコードに統合する実用的な方法はありませんでした。しかし、もし別の方法があるとしたら?ピンボール マシン自体をサービスに変えて、最小限の統合を一つだけ施したらどうなるでしょうか?そしてゲーム内で何かが起こるたびにメッセージを送信し、最新のクラウド環境で結果を整理できるようにするのです。

私たちは、この目標を達成するには Pub/Sub が最適な方法であると判断しました。Pub/Sub は複雑さを最小限に抑えながら、単一のインターフェースでクラウドに情報を送受信するものです。任意のメッセージ形式の基本的な HTTP POST として送信できます。

https://storage.googleapis.com/gweb-cloudblog-publish/images/2_PNsvw6c.max-1600x1600.jpg

これを実現するために、カスタム Pub/Sub メッセージング システムを設計しました。私たちは、ピンボール マシン用に独自の軽量 Pub/Sub ライブラリを作成し、REST API を介した認証とメッセージ送信を処理できるようにしました。これにより、プレーヤーがボールを弾き出したり、的に命中させたり、フリッパー ボタンを押したりするたび、非常に簡単にイベントをポストできるようになりました。GitHub でそのコードの簡易版を確認できます。

クラウド側では、複数の Cloud Run サブスクライバーを使用してこれらのイベントをリアルタイムで処理しました。また、データの保存と可視化を行うために Firestore を使用しました。

大成功!クラウドの利点

統合の複雑な処理をクラウドで行うことで多くの利点が得られました。

単一のインターフェース: 独自の Pub/Sub クライアントを作成するのは簡単な作業ではありませんでした(認証に関してだけでもブログ投稿が 1 本書けてしまうほどです)。しかし、いったん済ませてしまえばもうそれで終わりです!一度動作し始めると、必要な最新のクライアント ライブラリとツールを使用したクラウド内のすべてのイベント処理に集中できるようになりました。

リアルタイム更新: Google Cloud Next では、ユーザーが独自の Cloud Run サービスを作成し、ピンボール イベントを受信および処理して、メッセージをマシンに送り返せるよう支援しました。これらのサービスの構築とデプロイには 1 分もかかりませんでした。つまり、友人がゲームをプレイしている間にゲームを変更することも可能ということです。

豊富なデータ分析情報: ゲーム内で発生したすべての出来事の詳細なログを手に入れることができました。この情報は、開発中の問題のトラブルシューティングや、テストプレイに基づくスコアのファイン チューニングに非常に有効でした。

https://storage.googleapis.com/gweb-cloudblog-publish/original_images/3_9F1v5xM.gif

もっと先へ

私たちは、当初は考慮していなかった機能を備えた Backlogged Pinball の次のイテレーションをすでに計画しています。たとえば、AI を活用したゲーム分析やプレーヤーのスタイルに基づいたアドバイスを追加する予定です。この柔軟なクラウドベースのアーキテクチャにより、レガシー システムで依存関係と格闘するのではなく、ほぼすべての作業を最新のクラウド環境で行えるようになります。そして、このプロジェクトから学んだ教訓は、あらゆる制約のある環境に広く応用できるものです。組み込みシステム、IoT デバイス、レガシー ソフトウェアを実行する古いサーバーなど、どのような環境であっても、Pub/Sub メッセージングを活用し、クラウド ファーストの考え方を採用することで、環境の制限から解放されてクラウドの可能性を最大限に引き出せるようになります。

2024 11 月に開催される KubeCon North America で、最新の Backlogged Pinball を披露する予定です。ご参加の際はぜひお立ち寄りください!


今回のプロジェクトと本ブログ投稿の執筆に協力してくれた Google Cloud アドボケイト、Mofi Rahman にこの場を借りて感謝の意を表します。

ー デベロッパー アドボケイト Drew Brown

ー デベロッパー アドボケイト Max Saltonstall

投稿先