Upload
kiyoshi-sawada
View
125
Download
1
Embed Size (px)
Citation preview
EWD 3トレーニング・コース #1
Node.jsとCachéの統合方法M/Gateway Developments Ltd.
Rob Tweed訳: 日本ダイナシステム株式会社 嶋 芳成
Node.jsとCaché
• Node.js• サーバー・サイドのJavaScript
• 実行はシングル・スレッド
• JavaScriptは、開発(と成長)の余地がある、世界で最も人気のあるコンピュータ言語
• Caché• 高性能な、多モデルのNoSQLデータベース
• 下部構造は階層型
• 通常は組み込み言語を用いてアクセスする• MUMPSの拡張言語
• ITのメインストリームからは旧式とみなされている
• Cacheの第一言語としてのJavaScript
Node.jsインターフェース
• 最初に無償のGlobalDBデータベース用に開発された• Cachéのコア・エンジン
• 言語パーサやエンジンは搭載されていない
• データベースエンジンのC++コール・イン・インターフェース経由でアクセスされる• もともとJavaと.Netのみ
• Node.jsインターフェースはChris Muntにより開発された• インターフェース・モジュールのファイルはcache.node
cache.nodeインターフェース
Node.jsプロセス
JavaScript
cache.nodeモジュール
GlobalsDBプロセス
C+
+コール・イン・インターフェース
グローバル
Node.jsインターフェース
• cache.nodeは、Cachéにも移植
•MUMPS/Cachéオブジェクト・スクリプトのコードを、JavaScript/Node.jsから実行するためのAPI funciton() を新設
•その後、CachéのオブジェクトAPIも追加
cache.nodeインターフェース
Node.jsプロセス
JavaScript
cache.nodeモジュール
GlobalsDBプロセス
C+
+コール・イン・インターフェース
グローバル 関数 オブジェクト
Node.jsインターフェース
• Node.jsとCachéの間は非常に緊密に結合され、密接な関係にある• イン・プロセス
• Node.jsプロセスとそれに接続されるCachéプロセスは、ひとつの同一のプロセスとなっている• Node.jsプロセスID === Caché の$job
• Node.jsはCachéサーバー上にインストールされなくてはならない
cache.nodeインターフェース
Node.js
JavaScript
cache.nodeモジュール
C+
+コール・イン・インターフェース
グローバル 関数 オブジェクト
Cachéプロセス
Node.jsインターフェース
•非常に速い接続• Node.jsとCachéのネットワーク接続よりもはるかに速い
• Globalストレージへのアクセスは、ネイティブなMUMPSコードの1/3~1/4のパフォーマンス
• 現在の制限は、Google V8 APIのボトルネックによる• https://bugs.chromium.org/v8/issues/detail?id=5144 参照
• ネイティブなMUMPSパフォーマンス同等となる潜在的可能性
cache.nodeをインストールする
• 現在Cachéのインストール・キットに包含されている• cache.nodeのみ別という形では配布されていない
• Node.jsのバージョンごとにAPIが変更されている• 12.x – cache0120.node
• 4.1.x – cache410.node
• 4.2 以降の 4.x版 – cache421.node
• これらを cache.node という名前に変えて、node_modules ディレクトリにコピーする• 例えば: c:\ewd3\node_modules\cache.node
Cachéに接続する• テスト用のスクリプ
ト・ファイルを作る
例えば:
c:\ewd3\test.js
var interface = require(‘cache’); //cache.nodeをロードするvar db = new interface.Cache();
//以下のパラメータをCachéシステムに合わせて変更する
var ok = db.open({path: ‘\opt\cache\mgr’,username: ‘_SYSTEM’,password: ‘SYS’,namespace: ‘USER’
})
//接続OKかどうかを確認console.log(‘ok: ‘ + JSON.stringify(ok));console.log(db.version());
Cachéに接続する
• テスト用のスクリプトファイルを走らせる
• うまく接続されています!
cd \ewd3node test
ok: {“ok”:1,”result”:1}Node.js Adaptor for Caché: Version:1.1.104(CM); Caché Version 2015.2 build 664
単純な例
• グローバル・ノードをセットします• すなわち、 set ^test(“foo”,”bar”)=“hello world”
var node = {global: ‘test’,subscripts: [‘foo’,’bar’],data: ‘hello world’
}
db.set(node, function(error, result){//ノードが生成されたときに何かをする
});
単純な例
• グローバル・ノードの値を取り出(get)します• すなわち、 set value=^test(“foo”,”bar”)
var node = {global: ‘test’,subscripts: [‘foo’,’bar’],
}
db.get(node, function(error, result){console.log(‘value = ‘ + result.data);
});
cache.node の API
• データベースの Open と Close
• グローバル・ノードの Set, Get, Kill
• あるノードが存在するかどうかを調べる ($data)
• $order と $query 等価の関数 (順方向と逆方向)
• グローバル・ディレクトリのリストを作る
• グローバル・ノードの値を増やす($increment)
• グローバル・ノードの Lock と Unlock
• グローバルの木構造の一部を他と Merge する
cache.node の API仕様書
• http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=BXJS_refapi
Cachéオブジェクト用のAPI
• cache.node にはCachéオブジェクト用APIもある
invoke_classmethod クラスメソッドを呼び出す
create_instance オブジェクトの新しいインスタンスを生成する
open_instance オブジェクトの既存のインスタンスを開く
get_property プロパティの値を検索する
set_property プロパティの値をセットする
invoke_method メソッドを呼び出す
save_instance インスタンスを格納する
close_instance インスタンスを閉じる
cache.node の API
• 非同期と同期• 複数ユーザーのアクセスに単一のNode.jsプロセスを用いる
のなら、非同期APIを用いなくてはなりません
• 同期API• 若干高速
• 利用方法がより簡単で直感的です• コール・バック地獄やPromiseなどを使うのを避けることができます
• ブロッキングI/O
• シングル・ユーザーでテストする以外、 Node.jsではふつう使われません。
... しかし EWD 3 ではこの常識を変えます ...