Skip to content

Latest commit

 

History

History
183 lines (131 loc) · 7.91 KB

00 - SUGOSことはじめ.md

File metadata and controls

183 lines (131 loc) · 7.91 KB

【SUGOSチュートリアル】 00 - SUGOSことはじめ

フレームワークSUGOSのチュートリアル。

そんなのいいから取りあえずソースコードを!と言う方はこちらの実装例を参照。

内容

SUGOSとは

  • 遠隔関数呼び出し(RPC: Remote Procedure Call)を実現するフレームワーク
  • 関数定義を動的に共有することで、ネットワーク越しであることを意識しなくて良くなる
  • 主にNode.jsで実装されている
  • EventEmitter形式でのイベント駆動な記述も可能
  • 株式会社リアルグローブが開発している
Banner banner banner banner

できること

SUGOSを使うと、あるクライアント上で定義した関数が、他のクライアントからいきなり使えるようになります。 HTTPやWebSocketといった中間のプロトコルを意識することなく、遠隔呼び出しが可能になるのです。

Overview

例えば、関数を提供する側のクライアント(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.IOKoaを利用している
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をほとんど意識なくて良い

これも読みたい

リンク