Non-­‐blocking	
  “Scalable”	
  Network	
  
Programming	
  	
  
with	
  “aleph	
  (by	
  Z.Tellman)”	
	
  
S.Asahara	
  
@...
Scalable	
  Server	
  Programming	
•  Scalableなサーバプログラムを書きたい	
  
–  Java	
  NIOやNeFyを使うと良いが、なかなか面倒..	
  
–  JavaでConcurren...
aleph/lamina/gloss	
•  3つのライブラリから構成	
  
・	
  lamina 	
  非同期処理ライブラリ	
  	
  
	
   	
   	
   	
  (Async	
  Queue,	
  TaskPipe...
Network	
  Programing	
•  Blocking	
  I/O	
  ベース	
  
	
  
Good:	
  	
  ホスト間のinteracUonは書きやすい	
  
	
  
Bad:	
  	
  	
  	
  ...
Blocking	
  I/O	
	
;; Network間での入出力処理をイメージしたコード	
;; ブロックされる部分があるので1Thread/1Clientが必要となる	
	
(defn client-process [sock]	
	(...
Non-­‐Blocking	
  I/O	
;; 前ページの処理を、Non-Blocking I/Oで書いた場合のイメージ	
;; イベントドリブンのなのでシーケンシャルな処理をするには、	
;; 状態管理が必要になる	
(def clien...
aleph	
;; alephを使って書いた場合のイメージ	
;; イベントドリブンな処理をpromise のpipelineとして表現	
(defn client-process [ch ci]	
	(enqueue ch "What's y...
gloss	
;; Cの構造体イメージでパケットの仕様が記述できる	
(defcodec my-codec { 	:a :int32,	
	:b (g/string :utf-8 :delimiters ["¥0"]), 	
	 	 	 	 	...
その他情報	
•  Lamina	
  
–  hFps://github.com/ztellman/lamina	
  
–  Stellman氏の解説動画	
  
hFp://www.infoq.com/presentaUons/Event...
Upcoming SlideShare
Loading in …5
×

Non-blocking “Scalable” Network Programming with “aleph (by Z.Tellman)”

4,061 views
3,968 views

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,061
On SlideShare
0
From Embeds
0
Number of Embeds
3,512
Actions
Shares
0
Downloads
2
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Non-blocking “Scalable” Network Programming with “aleph (by Z.Tellman)”

  1. 1. Non-­‐blocking  “Scalable”  Network   Programming     with  “aleph  (by  Z.Tellman)”   S.Asahara   @sukenosin
  2. 2. Scalable  Server  Programming •  Scalableなサーバプログラムを書きたい   –  Java  NIOやNeFyを使うと良いが、なかなか面倒..   –  JavaでConcurrentな処理を書くのは、良い思い出が無い..   –  Concurrentな処理をするなら Clojureが良いらしいが..   •  便利なライブラリがあった!   –  Zach  Tellman氏の  “aleph”     –  hFp://github.com/ztellman/aleph   –  NeFyベース   –  直接 NeFy  や  NIO  を使うより、とてもシンプルに書ける  
  3. 3. aleph/lamina/gloss •  3つのライブラリから構成   ・  lamina  非同期処理ライブラリ            (Async  Queue,  TaskPipeline)   ・  gloss    バイナリデータのencode/decodeのためのDSL   ・ aleph  NeFy・lamina・gloss  ベースの        Network  Programming  Framework  
  4. 4. Network  Programing •  Blocking  I/O  ベース     Good:    ホスト間のinteracUonは書きやすい     Bad:          1つのクライアントにつき1つのスレッド消費するので、      同時接続数が増えるとオーバーヘッドが大きくなる   •  Non-­‐blocking  I/O  ベース     Good:    1スレッドで複数のソケットの処理を行うため、      同時接続数が増えた時の効率が良い     Bad:    イベントドリブンなので、コードが煩雑になりがち   –  各クライアントの処理の進行管理   –  ブロックする処理を書けない  etc..  
  5. 5. Blocking  I/O ;; Network間での入出力処理をイメージしたコード ;; ブロックされる部分があるので1Thread/1Clientが必要となる (defn client-process [sock] (send “Hello, What’s your name?” sock) ;; 出力 (set-name (read-line sock)) ;; ここで入力待ちが起こる (send “What’s your age?” sock) (set-age (read-line sock)) (send “OK, Thank you!” sock))  
  6. 6. Non-­‐Blocking  I/O ;; 前ページの処理を、Non-Blocking I/Oで書いた場合のイメージ ;; イベントドリブンのなのでシーケンシャルな処理をするには、 ;; 状態管理が必要になる (def client-process [sock event state] (case event :connected (do (send “Hello, What’s your name” sock) 0) ;; 次の状態を返す :received (case state 0 (do (set-name (received event)) (send “OK, What’s your age” sock) 1) ;; 次の状態を返す 1 (do (set-age (received event)) (send “OK, Thank you!” sock)))))
  7. 7. aleph ;; alephを使って書いた場合のイメージ ;; イベントドリブンな処理をpromise のpipelineとして表現 (defn client-process [ch ci] (enqueue ch "What's your name?") (run-pipeline (read-channel ch) ;; read-channelはtask(promise)を返し、 ;; ブロックしない (fn [received] ;; 上のtaskがdeliverされたら評価される (set-name received) (enqueue ch "What's your age?") (read-channel ch)) (fn [received] (set-age received) (enqueue ch "OK, Thank you!”))))
  8. 8. gloss ;; Cの構造体イメージでパケットの仕様が記述できる (defcodec my-codec { :a :int32, :b (g/string :utf-8 :delimiters ["¥0"]), :c :ubyte}) ;; エンコード (def encoded (encode my-codec { :a 12345, :b "foo bar baz", :c 111})) ;; encodedの中身 (vec (.array (contiguous encoded))) ⇒  [0 0 48 57 102 111 111 32 98 97 114 32 98 97 122 0 111] ;; デコード (decode my-codec encoded) ⇒  {:c 111, :b "foo bar baz", :a 12345}  
  9. 9. その他情報 •  Lamina   –  hFps://github.com/ztellman/lamina   –  Stellman氏の解説動画   hFp://www.infoq.com/presentaUons/Event-­‐Driven-­‐Programming-­‐in-­‐Clojure   •  Gloss   –  hFps://github.com/ztellman/gloss   •  Sample   –  hFps://github.com/sukenosin/aleph-­‐example    

×