18
EWD 3 トレーニング・コース #1 Node.jsとCachéの統合方法 M/Gateway Developments Ltd. Rob Tweed : 日本ダイナシステム株式会社 芳成

EWD 3トレーニングコース#1 Node.jsとCacheの連携

Embed Size (px)

Citation preview

Page 1: EWD 3トレーニングコース#1 Node.jsとCacheの連携

EWD 3トレーニング・コース #1

Node.jsとCachéの統合方法M/Gateway Developments Ltd.

Rob Tweed訳: 日本ダイナシステム株式会社 嶋 芳成

Page 2: EWD 3トレーニングコース#1 Node.jsとCacheの連携

Node.jsとCaché

• Node.js• サーバー・サイドのJavaScript

• 実行はシングル・スレッド

• JavaScriptは、開発(と成長)の余地がある、世界で最も人気のあるコンピュータ言語

• Caché• 高性能な、多モデルのNoSQLデータベース

• 下部構造は階層型

• 通常は組み込み言語を用いてアクセスする• MUMPSの拡張言語

• ITのメインストリームからは旧式とみなされている

• Cacheの第一言語としてのJavaScript

Page 3: EWD 3トレーニングコース#1 Node.jsとCacheの連携

Node.jsインターフェース

• 最初に無償のGlobalDBデータベース用に開発された• Cachéのコア・エンジン

• 言語パーサやエンジンは搭載されていない

• データベースエンジンのC++コール・イン・インターフェース経由でアクセスされる• もともとJavaと.Netのみ

• Node.jsインターフェースはChris Muntにより開発された• インターフェース・モジュールのファイルはcache.node

Page 4: EWD 3トレーニングコース#1 Node.jsとCacheの連携

cache.nodeインターフェース

Node.jsプロセス

JavaScript

cache.nodeモジュール

GlobalsDBプロセス

C+

+コール・イン・インターフェース

グローバル

Page 5: EWD 3トレーニングコース#1 Node.jsとCacheの連携

Node.jsインターフェース

• cache.nodeは、Cachéにも移植

•MUMPS/Cachéオブジェクト・スクリプトのコードを、JavaScript/Node.jsから実行するためのAPI funciton() を新設

•その後、CachéのオブジェクトAPIも追加

Page 6: EWD 3トレーニングコース#1 Node.jsとCacheの連携

cache.nodeインターフェース

Node.jsプロセス

JavaScript

cache.nodeモジュール

GlobalsDBプロセス

C+

+コール・イン・インターフェース

グローバル 関数 オブジェクト

Page 7: EWD 3トレーニングコース#1 Node.jsとCacheの連携

Node.jsインターフェース

• Node.jsとCachéの間は非常に緊密に結合され、密接な関係にある• イン・プロセス

• Node.jsプロセスとそれに接続されるCachéプロセスは、ひとつの同一のプロセスとなっている• Node.jsプロセスID === Caché の$job

• Node.jsはCachéサーバー上にインストールされなくてはならない

Page 8: EWD 3トレーニングコース#1 Node.jsとCacheの連携

cache.nodeインターフェース

Node.js

JavaScript

cache.nodeモジュール

C+

+コール・イン・インターフェース

グローバル 関数 オブジェクト

Cachéプロセス

Page 9: EWD 3トレーニングコース#1 Node.jsとCacheの連携

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の連携

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の連携

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の連携

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の連携

単純な例

• グローバル・ノードをセットします• すなわち、 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の連携

単純な例

• グローバル・ノードの値を取り出(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の連携

cache.node の API

• データベースの Open と Close

• グローバル・ノードの Set, Get, Kill

• あるノードが存在するかどうかを調べる ($data)

• $order と $query 等価の関数 (順方向と逆方向)

• グローバル・ディレクトリのリストを作る

• グローバル・ノードの値を増やす($increment)

• グローバル・ノードの Lock と Unlock

• グローバルの木構造の一部を他と Merge する

Page 16: EWD 3トレーニングコース#1 Node.jsとCacheの連携

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の連携

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の連携

cache.node の API

• 非同期と同期• 複数ユーザーのアクセスに単一のNode.jsプロセスを用いる

のなら、非同期APIを用いなくてはなりません

• 同期API• 若干高速

• 利用方法がより簡単で直感的です• コール・バック地獄やPromiseなどを使うのを避けることができます

• ブロッキングI/O

• シングル・ユーザーでテストする以外、 Node.jsではふつう使われません。

... しかし EWD 3 ではこの常識を変えます ...