SlideShare una empresa de Scribd logo
1 de 26
Descargar para leer sin conexión
NanoStrand
Smalltalkで分散ネットワーキング
第77回Smalltalk勉強会
合同会社ソフトウメヤ 梅澤真史
NanoStrandとは??
● nanomsgのラッパー
● 気軽に高速なネットワークシステムが組めるよう
にするためのライブラリ
● Smalltalk間はもちろん他言語とのやりとりもス
ムーズに
● https://github.com/mumez/NanoStrand
nanomsgのこと
● 一言でいうと、Mini ZeroMQ (in C)
● マルチプラットフォーム
● 様々な通信パターン(Scalability Protocol)を提供
○ PUSH/PULL, REQ/REP, PUB/SUB, PAIR, SURVEY, BUS
● マルチトランスポート
○ TCPのみならずIPC、INPROCも
● 豊富な言語バインディング
○ http://nanomsg.org/documentation.html
NanoStrandの構成
● NanoStrand-FFI
○ FFIでnanomsg APIを呼ぶ部分
■ nanomsgのAPIをほぼそのまま使っている
■ NativeBoost版のみ (NanoStrand-NativeBoost-FFI)
● Legacy FFI版を作るとSqueakやCuisでも利用可能になる
● DLLCC版だとVisualWorks
● NanoStrand-Core
○ 上記FFI部を使いOO的なAPIを提供する
■ NnSocket(とそのサブクラス群)
インストール(1)
● nanomsgのビルド
○ 32bitのCog VMを使う場合、32bit指定でコンパイル
○ Windowsの場合は32, 64bit用が両方できるので楽
● ビルドした共有ライブラリ(libnanomsg)をVMのディレクトリに
コピー
CFLAGS=-m32 CXXFLAGS=-m32 LDFLAGS=-m32 ./configure
インストール(2)
● ConfigurationOfNanoStrandのロード
● 共有ライブラリを置いていないと定数初期化に失敗する
○ NnNbNanoMessageConstantsプールに値が入らない
○ 失敗した場合、ライブラリを置いて
”NnNbNanoMessageConstants initialize”すること
Gofer new
url: 'http://smalltalkhub.com/mc/MasashiUmezawa/NanoStrand/main';
package: 'ConfigurationOfNanoStrand';
load.
(Smalltalk at: #ConfigurationOfNanoStrand) load
例: PULL/PUSHを書いてみる(1)
"Setup PULL socket"
sock1 := NnPullSocket withBind: 'tcp://*:5575'.
sock1 onReceiveReady: [:sock | Transcript cr; show: '#PULL: ', sock receive asString].
"Setup PUSH socket"
sock2 := NnPushSocket withConnect: 'tcp://127.0.0.1:5575'.
sock2 onSendReady: [:sock | sock send: '#PUSH: ', Time now asString].
● パイプラインな処理
● NnPullSocketで受信、NnPushSocketで送信
例: PULL/PUSHを書いてみる(2)
"Start a Poller for multiplexing"
poller := NnPoller startWithSockets: {sock1. sock2}.
● NnPollerでポーリング
● 異なるプロトコル、エンドポイントのSocketをまとめて登録できる
● 適切なタイミングで、onReceiveReady:, onSendReady:のコールバックが呼
び出される
例: PULL/PUSHを書いてみる(3)
1 seconds wait. "The process ends after a second"
poller stopAndCloseSockets.
● stopAndCloseSocketsでNnPollerを止める
● 実際にはensure:で確実に止めるようにしたほうが良い
結果
● Transcriptに表示させなければ20000qpsほど捌ける
例: PUB/SUBで他言語との連携 (1)
# PUSHのクライアント起動。"HelloWorld"を1秒ごとに送る
$ nanocat --push --connect tcp://127.0.0.1:5585 --
data HelloWorld -i 1
● クライアント側をnanocatに
○ Cで書かれたnanomsgの公式クライアント。テストに便利。
例: PUB/SUBで他言語との連携 (2)
# SUBのクライアント起動。全てのイベントを受け付ける
$ nanocat --sub --connect tcp://127.0.0.1:5586 -A
● PUSHの他、SUB役のクライアントを2つ起動
# SUBのクライアント起動。"Evt:Rem0"イベントを受け付ける
$ nanocat --sub --connect tcp://127.0.0.1:5586 --subscribe Evt:Rem0 -A
例: PUB/SUBで他言語との連携 (3)
● サーバ側はPharo
○ PULLで受け取ったメッセージの数を10で割った余り(rem)を
計算
○ 余りが0または5のときイベントとしてPUBLISHする
例: PUB/SUBで他言語との連携 (4)
received := OrderedCollection new. "A message box"
"Setup PULL socket"
sock1 := NnPullSocket withBind: 'tcp://127.0.0.1:5585'.
sock1 onReceiveReady: [:sock | | rec |
rec := (sock receiveFor: 200 timeoutDo: ['']) asString.
rec ifNotEmpty: [
received add: rec. "Stock the received message"
Transcript cr; show: 'Received:', rec, ':', Time now printString].
].
例: PUB/SUBで他言語との連携 (5)
"Setup PUB socket"
sock2 := NnPubSocket withBind: 'tcp://127.0.0.1:5586'.
sock2 onSendReady: [:sock | |rem |
rem := received size rem: 10. "10で割った余りを出す"
"余りが0か5の時、イベントとして送る"
rem = 0 ifTrue: [sock send: 'Evt:Rem0:', Time now printString].
rem = 5 ifTrue: [sock send: 'Evt:Rem5:', Time now printString].
].
例: PUB/SUBで他言語との連携 (6)
poller := NnPoller new.
poller startWithSockets: {sock1. sock2}.
30 seconds wait.
poller stopAndCloseSockets.
● 30秒ほどポーリングして終了させる
○ 実際にはensure:を使ってstopさせること
今後は?
● Smalltalk-Smalltalk間
○ FFI部を充実させ、Squeak, CuisやVWに展開
○ シリアライザとしてはMessagePackや StOMPを使える
● 他言語間
○ Node.jsやVert.xなどとつなぐと広がりがありそう
NanoStrand-RPC
● RPCのI/Fを提供し便利に使えるようにする
○ ZeroMQに対するZeroRPC的な位置づけ
■ http://www.zerorpc.io
● 同期、非同期、oneway(送りっぱなし)をサポートする予定
○ 現在は同期のみの実装
○ http://smalltalkhub.com/#!/~MasashiUmezawa/NanoStrand-RPC
例: 足し算サービスの利用 (1)
● 足し算するのみの簡単なサービスクラスを用意
NnRpcSampleService class >> plus: a with: b
^a+b
● #RpcSampleServiceという名前で登録しておく
NnRpcServer addService: NnRpcSampleService
named: #RpcSampleService
例: 足し算サービスの利用 (2)
● サーバの起動
server := NnRpcServer bind: 'tcp://127.0.0.1:6677'.
server start.
● クライアントの接続、RPC呼び出し
client := NnRpcClient connect: 'tcp://127.0.0.1:6677'.
client invoke: #RpcSampleService
selector: #plus:with: arguments: {1. 2}. ”=> 3”
速度は?
● 500回起動で80ms程度
[500 timesRepeat: [client invoke: #RpcSampleService selector: #plus:
with: arguments: {1. 2}]] timeToRun. ”=> 0:00:00:00.078”
● なかなか速い
● Pure Smalltalkで書かれたRPCライブラリと比べてどうなのだろう
か?
Remote Messagint Toolkit (RMT)
● 昔書いたPure SmalltalkのRPCライブラリ
○ http://smalltalkhub.com/#!/~MasashiUmezawa/RemoteMessagingToolkit
● 同期とonewayをサポート
● 某基幹系で毎日動いている
● Squeak用であったが、最近Pharo用に復活
○ シリアライザはDataStreamからFuelに置き換えた
RMTで計測
● 500回起動で1300ms程度
service := (RmtTcpService on: 4566) acceptorClass: RmtRpcAcceptor.
service start.
RmtRpcAcceptor receiverDictionary at: #RpcSampleService
put: NnRpcSampleService.
client := RmtRpcConnector connect: 'localhost' port: 4566.
[500 timesRepeat: [client invoke: #RpcSampleService selector: #plus:with:
arguments: {1. 2}]] timeToRun. ”=> 0:00:00:01.33”
RPC系の予定
● 非同期のサポート
○ Futureを返し、値の取得後にコールバックされる仕組み
● ORB?
○ 非同期ベースでいまさらORBっぽいものを作りたい
○ E言語に似た感じの何か
まとめ
● NanoStrandで、気軽に高速なネットワークプログラムが書け
る
● いろいろなものとつないで楽しみましょう
● 今後の拡張にご期待ください!!

Más contenido relacionado

La actualidad más candente

「Dockerはいいぞ」 for Laboratory LT
「Dockerはいいぞ」 for Laboratory LT「Dockerはいいぞ」 for Laboratory LT
「Dockerはいいぞ」 for Laboratory LTShimpeiIwamaru
 
マウスを使わないでキーボードで快適に生活する方法(GNU Screen/tmux/byobu/awesome)
マウスを使わないでキーボードで快適に生活する方法(GNU Screen/tmux/byobu/awesome)マウスを使わないでキーボードで快適に生活する方法(GNU Screen/tmux/byobu/awesome)
マウスを使わないでキーボードで快適に生活する方法(GNU Screen/tmux/byobu/awesome)Kenichiro MATOHARA
 
Tarantubeでメッセージキューを使い倒す
Tarantubeでメッセージキューを使い倒すTarantubeでメッセージキューを使い倒す
Tarantubeでメッセージキューを使い倒すMasashi Umezawa
 
Bossan dentoo
Bossan dentooBossan dentoo
Bossan dentookubo39
 
#mailerstudy 01 LT POP/IMAP入門
#mailerstudy 01 LT POP/IMAP入門#mailerstudy 01 LT POP/IMAP入門
#mailerstudy 01 LT POP/IMAP入門Takashi Takizawa
 
Open stack+lagopus できるかな
Open stack+lagopus できるかなOpen stack+lagopus できるかな
Open stack+lagopus できるかなMasaru Oki
 
Tide - SmalltalkでSPA
Tide - SmalltalkでSPATide - SmalltalkでSPA
Tide - SmalltalkでSPAMasashi Umezawa
 
Lagopus performance
Lagopus performanceLagopus performance
Lagopus performanceMasaru Oki
 
Janogia20120921 yoshinotakeshi
Janogia20120921 yoshinotakeshiJanogia20120921 yoshinotakeshi
Janogia20120921 yoshinotakeshiKeisuke Ishibashi
 
import dpkt したよ #ssmjp 2014/02/28
import dpkt したよ #ssmjp 2014/02/28import dpkt したよ #ssmjp 2014/02/28
import dpkt したよ #ssmjp 2014/02/28th0x0472
 
Ruby&Active Support for expert 3
Ruby&Active Support for expert 3Ruby&Active Support for expert 3
Ruby&Active Support for expert 3xibbar
 
Rustのタスクモデルについて
RustのタスクモデルについてRustのタスクモデルについて
Rustのタスクモデルについてzigen
 
マスタリングJUNOS DHCP
マスタリングJUNOS DHCPマスタリングJUNOS DHCP
マスタリングJUNOS DHCPZenSekibe
 
Pub/Sub model, msm, and asio
Pub/Sub model, msm, and asioPub/Sub model, msm, and asio
Pub/Sub model, msm, and asioTakatoshi Kondo
 
Lagopus, raw socket build
Lagopus, raw socket buildLagopus, raw socket build
Lagopus, raw socket buildMasaru Oki
 

La actualidad más candente (19)

「Dockerはいいぞ」 for Laboratory LT
「Dockerはいいぞ」 for Laboratory LT「Dockerはいいぞ」 for Laboratory LT
「Dockerはいいぞ」 for Laboratory LT
 
20110205.linux 0.01
20110205.linux 0.0120110205.linux 0.01
20110205.linux 0.01
 
マウスを使わないでキーボードで快適に生活する方法(GNU Screen/tmux/byobu/awesome)
マウスを使わないでキーボードで快適に生活する方法(GNU Screen/tmux/byobu/awesome)マウスを使わないでキーボードで快適に生活する方法(GNU Screen/tmux/byobu/awesome)
マウスを使わないでキーボードで快適に生活する方法(GNU Screen/tmux/byobu/awesome)
 
Tarantubeでメッセージキューを使い倒す
Tarantubeでメッセージキューを使い倒すTarantubeでメッセージキューを使い倒す
Tarantubeでメッセージキューを使い倒す
 
Bossan dentoo
Bossan dentooBossan dentoo
Bossan dentoo
 
#mailerstudy 01 LT POP/IMAP入門
#mailerstudy 01 LT POP/IMAP入門#mailerstudy 01 LT POP/IMAP入門
#mailerstudy 01 LT POP/IMAP入門
 
Open stack+lagopus できるかな
Open stack+lagopus できるかなOpen stack+lagopus できるかな
Open stack+lagopus できるかな
 
Tide - SmalltalkでSPA
Tide - SmalltalkでSPATide - SmalltalkでSPA
Tide - SmalltalkでSPA
 
Lagopus performance
Lagopus performanceLagopus performance
Lagopus performance
 
Boost sg msgpack
Boost sg msgpackBoost sg msgpack
Boost sg msgpack
 
Janogia20120921 yoshinotakeshi
Janogia20120921 yoshinotakeshiJanogia20120921 yoshinotakeshi
Janogia20120921 yoshinotakeshi
 
Nltk for biginer
Nltk for biginerNltk for biginer
Nltk for biginer
 
import dpkt したよ #ssmjp 2014/02/28
import dpkt したよ #ssmjp 2014/02/28import dpkt したよ #ssmjp 2014/02/28
import dpkt したよ #ssmjp 2014/02/28
 
Ruby&Active Support for expert 3
Ruby&Active Support for expert 3Ruby&Active Support for expert 3
Ruby&Active Support for expert 3
 
Rustのタスクモデルについて
RustのタスクモデルについてRustのタスクモデルについて
Rustのタスクモデルについて
 
マスタリングJUNOS DHCP
マスタリングJUNOS DHCPマスタリングJUNOS DHCP
マスタリングJUNOS DHCP
 
Pub/Sub model, msm, and asio
Pub/Sub model, msm, and asioPub/Sub model, msm, and asio
Pub/Sub model, msm, and asio
 
Lagopus, raw socket build
Lagopus, raw socket buildLagopus, raw socket build
Lagopus, raw socket build
 
Ssaw08 0617
Ssaw08 0617Ssaw08 0617
Ssaw08 0617
 

Destacado

Mayer, james 2015
Mayer, james 2015Mayer, james 2015
Mayer, james 2015James Mayer
 
Podsumowanie 13. edycji akcji charytatywnej "Czapka św. Mikołaja"
Podsumowanie 13. edycji akcji charytatywnej "Czapka św. Mikołaja"Podsumowanie 13. edycji akcji charytatywnej "Czapka św. Mikołaja"
Podsumowanie 13. edycji akcji charytatywnej "Czapka św. Mikołaja"MRMRybnika
 
MAYER, James 2015
MAYER, James 2015MAYER, James 2015
MAYER, James 2015James Mayer
 
Islamic Finance Course work (3)
Islamic Finance Course work (3)Islamic Finance Course work (3)
Islamic Finance Course work (3)Temitope Ologburo
 
Fucking with algorithms
Fucking with algorithmsFucking with algorithms
Fucking with algorithmsMyriam Jessier
 
The Poet in You: A mini-workshop on poetry writing
The Poet in You: A mini-workshop on poetry writingThe Poet in You: A mini-workshop on poetry writing
The Poet in You: A mini-workshop on poetry writingMiguel De Jesús
 

Destacado (9)

Mayer, james 2015
Mayer, james 2015Mayer, james 2015
Mayer, james 2015
 
Pillarの紹介
Pillarの紹介Pillarの紹介
Pillarの紹介
 
Podsumowanie 13. edycji akcji charytatywnej "Czapka św. Mikołaja"
Podsumowanie 13. edycji akcji charytatywnej "Czapka św. Mikołaja"Podsumowanie 13. edycji akcji charytatywnej "Czapka św. Mikołaja"
Podsumowanie 13. edycji akcji charytatywnej "Czapka św. Mikołaja"
 
MAYER, James 2015
MAYER, James 2015MAYER, James 2015
MAYER, James 2015
 
BLVC-plannen_Brochure
BLVC-plannen_BrochureBLVC-plannen_Brochure
BLVC-plannen_Brochure
 
Improving UX checkout
Improving UX checkoutImproving UX checkout
Improving UX checkout
 
Islamic Finance Course work (3)
Islamic Finance Course work (3)Islamic Finance Course work (3)
Islamic Finance Course work (3)
 
Fucking with algorithms
Fucking with algorithmsFucking with algorithms
Fucking with algorithms
 
The Poet in You: A mini-workshop on poetry writing
The Poet in You: A mini-workshop on poetry writingThe Poet in You: A mini-workshop on poetry writing
The Poet in You: A mini-workshop on poetry writing
 

Similar a NanoStrand

勉強会向けサーバを作ってみる2 / Rasbian jessieを試す/ Google Authenticatorのパスコードを作る
勉強会向けサーバを作ってみる2 / Rasbian jessieを試す/ Google Authenticatorのパスコードを作る勉強会向けサーバを作ってみる2 / Rasbian jessieを試す/ Google Authenticatorのパスコードを作る
勉強会向けサーバを作ってみる2 / Rasbian jessieを試す/ Google Authenticatorのパスコードを作るKenichiro MATOHARA
 
WebRTC SFU mediasoup sample
WebRTC SFU mediasoup sampleWebRTC SFU mediasoup sample
WebRTC SFU mediasoup samplemganeko
 
おまえらこのライブラリ使ってないの? m9 (2013-07)
おまえらこのライブラリ使ってないの? m9	(2013-07)おまえらこのライブラリ使ってないの? m9	(2013-07)
おまえらこのライブラリ使ってないの? m9 (2013-07)Toru Furukawa
 
WebRTC meetup Tokyo 1
WebRTC meetup  Tokyo 1WebRTC meetup  Tokyo 1
WebRTC meetup Tokyo 1mganeko
 
Fabricによるcloud stackインストール自動化
Fabricによるcloud stackインストール自動化Fabricによるcloud stackインストール自動化
Fabricによるcloud stackインストール自動化hiroyuki nakajima
 
サーバー実装いろいろ
サーバー実装いろいろサーバー実装いろいろ
サーバー実装いろいろkjwtnb
 
[Basic 6] DNS / ソケット通信 / その他
[Basic 6] DNS / ソケット通信 / その他[Basic 6] DNS / ソケット通信 / その他
[Basic 6] DNS / ソケット通信 / その他Yuto Takei
 
WebRTC SFU Mediasoup Sample update
WebRTC SFU Mediasoup Sample updateWebRTC SFU Mediasoup Sample update
WebRTC SFU Mediasoup Sample updatemganeko
 
plotnetcfg入門 | Introduction to plotnetcfg
plotnetcfg入門 | Introduction to plotnetcfgplotnetcfg入門 | Introduction to plotnetcfg
plotnetcfg入門 | Introduction to plotnetcfgKentaro Ebisawa
 
tcpdump & xtrabackup @ MySQL Casual Talks #1
tcpdump & xtrabackup @ MySQL Casual Talks #1tcpdump & xtrabackup @ MySQL Casual Talks #1
tcpdump & xtrabackup @ MySQL Casual Talks #1Ryosuke IWANAGA
 
配布用Beginnerならきっと役立つmaster slave環境
配布用Beginnerならきっと役立つmaster slave環境配布用Beginnerならきっと役立つmaster slave環境
配布用Beginnerならきっと役立つmaster slave環境yut148atgmaildotcom
 
Havana版 RDO-QuickStart-3 (140421-Havana-RDO-QuickStart-3.pdf)
Havana版 RDO-QuickStart-3 (140421-Havana-RDO-QuickStart-3.pdf) Havana版 RDO-QuickStart-3 (140421-Havana-RDO-QuickStart-3.pdf)
Havana版 RDO-QuickStart-3 (140421-Havana-RDO-QuickStart-3.pdf) VirtualTech Japan Inc.
 
Docker 18.09 新機能
Docker 18.09 新機能Docker 18.09 新機能
Docker 18.09 新機能Akihiro Suda
 
OpenStack + Common Lisp
OpenStack + Common LispOpenStack + Common Lisp
OpenStack + Common Lispirix_jp
 

Similar a NanoStrand (20)

勉強会向けサーバを作ってみる2 / Rasbian jessieを試す/ Google Authenticatorのパスコードを作る
勉強会向けサーバを作ってみる2 / Rasbian jessieを試す/ Google Authenticatorのパスコードを作る勉強会向けサーバを作ってみる2 / Rasbian jessieを試す/ Google Authenticatorのパスコードを作る
勉強会向けサーバを作ってみる2 / Rasbian jessieを試す/ Google Authenticatorのパスコードを作る
 
Hacking Vox and Plagger
Hacking Vox and PlaggerHacking Vox and Plagger
Hacking Vox and Plagger
 
Reading NATS
Reading NATSReading NATS
Reading NATS
 
WebRTC SFU mediasoup sample
WebRTC SFU mediasoup sampleWebRTC SFU mediasoup sample
WebRTC SFU mediasoup sample
 
おまえらこのライブラリ使ってないの? m9 (2013-07)
おまえらこのライブラリ使ってないの? m9	(2013-07)おまえらこのライブラリ使ってないの? m9	(2013-07)
おまえらこのライブラリ使ってないの? m9 (2013-07)
 
WebRTC meetup Tokyo 1
WebRTC meetup  Tokyo 1WebRTC meetup  Tokyo 1
WebRTC meetup Tokyo 1
 
Fabricによるcloud stackインストール自動化
Fabricによるcloud stackインストール自動化Fabricによるcloud stackインストール自動化
Fabricによるcloud stackインストール自動化
 
How to run P4 BMv2
How to run P4 BMv2How to run P4 BMv2
How to run P4 BMv2
 
サーバー実装いろいろ
サーバー実装いろいろサーバー実装いろいろ
サーバー実装いろいろ
 
[Basic 6] DNS / ソケット通信 / その他
[Basic 6] DNS / ソケット通信 / その他[Basic 6] DNS / ソケット通信 / その他
[Basic 6] DNS / ソケット通信 / その他
 
WebRTC SFU Mediasoup Sample update
WebRTC SFU Mediasoup Sample updateWebRTC SFU Mediasoup Sample update
WebRTC SFU Mediasoup Sample update
 
plotnetcfg入門 | Introduction to plotnetcfg
plotnetcfg入門 | Introduction to plotnetcfgplotnetcfg入門 | Introduction to plotnetcfg
plotnetcfg入門 | Introduction to plotnetcfg
 
ICHIGEKI-MT 2015/03/14
ICHIGEKI-MT 2015/03/14ICHIGEKI-MT 2015/03/14
ICHIGEKI-MT 2015/03/14
 
The basic of performance tuning
The basic of performance tuningThe basic of performance tuning
The basic of performance tuning
 
Puppet on AWS
Puppet on AWSPuppet on AWS
Puppet on AWS
 
tcpdump & xtrabackup @ MySQL Casual Talks #1
tcpdump & xtrabackup @ MySQL Casual Talks #1tcpdump & xtrabackup @ MySQL Casual Talks #1
tcpdump & xtrabackup @ MySQL Casual Talks #1
 
配布用Beginnerならきっと役立つmaster slave環境
配布用Beginnerならきっと役立つmaster slave環境配布用Beginnerならきっと役立つmaster slave環境
配布用Beginnerならきっと役立つmaster slave環境
 
Havana版 RDO-QuickStart-3 (140421-Havana-RDO-QuickStart-3.pdf)
Havana版 RDO-QuickStart-3 (140421-Havana-RDO-QuickStart-3.pdf) Havana版 RDO-QuickStart-3 (140421-Havana-RDO-QuickStart-3.pdf)
Havana版 RDO-QuickStart-3 (140421-Havana-RDO-QuickStart-3.pdf)
 
Docker 18.09 新機能
Docker 18.09 新機能Docker 18.09 新機能
Docker 18.09 新機能
 
OpenStack + Common Lisp
OpenStack + Common LispOpenStack + Common Lisp
OpenStack + Common Lisp
 

NanoStrand