SlideShare a Scribd company logo
1
Server Side
Dart
About me
Name
takyam
Twitter
twitter.com/takyam
Github
github.com/takyam-git
Qiita
qiita.com/takyam
About me
My favorite programming languages
• PHP
• JavaScript
• NodeJS
• Go
• Ruby
• Dart <- New!!
Agenda
Dartがクライアントサイドだけではなく、
サーバーサイドの機能も備えていることを紹介。
充分にサーバーサイドでも戦えるプラットフォームです。
サーバーサイドDartとは
01
サーバーサイドDartの比較対象になるのは、
JavaでもRubyでもなく、NodeJSです。
NodeJSよりもDartがパワフルである事を紹介。
NodeJSとの比較
02
いくつかDartでWebアプリケーションを作ってみた、
感想と、そこから考える今後の課題を紹介。
果たしてプロダクション投入は可能なのか。
サーバーサイドDartの現状と今後
03
Server Side Dart
01
Dartで一番ホットな話題は、クライアントサイド
• dart2js
• Dartium
• AngularDart
• PolymerDart
• Fletch
• dartpad
Server Side Dart
01
サーバーサイドもパワフル
• HTTP Server
• WebSocket Server
• Isolate
• Observatory (for profiling)
• Major database drivers (MySQL,Postgres,Redis…)
Server Side Dart
01
シンプルなHTTPサーバー
Server Side Dart
01
シンプルなHTTPサーバー (Redstone)
Server Side Dart
01
シンプルなWebSocketサーバー
Server Side Dart
01
Isolateによるマルチコア対応
Server Side Dart
01
Isolateによるマルチコア対応
Server Side Dart
01
shared:true にすると
同じhost/portでサーバーを作れる
細かいこと気にせずにspawnで、
サーバーを追加すれば良い
Isolateによるマルチコア対応
Server Side Dart
01
• 2つのHttpServerサーバーが立ち上がってます
Isolateによるマルチコア対応
Server Side Dart
01
$ wrk -H 'Host: localhost' -d 15 -c 256 -t 4 http://localhost:8080/
Running 15s test @ http://localhost:8080/
4 threads and 256 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 20.47ms 13.14ms 610.85ms 99.46%
Req/Sec 3.00k 341.77 3.96k 84.93%
173951 requests in 15.00s, 36.00MB read
Socket errors: connect 0, read 249, write 0, timeout 0
Requests/sec: 11595.84
Transfer/sec: 2.40MB
• 1つのコアを使った場合
Isolateによるマルチコア対応
Server Side Dart
01
$ wrk -H 'Host: localhost' -d 15 -c 256 -t 4 http://localhost:8080/
Running 15s test @ http://localhost:8080/
4 threads and 256 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 11.41ms 3.07ms 112.37ms 84.89%
Req/Sec 5.42k 772.33 7.30k 77.44%
309725 requests in 15.00s, 64.10MB read
Socket errors: connect 0, read 249, write 0, timeout 0
Requests/sec: 20648.84
Transfer/sec: 4.27MB
• 2つのコアを使った場合(約178%)
Oveservatoryでらくらくデバッグ
Server Side Dart
01
Oveservatoryでらくらくデバッグ
Server Side Dart
01
• --enable-vm-service:{$portNumber} 付きで起動す
るとObservatoryが起動します
• すぐに終了するようなスクリプトやライブラリでも使い
たい場合は、--pause_isolates_on_exit オプションを
一緒に使います
Oveservatoryでらくらくデバッグ
• debugger
• class hierarchy
• cpu profile
• allocation profile
• heap map
• metrics
• code coverage
Server Side Dart
01
Oveservatoryでらくらくデバッグ
Server Side Dart
01
Observatory live demo
データベース系pubパッケージ
• MySQL - pub.dartlang.org/packages/sqljocky
• PostgreSQL - pub.dartlang.org/packages/postgresql
• Redis - pub.dartlang.org/packages/redis
• MongoDB - pub.dartlang.org/packages/mongo_dart
• RethinkDB - pub.dartlang.org/packages/rethinkdb
• AMQP - pub.dartlang.org/packages/dart_amqp
Server Side Dart
01
あらためて、サーバーサイドもパワフル
• サーバーサイドを実装するにあたって、必要最低限なものは既にある
• IsolateやObservatoryといった強力な機能やツールを備えている
• dart:io パッケージが、サーバーサイド開発に必要な

基礎機能を、ほとんど提供してくれる。
Server Side Dart
01
vs NodeJS
02
Better NodeJS としての Dart
• NodeJSは一世を風靡したサーバーサイドJSプラットフォーム
• リアルタイムWEB(というかWebsocket)の実装に、

非常に適したプラットフォーム
• ただし、NodeJSでの開発は 辛み を伴っている
• Javascriptベースである事がメリットでもあり、デメリットになって
いる(異論は認めます)
vs NodeJS
02
Better NodeJS としての Dart
• 一方 Dartは、NodeJSができることは大抵でき、

