際際滷

際際滷Share a Scribd company logo
Non-?\blocking	
 ?^Scalable ̄	
 ?Network	
 ?
Programming	
 ?	
 ?
with	
 ?^aleph	
 ?(by	
 ?Z.Tellman) ̄	
	
 ?
S.Asahara	
 ?
@sukenosin
Scalable	
 ?Server	
 ?Programming	
?? Scalableなサ`バプログラムをきたい	
 ?
C? Java	
 ?NIOやNeFyを聞うと措いが、なかなか中宜..	
 ?
C? JavaでConcurrentなI尖をくのは、措い房い竃がoい..	
 ?
C? ConcurrentなI尖をするなら Clojureが措いらしいが..	
 ?
?? 宴旋なライブラリがあった	
 ?
C? Zach	
 ?Tellman箆の	
 ?^aleph ̄	
 ?	
 ?
C? hFp://github.com/ztellman/aleph	
 ?
C? NeFyベ`ス	
 ?
C? 岷俊 NeFy	
 ?や	
 ?NIO	
 ?を聞うより、とてもシンプルにける	
 ?
aleph/lamina/gloss	
?? 3つのライブラリから撹	
 ?
?	
 ?lamina 	
 ?掲揖豚I尖ライブラリ	
 ?	
 ?
	
 ? 	
 ? 	
 ? 	
 ?(Async	
 ?Queue,	
 ?TaskPipeline)	
 ?
?	
 ?gloss	
 ? 	
 ?バイナリデ`タのencode/decodeのためのDSL	
 ?
? aleph 	
 ?NeFy?lamina?gloss	
 ?ベ`スの	
 ?
	
 ? 	
 ? 	
 ?Network	
 ?Programming	
 ?Framework	
 ?
Network	
 ?Programing	
?? Blocking	
 ?I/O	
 ?ベ`ス	
 ?
	
 ?
Good:	
 ?	
 ?ホストgのinteracUonはきやすい	
 ?
	
 ?
Bad:	
 ?	
 ?	
 ?	
 ?	
 ?1つのクライアントにつき1つのスレッドMするので、	
 ?
	
 ?  揖r俊A方がえるとオ`バ`ヘッドが寄きくなる	
 ?
?? Non-?\blocking	
 ?I/O	
 ?ベ`ス	
 ?
	
 ?
Good:	
 ? 	
 ?1スレッドで}方のソケットのI尖を佩うため、	
 ?
	
 ? 	
 ?揖r俊A方がえたrの紳覆措い	
 ?
	
 ?
Bad:	
 ? 	
 ?イベントドリブンなので、コ`ドがjになりがち	
 ?
C? 光クライアントのI尖のM佩砿尖	
 ?
C? ブロックするI尖をけない	
 ?etc..	
 ?
Blocking	
 ?I/O	
	
;; Networkgでの秘竃薦I尖をイメ`ジしたコ`ド	
;; ブロックされる何蛍があるので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	
;; 念ペ`ジのI尖を、Non-Blocking I/Oでいた栽のイメ`ジ	
;; イベントドリブンのなのでシ`ケンシャルなI尖をするには、	
;; 彜B砿尖が駅勣になる	
(def client-process [sock event state]	
	(case event	
	 	:connected	
	 	(do (send ^Hello, What¨s your name ̄ sock)	
	 	 	 0) ;; 肝の彜Bを卦す	
	
	 	:received	
	 	(case state	
	 	 	0 	(do (set-name (received event))	
	 	 	 	 	 (send ^OK, What¨s your age ̄ sock)	
	 	 	 	 	 1) ;; 肝の彜Bを卦す	
	 	 	1 	(do	 (set-age (received event))	
	 	 	 	 	 (send ^OK, Thank you! ̄ sock)))))
