VMモジュールを使用し、Lambdaのような機能を提供するサーバの構築方法、またVMの注意点についてまとめます。vmとはVMとは同プロセス上で別のNodeスクリプトの実行をサポートするモジュールです。evalに似ていますが、Contextの値を外から代入できる大きな違いがあります。同プロセス上で動くので値の共有が可能です。2このようにVM上で生成された関数をVM外で使用することができます。下図がざっくりとしたサーバ構成図です。クライアントがリクエストとともにクライアントバージョンを送信し、そのバージョンとマッチしたVMスクリプトをDBから取得します。一度取得したスクリプトはパフォーマンス向上のためオンメモリに保持しています。そのスクリプトをVM上で起動し、サーバのAPIをContext経由で渡すことでスクリプト上からサーバへのリクエストを可能にします。vm.jsこのようにVM上で作成されたhandlersをVM外で実行することにより、一つのクラスタで複数のバージョンの異なるクライアントをサポートしています。使用上の注意Objectの扱いJavaScriptでは全てのオブジェクトはObject型を継承します。ArrayはObject型を継承しているため、以下のようにinstanceofがtrueになることが確認できます。trueしかしVM上ではVM外とは異なるObject型が生成され、VM内の全てのObject型はVM外とは異なるObject型を継承します。false逆も同様な問題があります。falseArrayの場合はArray.isArrayやObject.prototype.toStringを使用することで、Arrayであるかどうかの判別が可能です。Array]しかしVM上で生成された値をサードパーティのライブラリに代入する際、内部でinstandeof等を使用している可能性があるためこの方法が安全とは言えません。エラーハンドリングエラーハンドリングでも同様な問題があります。error!つまりVM上で生じたTypeErrorはinstnaceofでは判別することができません。util.inheritsを使った解決方法util.inheritsとは、Node上でprototype関数を継承するために使われる関数です。現在はextendsシンタックスを使用してclassを継承することが主流ですが、classの実態はprototype関数であり、util.inheritsを使用して拡張することができます。基本的な使い方は以下の通りです。trueこれを踏まえVM上のclassの継承関係を解決していきます。以下のように呼び出し元のclassを渡し、そのclassをVM内で継承することにより解決することができます。true他のclassも同様な問題があるため、こちらから適宜追加してください。まとめNodeでLambdaのような機能を提供するサーバの構築方法を紹介しました。750KBくらいのスクリプトを使用していますが、VMによるオーバーヘッドは5ms程度で無視できるレベルかと思います。VMは様々な用途に使用でき、Nodeの幅が広がる面白いモジュールです。VM使ったライブラリも公開してます、ぜひ試してみてください。FlatBuffersを導入手順についての記事です。TypeScriptのライブラリ開発をしています。(1)月別アーカイブはてなブログをはじめよう!suguru03さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。