NanoStrand

M
Masashi UmezawaManager at 合同会社ソフトウメヤ
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させること
NanoStrand
今後は?
● 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で、気軽に高速なネットワークプログラムが書け
る
● いろいろなものとつないで楽しみましょう
● 今後の拡張にご期待ください!!
1 of 26

Recommended

Raspberry Piにdiskless modeのalpine linuxを導入してみる by
Raspberry Piにdiskless modeのalpine linuxを導入してみるRaspberry Piにdiskless modeのalpine linuxを導入してみる
Raspberry Piにdiskless modeのalpine linuxを導入してみるKenichiro MATOHARA
5.6K views34 slides
オープンソースカンファレンス大分参加報告 & 勉強会向けサーバを作ってみる by
オープンソースカンファレンス大分参加報告 & 勉強会向けサーバを作ってみるオープンソースカンファレンス大分参加報告 & 勉強会向けサーバを作ってみる
オープンソースカンファレンス大分参加報告 & 勉強会向けサーバを作ってみるKenichiro MATOHARA
2.1K views27 slides
hpingで作るパケット by
hpingで作るパケットhpingで作るパケット
hpingで作るパケットTakaaki Hoyo
14.9K views21 slides
OpenFlowでいろんなプロトコルを 話そうとするとどうなるか by
OpenFlowでいろんなプロトコルを 話そうとするとどうなるかOpenFlowでいろんなプロトコルを 話そうとするとどうなるか
OpenFlowでいろんなプロトコルを 話そうとするとどうなるかMasaru Oki
2K views12 slides
ちょっと古いマシンにLinuxを by
ちょっと古いマシンにLinuxをちょっと古いマシンにLinuxを
ちょっと古いマシンにLinuxをKenichiro MATOHARA
1.4K views11 slides
about Tcpreplay by
about Tcpreplayabout Tcpreplay
about Tcpreplay@ otsuka752
29.5K views23 slides

More Related Content

What's hot

「Dockerはいいぞ」 for Laboratory LT by
「Dockerはいいぞ」 for Laboratory LT「Dockerはいいぞ」 for Laboratory LT
「Dockerはいいぞ」 for Laboratory LTShimpeiIwamaru
78 views16 slides
20110205.linux 0.01 by
20110205.linux 0.0120110205.linux 0.01
20110205.linux 0.01YAMANE Toshiaki
741 views17 slides
マウスを使わないでキーボードで快適に生活する方法(GNU Screen/tmux/byobu/awesome) by
マウスを使わないでキーボードで快適に生活する方法(GNU Screen/tmux/byobu/awesome)マウスを使わないでキーボードで快適に生活する方法(GNU Screen/tmux/byobu/awesome)
マウスを使わないでキーボードで快適に生活する方法(GNU Screen/tmux/byobu/awesome)Kenichiro MATOHARA
3.1K views40 slides
Tarantubeでメッセージキューを使い倒す by
Tarantubeでメッセージキューを使い倒すTarantubeでメッセージキューを使い倒す
Tarantubeでメッセージキューを使い倒すMasashi Umezawa
412 views29 slides
Bossan dentoo by
Bossan dentooBossan dentoo
Bossan dentookubo39
1.2K views24 slides
#mailerstudy 01 LT POP/IMAP入門 by
#mailerstudy 01 LT POP/IMAP入門#mailerstudy 01 LT POP/IMAP入門
#mailerstudy 01 LT POP/IMAP入門Takashi Takizawa
2.6K views21 slides

What's hot(19)