そのうえでNodeJSを上回る言語仕様、機能、ツールを備えている
• 謎のメモリーリークに悩まされる必要もない
• クライアントサイドのDart->JSのように、コンパイル作業も必要ない
• 型が欲しいからTypeScript使う、といったことも不要
• NodeJSを使うのかio.jsを使うのか悩む必要もない
• パフォーマンスもNodeJSより多少良い
vs NodeJS
02
APIを比較
• https://nodejs.org/api/ と https://api.dartlang.org/ を目diff
して一部気づいたものを抜粋
• Dartに無いもの
• REPL, TTY, smalloc,punycode,__dirname,__filename
• Nodeに無いもの
• mirrors, collection, coreのクラスいろいろ(Setとか)
vs NodeJS
02
APIを比較
• できる、できないレベルでいうと大して違いない
• それぞれ別のアプローチだったり(isolate / child_process等)、コア
部分には無いけどエコシステムでカバーしてたりする
• そういった意味で、APIの比較はあまり意味をなさない
vs NodeJS
02
パフォーマンスを比較
• https://www.techempower.com/benchmarks/#section=data-r10&hw=peak&test=json&p=9zlfk-cn4
vs NodeJS
02
パフォーマンスを比較
• https://www.techempower.com/benchmarks/#section=data-r10&hw=peak&test=db&p=9zlfk-cn4
vs NodeJS
02
パフォーマンスを比較
• https://www.techempower.com/benchmarks/#section=data-r10&hw=peak&test=query&p=9zlfk-cn4
vs NodeJS
02
パフォーマンスを比較
• https://www.techempower.com/benchmarks/#section=data-r10&hw=peak&test=update&p=9zlfk-cn4
vs NodeJS
02
パフォーマンスを比較
• https://www.techempower.com/benchmarks/#section=data-r10&hw=peak&test=plaintext&p=9zlfk-cn4
vs NodeJS
02
パフォーマンスを比較
• 本当にこのベンチマークがあってるか微妙(生よりフレームワーク経
由の方が速いなんて・・・)
• とはいえ、JSON Serialize と Plaintext という、コア部分の速度に
影響される部分でNodeより高いスコアが出てる。
vs NodeJS
02
環境構築の比較
• Macでのローカル環境の構築という意味だとどっちも簡単
• Linux上での構築という意味だとNodeJSに軍配
• Ubuntu/Debian系はapt-getでインストールできるけど他は大変
• VersionManager(nodebrew/nvm)はNodeに軍配
• DartのVersionManagerは知らない・・・
• ググったら maksimr/dvm ってのがあるみたいです
• PaaSやクラウドだとどっちも大して変わらない気がします
vs NodeJS
02
エコシステムの比較
vs NodeJS
02
パッケージ数 先月のDL数 サイト
Pub 1,673 不明 とりあえず作った感
NPM 150,629 1,496,922,095 カッコイイ
主観的な比較
• pubが育ってないので、足りないパッケージは多い
• パフォーマンスは当初想像していたほどの差は無い
• が、そんな事関係ないレベルで書き心地が違う
• NodeJS vs Dart だとNodeに軍配上がりそうなもんだけど、

JavaScript vs Dart で圧倒的にDartに軍配があがる。
• 結果として、NodeJS vs Dart は、Dartの勝利
vs NodeJS
02
Current and Future
03
サーバーサイドDartの現在
• 使ってる人が少ない(特に国内)
• フレームワークの選択肢が無い
• Webアプリケーションなら Redstone か Shelf
• RestfulAPI だけなら加えて RPC
• どれを選んでも絶対に足りない機能がある
• Ubuntu以外のオンプレに載せるの辛い
• CentOS/RHELへのインストールが大変
• 情報が少ない
Current and Future
03
サーバーサイドDartの現在(プロダクト投入状況)
• Dart summit で Moving from Node.js to Dart を発表した
Faisal Abid 氏の所属する Dynamatic社 がリリースした Market
Wolf というAndroidAppのサーバーサイドはDartで書かれているよ
うです。
• ソレ以外だと このサービス とか このサービス もサーバーサイドが
Dartで書かれてるらしいです。
• 少なくともメジャーなサービスでの導入実績は知らないです

(ご存知の方教えてください><
Current and Future
03
現状で趣味アプリ作ってみた感想
• start と shelf を使ってみた感想
• 楽しい と 辛い が半々
• 辛み成分でいうと、出たてのNodeJSみたいな感じ
• 書いてて、とてもキレイに書けるが、アレやコレが無い状態
• オンメモリ以外のセッション管理や、CSRFトークン&認証用のパッ
ケージが見つからず結局自作
• 本当に pub はスカスカなんで、未来に向けて投資し放題
Current and Future
03
現状で趣味アプリ作ってみた感想
• lib/src 以下のディレクトリ構成のベストプラクティスが無い
• pubに公開できるようなライブラリ単位ならともかく、どうディレク
トリ切って、どこから _impl.dart にすべきなのかがふわっとしてる
• パッケージルートのファイルが、importとpart でどんどん肥大化し
ていく
Current and Future
03
現状で趣味アプリ作ってみた感想
• とか何かいろいろ愚痴っぽい事はあるものの、結局は楽しい。
• 「キレイに書く」ための方法がいくつも用意されてる。
• NodeJSで実現できなかった、「キレイに書かれた非同期処理」を非
常に簡単に実装する事ができるのは気持ちいい。
• Stream / Future を使わざるを得ないので、使いこなすせると楽し
い
• 何やかんやゆーても新しい言語の習得は楽しい
Current and Future
03
将来に向けての期待と希望
• 何はともあれDartisanが増えてほしいです
• Dartisanが増える -> pubが充実する -> 大勝利
• NodeJSの開発者もDartを触ってみると魅力に気づくはず
• そのためにも 日本Dartユーザー会や日本のDartisansによる情報の増
加は非常に重要だと思っています
Current and Future
03
将来に向けての期待と希望
• DartSDK Roadmap を見ても、サーバーサイドで関係ありそうなの
は、「HTTP2 + gRPC」くらいですが、現時点で大抵の事は
「dart:io」使えばできますし、dart-ext で(C/C++)拡張すればそれ
こそ夢は無限大な感じだと思ってます。
Current and Future
03
at the end…
99
最後に
• 日本Dartユーザー会の発足・主催と、

この会を開催していただき、本当にありがとうございました。
• 日本でのDartの盛り上がりが楽しみです。
at the end…
99
Thank you for
listening!!
00

More Related Content

Server Side Dart