「退屈な」教材の学習を容易にするゲーム化された環境を開発しています。最近、次のモジュールで構成される 1.0 リリースを開始しました。
- コースの学習、リーダーボード (スコアリング) の表示、個人の活動と成果のための Django ベースの Web ポータル。
- 竜巻ベースのリアルタイム フィードと通知サービス。mrjoes さんが開発したsockjs -tornadoを利用しています。共有セッションを利用しました。ユーザーが django サイトにログインすると、Comet バックエンドで自動的にチャネルが開かれました。
- Tornado ベースの非同期マルチプレイヤー ゲーム サーバー。ここでも、プレイヤー (ソケット) を接続してサービスを提供するためにsockjs-tornadoを使用し、ネットワーク全体でゲーム ループ イベントを同期させました。
現在、システムのスケーラビリティと高可用性機能に取り組んでいます。主な課題は、ゲーム クラスタ ノード間で適切かつ一貫して負荷を分散することです (データ損失なし、クラッシュ時のフェイルオーバー、ゲーム サーバー (ループ) の 1 つが突然クラッシュした場合の再バランス)。主な目標は、クライアントとゲームのやり取りを可能な限りシームレスにすることです。クライアントは追加のアクションを行うべきではありません: サーバーの障害によりゲームがクラッシュした場合、手動で再接続します。この図は、分散型ゲーム サーバーの可能なアーキテクチャを示しています。
Django サイト (CRUD アクション) の .../game でいくつかのアクションが実行された場合、tornado ベースのゲーム ルーターは、ある種の oplog コレクション (ゲーム ルーターによって追跡される mongodb の制限されたコレクション) を通じてリアルタイムで通知されます。これが新しいゲームの場合、Game Router は特別なアルゴリズム (最速のハートビート トリップ、またはライブ (アクティブ) ゲームの最小数) によって、ゲームの次のホスト (ゲーム サーバー) を決定します。さらに、Game Router はトピック エクスチェンジにメッセージを発行することで、適切なループを通知します。
いずれかのゲーム サーバーがクラッシュすると、Game Router にすぐに通知され、memcached クラスターでアイドル状態のゲームを取得して負荷を再調整します。
失敗した場合、クライアントはどのようにして新しいゲームサーバーにシームレスに再接続できますか? 冗長チャネル (ソケット接続) を開きたくない。私が正しい道を進んでいるかどうか?良いアプローチ、批評家、テクニックを教えてください。図を描いて考えを共有していただければ幸いです。
前もって感謝します。