「Dockerはいいぞ」 for Laboratory LT by ShimpeiIwamaru
「Dockerはいいぞ」 for Laboratory LT「Dockerはいいぞ」 for Laboratory LT
「Dockerはいいぞ」 for Laboratory LT
ShimpeiIwamaru78 views
マウスを使わないでキーボードで快適に生活する方法(GNU Screen/tmux/byobu/awesome) by Kenichiro MATOHARA
マウスを使わないでキーボードで快適に生活する方法(GNU Screen/tmux/byobu/awesome)マウスを使わないでキーボードで快適に生活する方法(GNU Screen/tmux/byobu/awesome)
マウスを使わないでキーボードで快適に生活する方法(GNU Screen/tmux/byobu/awesome)
Kenichiro MATOHARA3.1K views
Tarantubeでメッセージキューを使い倒す by Masashi Umezawa
Tarantubeでメッセージキューを使い倒すTarantubeでメッセージキューを使い倒す
Tarantubeでメッセージキューを使い倒す
Masashi Umezawa412 views
Bossan dentoo by kubo39
Bossan dentooBossan dentoo
Bossan dentoo
kubo391.2K views
#mailerstudy 01 LT POP/IMAP入門 by Takashi Takizawa
#mailerstudy 01 LT POP/IMAP入門#mailerstudy 01 LT POP/IMAP入門
#mailerstudy 01 LT POP/IMAP入門
Takashi Takizawa2.6K views
Open stack+lagopus できるかな by Masaru Oki
Open stack+lagopus できるかなOpen stack+lagopus できるかな
Open stack+lagopus できるかな
Masaru Oki1.4K views
Lagopus performance by Masaru Oki
Lagopus performanceLagopus performance
Lagopus performance
Masaru Oki2.4K views
import dpkt したよ #ssmjp 2014/02/28 by th0x0472
import dpkt したよ #ssmjp 2014/02/28import dpkt したよ #ssmjp 2014/02/28
import dpkt したよ #ssmjp 2014/02/28
th0x04723.4K views
Ruby&Active Support for expert 3 by xibbar
Ruby&Active Support for expert 3Ruby&Active Support for expert 3
Ruby&Active Support for expert 3
xibbar795 views
Rustのタスクモデルについて by zigen
RustのタスクモデルについてRustのタスクモデルについて
Rustのタスクモデルについて
zigen 1.9K views
マスタリングJUNOS DHCP by ZenSekibe
マスタリングJUNOS DHCPマスタリングJUNOS DHCP
マスタリングJUNOS DHCP
ZenSekibe75 views
Lagopus, raw socket build by Masaru Oki
Lagopus, raw socket buildLagopus, raw socket build
Lagopus, raw socket build
Masaru Oki2.5K views

Viewers also liked

Mayer, james 2015 by
Mayer, james 2015Mayer, james 2015
Mayer, james 2015James Mayer
283 views3 slides
Pillarの紹介 by
Pillarの紹介Pillarの紹介
Pillarの紹介Masashi Umezawa
333 views35 slides
Podsumowanie 13. edycji akcji charytatywnej "Czapka św. Mikołaja" by
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
573 views11 slides
MAYER, James 2015 by
MAYER, James 2015MAYER, James 2015
MAYER, James 2015James Mayer
201 views3 slides
BLVC-plannen_Brochure by
BLVC-plannen_BrochureBLVC-plannen_Brochure
BLVC-plannen_BrochurePeter Veringmeier
172 views8 slides
Improving UX checkout by
Improving UX checkoutImproving UX checkout
Improving UX checkoutMyriam Jessier
536 views26 slides

Viewers also liked(9)

Mayer, james 2015 by James Mayer
Mayer, james 2015Mayer, james 2015
Mayer, james 2015
James Mayer283 views
Podsumowanie 13. edycji akcji charytatywnej "Czapka św. Mikołaja" by MRMRybnika
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"
MRMRybnika573 views
MAYER, James 2015 by James Mayer
MAYER, James 2015MAYER, James 2015
MAYER, James 2015
James Mayer201 views
The Poet in You: A mini-workshop on poetry writing by Miguel De Jesús
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
Miguel De Jesús5.2K views

Similar to NanoStrand

勉強会向けサーバを作ってみる2 / Rasbian jessieを試す/ Google Authenticatorのパスコードを作る by
勉強会向けサーバを作ってみる2 / Rasbian jessieを試す/ Google Authenticatorのパスコードを作る勉強会向けサーバを作ってみる2 / Rasbian jessieを試す/ Google Authenticatorのパスコードを作る
勉強会向けサーバを作ってみる2 / Rasbian jessieを試す/ Google Authenticatorのパスコードを作るKenichiro MATOHARA
3.7K views37 slides
Hacking Vox and Plagger by
Hacking Vox and PlaggerHacking Vox and Plagger
Hacking Vox and PlaggerTatsuhiko Miyagawa
2.7K views47 slides
Reading NATS by
Reading NATSReading NATS
Reading NATSKatsunori Kawaguchi
11.3K views36 slides
WebRTC SFU mediasoup sample by
WebRTC SFU mediasoup sampleWebRTC SFU mediasoup sample
WebRTC SFU mediasoup samplemganeko
5.1K views21 slides
おまえらこのライブラリ使ってないの? m9 (2013-07) by
おまえらこのライブラリ使ってないの? m9	(2013-07)おまえらこのライブラリ使ってないの? m9	(2013-07)
おまえらこのライブラリ使ってないの? m9 (2013-07)Toru Furukawa
3.1K views32 slides
WebRTC meetup Tokyo 1 by
WebRTC meetup  Tokyo 1WebRTC meetup  Tokyo 1
WebRTC meetup Tokyo 1mganeko
4.2K views73 slides

Similar to NanoStrand(20)

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

NanoStrand