ewd 3トレーニングコース#1 node.jsとcacheの連携
TRANSCRIPT
![Page 1: EWD 3トレーニングコース#1 Node.jsとCacheの連携](https://reader030.vdocuments.mx/reader030/viewer/2022021503/58f1926b1a28ab48788b45eb/html5/thumbnails/1.jpg)
EWD 3トレーニング・コース #1
Node.jsとCachéの統合方法M/Gateway Developments Ltd.
Rob Tweed訳: 日本ダイナシステム株式会社 嶋 芳成
![Page 2: EWD 3トレーニングコース#1 Node.jsとCacheの連携](https://reader030.vdocuments.mx/reader030/viewer/2022021503/58f1926b1a28ab48788b45eb/html5/thumbnails/2.jpg)
Node.jsとCaché
• Node.js• サーバー・サイドのJavaScript
• 実行はシングル・スレッド
• JavaScriptは、開発(と成長)の余地がある、世界で最も人気のあるコンピュータ言語
• Caché• 高性能な、多モデルのNoSQLデータベース
• 下部構造は階層型
• 通常は組み込み言語を用いてアクセスする• MUMPSの拡張言語
• ITのメインストリームからは旧式とみなされている
• Cacheの第一言語としてのJavaScript
![Page 3: EWD 3トレーニングコース#1 Node.jsとCacheの連携](https://reader030.vdocuments.mx/reader030/viewer/2022021503/58f1926b1a28ab48788b45eb/html5/thumbnails/3.jpg)
Node.jsインターフェース
• 最初に無償のGlobalDBデータベース用に開発された• Cachéのコア・エンジン
• 言語パーサやエンジンは搭載されていない
• データベースエンジンのC++コール・イン・インターフェース経由でアクセスされる• もともとJavaと.Netのみ
• Node.jsインターフェースはChris Muntにより開発された• インターフェース・モジュールのファイルはcache.node
![Page 4: EWD 3トレーニングコース#1 Node.jsとCacheの連携](https://reader030.vdocuments.mx/reader030/viewer/2022021503/58f1926b1a28ab48788b45eb/html5/thumbnails/4.jpg)
cache.nodeインターフェース
Node.jsプロセス
JavaScript
cache.nodeモジュール
GlobalsDBプロセス
C+
+コール・イン・インターフェース
グローバル
![Page 5: EWD 3トレーニングコース#1 Node.jsとCacheの連携](https://reader030.vdocuments.mx/reader030/viewer/2022021503/58f1926b1a28ab48788b45eb/html5/thumbnails/5.jpg)
Node.jsインターフェース
• cache.nodeは、Cachéにも移植
•MUMPS/Cachéオブジェクト・スクリプトのコードを、JavaScript/Node.jsから実行するためのAPI funciton() を新設
•その後、CachéのオブジェクトAPIも追加
![Page 6: EWD 3トレーニングコース#1 Node.jsとCacheの連携](https://reader030.vdocuments.mx/reader030/viewer/2022021503/58f1926b1a28ab48788b45eb/html5/thumbnails/6.jpg)
cache.nodeインターフェース
Node.jsプロセス
JavaScript
cache.nodeモジュール
GlobalsDBプロセス
C+
+コール・イン・インターフェース
グローバル 関数 オブジェクト
![Page 7: EWD 3トレーニングコース#1 Node.jsとCacheの連携](https://reader030.vdocuments.mx/reader030/viewer/2022021503/58f1926b1a28ab48788b45eb/html5/thumbnails/7.jpg)
Node.jsインターフェース
• Node.jsとCachéの間は非常に緊密に結合され、密接な関係にある• イン・プロセス
• Node.jsプロセスとそれに接続されるCachéプロセスは、ひとつの同一のプロセスとなっている• Node.jsプロセスID === Caché の$job
• Node.jsはCachéサーバー上にインストールされなくてはならない
![Page 8: EWD 3トレーニングコース#1 Node.jsとCacheの連携](https://reader030.vdocuments.mx/reader030/viewer/2022021503/58f1926b1a28ab48788b45eb/html5/thumbnails/8.jpg)
cache.nodeインターフェース
Node.js
JavaScript
cache.nodeモジュール
C+
+コール・イン・インターフェース
グローバル 関数 オブジェクト
Cachéプロセス
![Page 9: EWD 3トレーニングコース#1 Node.jsとCacheの連携](https://reader030.vdocuments.mx/reader030/viewer/2022021503/58f1926b1a28ab48788b45eb/html5/thumbnails/9.jpg)
Node.jsインターフェース
•非常に速い接続• Node.jsとCachéのネットワーク接続よりもはるかに速い
• Globalストレージへのアクセスは、ネイティブなMUMPSコードの1/3~1/4のパフォーマンス
• 現在の制限は、Google V8 APIのボトルネックによる• https://bugs.chromium.org/v8/issues/detail?id=5144 参照
• ネイティブなMUMPSパフォーマンス同等となる潜在的可能性
![Page 10: EWD 3トレーニングコース#1 Node.jsとCacheの連携](https://reader030.vdocuments.mx/reader030/viewer/2022021503/58f1926b1a28ab48788b45eb/html5/thumbnails/10.jpg)
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
![Page 11: EWD 3トレーニングコース#1 Node.jsとCacheの連携](https://reader030.vdocuments.mx/reader030/viewer/2022021503/58f1926b1a28ab48788b45eb/html5/thumbnails/11.jpg)
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());
![Page 12: EWD 3トレーニングコース#1 Node.jsとCacheの連携](https://reader030.vdocuments.mx/reader030/viewer/2022021503/58f1926b1a28ab48788b45eb/html5/thumbnails/12.jpg)
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
![Page 13: EWD 3トレーニングコース#1 Node.jsとCacheの連携](https://reader030.vdocuments.mx/reader030/viewer/2022021503/58f1926b1a28ab48788b45eb/html5/thumbnails/13.jpg)
単純な例
• グローバル・ノードをセットします• すなわち、 set ^test(“foo”,”bar”)=“hello world”
var node = {global: ‘test’,subscripts: [‘foo’,’bar’],data: ‘hello world’
}
db.set(node, function(error, result){//ノードが生成されたときに何かをする
});
![Page 14: EWD 3トレーニングコース#1 Node.jsとCacheの連携](https://reader030.vdocuments.mx/reader030/viewer/2022021503/58f1926b1a28ab48788b45eb/html5/thumbnails/14.jpg)
単純な例
• グローバル・ノードの値を取り出(get)します• すなわち、 set value=^test(“foo”,”bar”)
var node = {global: ‘test’,subscripts: [‘foo’,’bar’],
}
db.get(node, function(error, result){console.log(‘value = ‘ + result.data);
});
![Page 15: EWD 3トレーニングコース#1 Node.jsとCacheの連携](https://reader030.vdocuments.mx/reader030/viewer/2022021503/58f1926b1a28ab48788b45eb/html5/thumbnails/15.jpg)
cache.node の API
• データベースの Open と Close
• グローバル・ノードの Set, Get, Kill
• あるノードが存在するかどうかを調べる ($data)
• $order と $query 等価の関数 (順方向と逆方向)
• グローバル・ディレクトリのリストを作る
• グローバル・ノードの値を増やす($increment)
• グローバル・ノードの Lock と Unlock
• グローバルの木構造の一部を他と Merge する
![Page 16: EWD 3トレーニングコース#1 Node.jsとCacheの連携](https://reader030.vdocuments.mx/reader030/viewer/2022021503/58f1926b1a28ab48788b45eb/html5/thumbnails/16.jpg)
cache.node の API仕様書
• http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=BXJS_refapi
![Page 17: EWD 3トレーニングコース#1 Node.jsとCacheの連携](https://reader030.vdocuments.mx/reader030/viewer/2022021503/58f1926b1a28ab48788b45eb/html5/thumbnails/17.jpg)
Cachéオブジェクト用のAPI
• cache.node にはCachéオブジェクト用APIもある
invoke_classmethod クラスメソッドを呼び出す
create_instance オブジェクトの新しいインスタンスを生成する
open_instance オブジェクトの既存のインスタンスを開く
get_property プロパティの値を検索する
set_property プロパティの値をセットする
invoke_method メソッドを呼び出す
save_instance インスタンスを格納する
close_instance インスタンスを閉じる
![Page 18: EWD 3トレーニングコース#1 Node.jsとCacheの連携](https://reader030.vdocuments.mx/reader030/viewer/2022021503/58f1926b1a28ab48788b45eb/html5/thumbnails/18.jpg)
cache.node の API
• 非同期と同期• 複数ユーザーのアクセスに単一のNode.jsプロセスを用いる
のなら、非同期APIを用いなくてはなりません
• 同期API• 若干高速
• 利用方法がより簡単で直感的です• コール・バック地獄やPromiseなどを使うのを避けることができます
• ブロッキングI/O
• シングル・ユーザーでテストする以外、 Node.jsではふつう使われません。
... しかし EWD 3 ではこの常識を変えます ...