• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Non-blocking “Scalable” Network Programming with “aleph (by Z.Tellman)”
 

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

on

  • 3,907 views

 

Statistics

Views

Total Views
3,907
Views on SlideShare
549
Embed Views
3,358

Actions

Likes
1
Downloads
1
Comments
0

4 Embeds 3,358

http://shibuya.lisp-users.org 3271
http://127.0.0.1 75
http://localhost 11
https://www.google.co.jp 1

Accessibility

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

    • Non-­‐blocking  “Scalable”  Network   Programming     with  “aleph  (by  Z.Tellman)”   S.Asahara   @sukenosin
    • Scalable  Server  Programming •  Scalableなサーバプログラムを書きたい   –  Java  NIOやNeFyを使うと良いが、なかなか面倒..   –  JavaでConcurrentな処理を書くのは、良い思い出が無い..   –  Concurrentな処理をするなら Clojureが良いらしいが..   •  便利なライブラリがあった!   –  Zach  Tellman氏の  “aleph”     –  hFp://github.com/ztellman/aleph   –  NeFyベース   –  直接 NeFy  や  NIO  を使うより、とてもシンプルに書ける  
    • aleph/lamina/gloss •  3つのライブラリから構成   ・  lamina  非同期処理ライブラリ            (Async  Queue,  TaskPipeline)   ・  gloss    バイナリデータのencode/decodeのためのDSL   ・ aleph  NeFy・lamina・gloss  ベースの        Network  Programming  Framework  
    • Network  Programing •  Blocking  I/O  ベース     Good:    ホスト間のinteracUonは書きやすい     Bad:          1つのクライアントにつき1つのスレッド消費するので、      同時接続数が増えるとオーバーヘッドが大きくなる   •  Non-­‐blocking  I/O  ベース     Good:    1スレッドで複数のソケットの処理を行うため、      同時接続数が増えた時の効率が良い     Bad:    イベントドリブンなので、コードが煩雑になりがち   –  各クライアントの処理の進行管理   –  ブロックする処理を書けない  etc..  
    • 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))  
    • 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)))))
    • 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!”))))
    • 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}  
    • その他情報 •  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