aleph	
;; alephを聞っていた栽のイメ`ジ	
;; イベントドリブンなI尖をpromise のpipelineとして燕F	
(defn client-process [ch ci]	
	(enqueue ch "What's your name?")	
	(run-pipeline	
	 	(read-channel ch) ;; read-channelはtask(promise)を卦し、	
	 	 	 	 	 	 	 ;; ブロックしない	
	(fn [received] ;; 貧のtaskがdeliverされたらuされる	
	 	 	 	(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	
 ?
C? hFps://github.com/ztellman/lamina	
 ?
C? Stellman箆の盾h啝	
 ?
hFp://www.infoq.com/presentaUons/Event-?\Driven-?\Programming-?\in-?\Clojure	
 ?
?? Gloss	
 ?
C? hFps://github.com/ztellman/gloss	
 ?
?? Sample	
 ?
C? hFps://github.com/sukenosin/aleph-?\example	
 ?
	
 ?

More Related Content

Non-blocking ^Scalable ̄ Network Programming with ^aleph (by Z.Tellman) ̄

  • 1. Non-?\blocking ?^Scalable ̄ ?Network ? Programming ? ? with ?^aleph ?(by ?Z.Tellman) ̄ ? S.Asahara ? @sukenosin
  • 2. Scalable ?Server ?Programming ?? Scalableなサ`バプログラムをきたい ? C? Java ?NIOやNeFyを聞うと措いが、なかなか中宜.. ? C? JavaでConcurrentなI尖をくのは、措い房い竃がoい.. ? C? ConcurrentなI尖をするなら Clojureが措いらしいが.. ? ?? 宴旋なライブラリがあった ? C? Zach ?Tellman箆の ?^aleph ̄ ? ? C? hFp://github.com/ztellman/aleph ? C? NeFyベ`ス ? C? 岷俊 NeFy ?や ?NIO ?を聞うより、とてもシンプルにける ?
  • 3. aleph/lamina/gloss ?? 3つのライブラリから撹 ? ? ?lamina ?掲揖豚I尖ライブラリ ? ? ? ? ? ?(Async ?Queue, ?TaskPipeline) ? ? ?gloss ? ?バイナリデ`タのencode/decodeのためのDSL ? ? aleph ?NeFy?lamina?gloss ?ベ`スの ? ? ? ?Network ?Programming ?Framework ?
  • 4. Network ?Programing ?? Blocking ?I/O ?ベ`ス ? ? Good: ? ?ホストgのinteracUonはきやすい ? ? Bad: ? ? ? ? ?1つのクライアントにつき1つのスレッドMするので、 ? ?  揖r俊A方がえるとオ`バ`ヘッドが寄きくなる ? ?? Non-?\blocking ?I/O ?ベ`ス ? ? Good: ? ?1スレッドで}方のソケットのI尖を佩うため、 ? ? ?揖r俊A方がえたrの紳覆措い ? ? Bad: ? ?イベントドリブンなので、コ`ドがjになりがち ? C? 光クライアントのI尖のM佩砿尖 ? C? ブロックするI尖をけない ?etc.. ?
  • 5. Blocking ?I/O ;; Networkgでの秘竃薦I尖をイメ`ジしたコ`ド ;; ブロックされる何蛍があるので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. Non-?\Blocking ?I/O ;; 念ペ`ジのI尖を、Non-Blocking I/Oでいた栽のイメ`ジ ;; イベントドリブンのなのでシ`ケンシャルなI尖をするには、 ;; 彜B砿尖が駅勣になる (def client-process [sock event state] (case event :connected (do (send ^Hello, What¨s your name ̄ sock) 0) ;; 肝の彜Bを卦す :received (case state 0 (do (set-name (received event)) (send ^OK, What¨s your age ̄ sock) 1) ;; 肝の彜Bを卦す 1 (do (set-age (received event)) (send ^OK, Thank you! ̄ sock)))))
  • 7. aleph ;; alephを聞っていた栽のイメ`ジ ;; イベントドリブンなI尖をpromise のpipelineとして燕F (defn client-process [ch ci] (enqueue ch "What's your name?") (run-pipeline (read-channel ch) ;; read-channelはtask(promise)を卦し、 ;; ブロックしない (fn [received] ;; 貧のtaskがdeliverされたらuされる (set-name received) (enqueue ch "What's your age?") (read-channel ch)) (fn [received] (set-age received) (enqueue ch "OK, Thank you! ̄))))
  • 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. その麿秤 ?? Lamina ? C? hFps://github.com/ztellman/lamina ? C? Stellman箆の盾h啝 ? hFp://www.infoq.com/presentaUons/Event-?\Driven-?\Programming-?\in-?\Clojure ? ?? Gloss ? C? hFps://github.com/ztellman/gloss ? ?? Sample ? C? hFps://github.com/sukenosin/aleph-?\example ? ?