2025/11/17 03:08 From Zero to 35M: The struggles of scaling Laravel with Octane

ロボ子、IdleMMOってゲームがLaravel Octaneでスケーリングに成功したらしいのじゃ!

IdleMMOですか。16万人以上のユーザーがいるオンラインゲームなのですね。すごい。

そう!特にここ2ヶ月でユーザーが急増して、サーバーのスケーリングが課題になったみたい。「PHP-FPMでは大量のリクエストを処理できず、サーバー容量の増強が必要になった」らしいぞ。

PHP-FPMの限界ですか。そこでLaravel Octaneの登場ですね。

その通り!OctaneはOpenSwoole上で動くことで、リソースを節約しながらリクエスト処理能力を向上させるのじゃ!

アプリケーションを一度だけ初期化してメモリに保持するから、オーバーヘッドが減るんですね。効果はありましたか?

95パーセンタイルのユーザーの応答時間が394msから172msに大幅に改善したらしいぞ!

それは素晴らしい改善ですね!でも、Octaneの導入には課題もあったようですね。

そうなんじゃ。オンラインリソースが限られていたり、データベーストランザクションの保存ポイントでエラーが発生したり…。

データベース接続がリクエスト間で維持されていたのが原因だったんですね。

`DisconnectFromDatabases::class`を`OperationTerminated`イベントからアンコメントすることで解決したみたいじゃ。

`worker_connections`の制限やファイル記述子の制限にも達したんですね。それらはどのように解決したんですか?

`nginx.conf`で`worker_connections`の値を増やしたり、`ulimit -n 65536`コマンドを使ったりしたみたいじゃ。根本的な解決には設定ファイルの編集とサーバー再起動が必要だったみたいだけど。

OpenSwooleのワーカー数も重要ですよね。vCPU数に関連付ける必要があるんですね。

そう!vCPUあたり1〜4ワーカーが推奨されてるのじゃ。IdleMMOでは8 vCPUサーバーで32ワーカーを実行するように設定したみたい。

ワーカーのパフォーマンス監視には`OpenSwooleServer->stats()`を使うんですね。

そして、Octaneがアプリケーションをメモリに保持するから、リクエスト間で意図しないデータ共有が発生する可能性もあるのじゃ。

ゲームモードの設定がリクエスト間で保持される問題を、リクエストオブジェクトに直接バインドすることで解決したんですね。

アクティブなプレイヤー数を計算する重い操作では競合状態が発生したみたいじゃ。キャッシュの有効期限切れが原因だったみたいだけど。

その操作にロックを追加して、一度に1つの計算のみが実行されるようにしたんですね。

結論として、Laravel OctaneはLaravelアプリケーションのスケーリングに役立ち、PHP-FPMよりも少ないリソースで大量のリクエストを処理できるってことじゃ!

単一のNGINXサーバーで1日あたり約3500万件のリクエストを処理できるなんて、すごいですね。

IdleMMOはOctaneのおかげで、アイドル状態でもリクエストが止まらない、まさに「Idle」MMOになったのじゃ!

うまいこと言いましたね、博士!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
