フレームワークSUGOSのチュートリアル。
そんなのいいから取りあえずソースコードを!と言う方はこちらの実装例を参照。
- 遠隔関数呼び出し(RPC: Remote Procedure Call)を実現するフレームワーク
- 関数定義を動的に共有することで、ネットワーク越しであることを意識しなくて良くなる
- 主にNode.jsで実装されている
- EventEmitter形式でのイベント駆動な記述も可能
- 株式会社リアルグローブが開発している
SUGOSを使うと、あるクライアント上で定義した関数が、他のクライアントからいきなり使えるようになります。 HTTPやWebSocketといった中間のプロトコルを意識することなく、遠隔呼び出しが可能になるのです。
例えば、関数を提供する側のクライアント(Actor) において、
- メソッドを持つModuleを宣言 (
tableTennis#ping
) - クライアント名(key)を宣言し、仲介となるhubサーバに接続 (
my-actor-01@example.sugo-hub.com
)
'use strict'
const co = require('co')
const sugoActor = require('sugo-actor')
const { Module } = sugoActor
co(function * () {
// Define a module with methods
let tableTennis = new Module({
ping (pong) {
return `"${pong}" from actor!`
}
})
// Create an actor client instance
let actor = sugoActor({
host: 'example.sugo-hub.com',
key: 'my-actor-01',
modules: { tableTennis }
})
// Connect to hub server
yield actor.connect()
}).catch((err) => console.error(err))
すると、
関数を呼び出す側クライアント (Caller)から、Actorが提供するModuleにアクセスできるようになります。
'use strict'
const sugoCaller = require('sugo-caller')
const co = require('co')
co(function * () {
let caller = sugoCaller({
host: 'example.sugo-hub.com'
})
// Connect to an actor with key
let actor01 = yield caller.connect('my-actor-01')
{
// Get a module of the actor
let tableTennis = actor01.get('tableTennis')
let pong = yield tableTennis.ping('hey!')
console.log(pong) // -> `"hey!" from call!`
}
}).catch((err) => console.error(err))
.ping()
自体はCaller側のJavascriptではどこにも宣言されていませんが、Actorから受け取った定義を基にして動的に生成されます。
また、一方的な関数呼び出しだけではなく、 Node.jsのEventEmitterを用いたイベント駆動もサポートしています。
.on()
や.emit()
となどの書き方で、Actor側からCaller側に通知が出せます。
コンポーネント | 役割 |
---|---|
SUGO-Hub | ActorとCallerの通信をとり持つサーバ。内部的にはSocket.IOとKoaを利用している |
SUGO-Actor | 関数実行を担うクライアント。key によって一意に識別される。 |
SUGO-Caller | 関数呼び出しを担うクライアント。接続先のActorに合わせて動的にJavascriptの関数を生成する |
ActorとCallerはそれぞれWebSocketでHubと接続します。
Caller <-----> Hub <-----> Actor
Callerは接続時にActorからModuleの定義情報を受け取り、それを元にJavascript関数を動的に生成します。
Caller側で関数を実行すると、関数名や引数などの情報が裏でJSONに変換され、Hubを介して接続先のActorに届きます。 Actor側では受けとった情報を元に対象の関数を呼び出し、その結果をまたCaller側に返します。
それぞれの関数はJavascriptのasync/awaitに沿って実装されており、 ネットワークの時差をあまり意識せずにプログラムがかけるようになっています。
- SUGOSは遠隔呼び出しを実現するフレームワーク
- あるクライアント側で宣言した関数を別のクライアントから呼べる
- 呼び出し側のJavascript上では関数が動的に作られる
- HTTPやWebSocketをほとんど意識なくて良い