今回Salesforceのハッカソンに参加するにあたり、小西はちょっとしたゲームを作成したんですが、まぁWebSocketでUS EASTにつなぐのは遠すぎるということを改めて実感しました。(--
ちなみにそこでやろうとしていた処理は定間隔で2つのクライアントから送信されるコマンドを両方のクライアントで同時に実行するというものでした。
最初は
- クライアント側でタイマをそれぞれ実行し、
- サーバ側で両方のコマンドが揃ったら、
- ブロードキャストする
という実装をしてみたんですが、クライアント側のタイマってけっこうずれるんですよね。。。(--
特にMac Safariはバックエンドにまわるとタイマがかなり遅延するので、この実装は速攻でボツ。
次にやったのは
- サーバ側でタイマを実行し、
- 定間隔で両クライアントにコマンドリクエストを送信し、
- それに反応したクライアントがコマンドを送信し、
- サーバ側で両方が揃ったら、
- ブロードキャストする
という実装です。
こちらの実装はローカルでは割と想定通りに動いてました。
。。。が、Herokuで実行するとクライアント側でのコマンド実行が安定せず、しばらく動かなかったり、連続で複数コマンドが実行されたりという現象が発生しました。
ちゃんと調べてませんが、上記の実装では
- サーバからのコマンドリクエスト
- クライアントからのコマンド送信
- サーバからのコマンドペア送信
と3つの電文が跳んでいるので、そのそれぞれに太平洋越えのレイテンシがかかった結果そのような挙動になったと思われます。(イマイチ納得いってない部分もあるんですが。)
しょうがないので、最終的に先の実装に加えて
- クライアント側は受け取ったコマンドをすぐには実行せずに一度キューに入れる
- クライアント側のタイマでキュー内のコマンドを定間隔で実行
としました。
この変更によって2つのクライアントで同時に画面が動くという面白さは損なわれましたが、結局のところレイテンシによって元々完全に同時にはならないので、まぁしょうがないかな、と。
冷静に考えると、この場合仮に東京リージョンがあっても微妙なタイムラグはあるわけだから、同じようにキューを使った処理を入れないといけないような気もしますが。。。
そうなるとこのエントリのタイトルが。。。。(--
いや、東京リージョンさえあればこんなブログを書く必要も無かったからやはりタイトルに偽りはありませぬ。(^^v
□□□□
このブログはHeroku Advent Calendar 2014の14日目の穴埋めでした。
明日は@shu_0115さんのHerokuの便利機能まとめ的な、です。
ちなみに冒頭のカットはハッカソンエントリ作品の一コマです。
明日には公開されるらしいですよ。(^^;;;