私たちは現在、新しいプロジェクトに取り組んでいます- オンラインクエストの開発。その本質は、2つの陣営(IT専門家とFSB専門家)に分かれたプログラマが、おもしろい言語でプログラミングの分野のさまざまな問題を解決することです。エキサイティングなスクリプトでカラフルな漫画本を読んで物語。 プログラミング言語に制限がないことを直ちに予約してください。 唯一の制限:希少性などにより、サーバーにインストールできない場合があります。 今日は、サーバー側の開発で発生した問題についてお話ししたいと思います。
プロジェクトの主な問題は、ゲーム中にサーバーのセキュリティを確保することでした。 実際、リソースへのアクセスを制限することなく、無関係なコードを実行できます。 つまり プログラムを起動するとき、ワークアウトされたプログラム(実際にはウイルスのインストーラーであることが判明する可能性がある)がサーバーを破壊せず、作業の最後に削除されるように、環境を設定する必要があります。 問題を解決するとき、それが含まれるアイテムのリストを作成する必要があります。 リストは次のようになります。
- 外部ソースから受け取ったいくつかのソフトウェアが実行されるサーバーがあり、実際には、動作中にそれが何をするのかわかりません。
- 長い目で見れば、多数のアプリケーションをサーバーにアップロードする多数のユーザーがいます。 そのうちのいくつかは、ウイルスである可能性があります。PHPからexeファイルまですべてをアップロードできます。 問題は似ていますが、少し広くなっています。サーバー上で動作するためにプログラムが常駐している可能性があります。
- プログラムを起動すると、プログラムは大量のリソースを消費します。
次に、解決策を見つけることを設定しました。
ご存知のように、これはそのような条件下ではオプションではありません。 サーバーは間違いなく落ちるでしょう、それは時間の問題です。 誰かが何らかのひどいバグでプログラムを書いたとき、または誰かがウイルスにあふれたとき。 ところで、ここで別の問題が発生します:自分の対戦相手を使用して、対戦相手の結果を台無しにすることができます。
Linuxがプラットフォームであれば、それが解決策になります。 これは、コストと作成時間の両方ですべての人に適した、持続可能で優れたソリューションです。 しかし、歴史的に私たちのグループは.NET開発者であり、このシステムは私たちにとって異質なものでした。 そのため、微妙な点を無視してサーバーのセキュリティを損なわないようにするため、Windowsプラットフォームにとどまることにしました。
Windowsでサンドボックスを作成できます。 この問題に関して、全体の研究が行われました。 たとえば、割り当てられたRAMの量によってプロセスを制限できます。 または、ファイルシステムで占有できるディスクメモリの量に応じて。 プロセスをほとんどすべてに制限できますが、Windowsにはウイルスが多すぎるのでご容赦ください。つまり、これらのすべての障壁は、たとえばウイルスで排除できるということです。 したがって、このバージョンの開発の途中で、それをすべて同じように放棄することが決定されました。 本質的にこれはクールな解決策であるという事実にもかかわらず、プログラムの結果を収集するのに問題はなく、プログラムをクリーンアップするのに問題はありません。 ジョブと呼ばれるWindowsカーネルオブジェクトを使用すると、OSリソースの使用に制限が設定され、NTFSのルールを使用すると、ファイルシステムでの作業に制限が設定されます。 必要なものはほとんどありましたが、自己保存の感覚から、十分に迅速に作成できるオプションがまだあることが示唆されました。
実際、このオプションは、頭に浮かぶ最初のものとして表面にあります。 必要なアプリケーションとファイルを展開する必要がある仮想マシンがあります。 次に、アプリケーションが起動し、その出力がファイルに収集されます。作業が完了すると、ファイルは仮想マシンから取得され、仮想マシンは元の状態にリセットされます。 このソリューションには、すべての点で有利になる多くの利点があります。
- マシンの状態はリセットされます。つまり、内部では、少なくとも黙示録、少なくともハードドライブからのオペレーティングシステムの解体が行われます。 絶対に何が起こっても。 作業の最後(またはタイムアウト)に、それを取得し、スナップショットにロールバックします。
- 前のマシンが動作した後、環境は壊れません。
- あらゆる小さなことを制御できます。
- ただし、1つの欠点があります。複雑な管理です。
最初は、マシン内で、ホストマシンへの後続の転送のために、プログラムの展開、起動、および出力フェンスを管理するエージェントを起動する必要があると考えました。 ただし、結局のところ、すばらしい製品があります。VirtualBoxには、豊富なAPIと、本当に必要なエージェントがあります。 既製のエージェントが利用できることに満足しているのはなぜですか? ゼロから起動するコンポーネントが多いほど、より多くのバグをキャッチします。 私たちがあまり経験がないからではありません。 常にバグが存在するというだけであり、新しく作成されたソフトウェアではさらにそうです。 数十万の起動によってデバッグされたコードは、自己記述よりもはるかに優れています。
同じ理由で、1つの危険なステップを放棄しました。リソースを節約するために、ReactOSをゲストオペレーティングシステムとして使用できます。 本当にできました。 1つのBUTではない場合。 そこの通訳の一部は、単に開始しませんでした。 決して。 たぶん、このOSには1つだけ間違いがあり、それはカーネルの奥深くにあります。 しかし、その存在はアプリケーションの半分に影響を与え、何が起こっているのか不安定に感じます。 そうでない場合は、次の理由がある場合にのみ選択します。
- ハードドライブでは比較的何もかかりません(〜40Mb)
- RAMをほとんど占有しません(〜40 Mb)
- 実際にはプロセッサリソースを消費しません
これは、1台の物理マシンで最大20台の仮想マシンを実行する必要がある場合に最適です。 このシックなオペレーティングシステムは、絶望的な状態にきちんとドープされている場合に理想的です。 数秒で起動する軽量ウィンドウ(〜5)。
だから、最終的な解決策:
- ホスティングは曇っています。 これにはAPIがあり、数千人がサーバーに来てプレイを開始すると、動的に、プログラムでノードを増やします。 それらを動的に無効にすることもできます。
- ノードはテンプレートから立ち上がります。 テンプレート-Windows、Git、VirtualBox、およびスクリプト。 スクリプトは、リポジトリから実行可能ファイルの最新バージョンをダウンロードし、サービスを開始します。
- サービスが開始し、VirtualBoxを起動し、その上でテンプレート仮想マシンを探し、構成に応じて、いくつかのインスタンスでクローンを作成します。 マシンは、PHP、Perl、Python、Ruby、Lua、およびJava、.Net Framework 3.5バージョンのインタープリターで事前構成されています。 Windows 7 64ビット。
- コマンドラインのリッスンを開始します。
- チームが到着すると、無料の仮想マシンに解析され、スクリプトがダウンロードされるか、プレーヤーのEXEファイルが起動されます。 問題を解決するために30秒が与えられます。 時間が経過するか、プロセスが終了すると、OUTPUTが書き込まれるoutput.logファイルがホストマシンにコピーされ、仮想マシンが元の状態にリセットされ、最後のスナップショットにロールバックされます。
- 結果はブラウザに送られます。
現時点では、作業の次の結果について話すことができます。
- 気に入らないのは、仮想マシンのイメージのサイズだけです。 ワークステーションでは、4 GBのイメージを5つのノードに複製するには約20〜30分かかります。 バグを修正するとき、これは悪夢です。 したがって、ゲスト仮想マシンの側面に既製のエージェントが存在することと、インタープリターの安定バージョンが存在することは、別個のファットプラスです。 これにより、ゲストマシンの中断のない動作がある程度保証されます。 クラウドでの動作-すぐにロードして調べます。
- ブラウザから仮想マシン、起動、終了を待機するフルタイム(ログの形式(ゲストマシンの元の状態へのロールバックを考慮))は、最大20%のCPUでロードする場合に4秒かかります。 これは素晴らしい結果です。 つまり 5台の仮想マシンが回転するサーバーが起動すると、1分あたり最大75個のジョブチェックを処理できます。 つまり、1台のサーバーで降りることができると想定できます。 念のため、2番目は機能します。 3番目、2つのうちの1つが切断された場合(そして突然!)。
- 単純な理由で購読する際にメールアドレスを検証しませんでした。まず、左側のアドレスを入力すると、メールは引き続き人々に届きます。 2つ目-なぜあなたがサインアップしたスパムを送信するのか、それをスクリーンに書くことができるのか? 3番目:なぜ人々がこのスパムを削除するためにメールボックスにクロールするのですか?:)
次回、技術的な部分について詳しく説明しますが、さらに詳しく見てみましょう。 それまでの間、ゲームのウェブサイトにようこそ(そして、どの言語で問題を解決したいのかをコメントに書くことを忘れないでください):