Server Side Dart

47
Server Side Dart

Transcript of Server Side Dart

Page 1: Server Side Dart

1

Server SideDart

Page 2: Server Side Dart

About meNametakyam

Twittertwitter.com/takyam

Githubgithub.com/takyam-git

Qiitaqiita.com/takyam

Page 3: Server Side Dart

About meMy favorite programming languages• PHP • JavaScript • NodeJS • Go • Ruby • Dart <- New!!

Page 4: Server Side Dart

Agenda

Page 5: Server Side Dart

Dartがクライアントサイドだけではなく、 サーバーサイドの機能も備えていることを紹介。 充分にサーバーサイドでも戦えるプラットフォームです。

サーバーサイドDartとは

01

サーバーサイドDartの比較対象になるのは、 JavaでもRubyでもなく、NodeJSです。 NodeJSよりもDartがパワフルである事を紹介。

NodeJSとの比較

02

いくつかDartでWebアプリケーションを作ってみた、 感想と、そこから考える今後の課題を紹介。 果たしてプロダクション投入は可能なのか。

サーバーサイドDartの現状と今後

03

Page 6: Server Side Dart

“Server Side Dart”

01

Page 7: Server Side Dart

Dartで一番ホットな話題は、クライアントサイド

• dart2js • Dartium • AngularDart • PolymerDart • Fletch • dartpad

“Server Side Dart”01

Page 8: Server Side Dart

サーバーサイドもパワフル

• HTTP Server • WebSocket Server • Isolate • Observatory (for profiling) • Major database drivers (MySQL,Postgres,Redis…)

“Server Side Dart”01

Page 9: Server Side Dart

シンプルなHTTPサーバー

“Server Side Dart”01

Page 10: Server Side Dart

シンプルなHTTPサーバー (Redstone)

“Server Side Dart”01

Page 11: Server Side Dart

シンプルなWebSocketサーバー

“Server Side Dart”01

Page 12: Server Side Dart

Isolateによるマルチコア対応

“Server Side Dart”01

Page 13: Server Side Dart

Isolateによるマルチコア対応

“Server Side Dart”01

shared:true にすると 同じhost/portでサーバーを作れる

細かいこと気にせずにspawnで、 サーバーを追加すれば良い

Page 14: Server Side Dart

Isolateによるマルチコア対応

“Server Side Dart”01

• 2つのHttpServerサーバーが立ち上がってます

Page 15: Server Side Dart

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つのコアを使った場合

Page 16: Server Side Dart

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%)

Page 17: Server Side Dart

Oveservatoryでらくらくデバッグ

“Server Side Dart”01

Page 18: Server Side Dart

Oveservatoryでらくらくデバッグ

“Server Side Dart”01

• --enable-vm-service:{$portNumber} 付きで起動するとObservatoryが起動します • すぐに終了するようなスクリプトやライブラリでも使いたい場合は、--pause_isolates_on_exit オプションを一緒に使います

Page 19: Server Side Dart

Oveservatoryでらくらくデバッグ

• debugger • class hierarchy • cpu profile • allocation profile • heap map • metrics • code coverage

“Server Side Dart”01

Page 20: Server Side Dart

Oveservatoryでらくらくデバッグ

“Server Side Dart”01

Observatory live demo

Page 21: Server Side Dart

データベース系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

Page 22: Server Side Dart

あらためて、サーバーサイドもパワフル

• サーバーサイドを実装するにあたって、必要最低限なものは既にある • IsolateやObservatoryといった強力な機能やツールを備えている • dart:io パッケージが、サーバーサイド開発に必要な基礎機能を、ほとんど提供してくれる。

“Server Side Dart”01

Page 23: Server Side Dart

vs NodeJS

02

Page 24: Server Side Dart

Better NodeJS としての Dart

• NodeJSは一世を風靡したサーバーサイドJSプラットフォーム • リアルタイムWEB(というかWebsocket)の実装に、非常に適したプラットフォーム • ただし、NodeJSでの開発は “辛み” を伴っている • Javascriptベースである事がメリットでもあり、デメリットになっている(異論は認めます)

vs NodeJS02

Page 25: Server Side Dart

Better NodeJS としての Dart

• 一方 Dartは、NodeJSができることは大抵でき、そのうえでNodeJSを上回る言語仕様、機能、ツールを備えている • 謎のメモリーリークに悩まされる必要もない • クライアントサイドのDart->JSのように、コンパイル作業も必要ない • 型が欲しいからTypeScript使う、といったことも不要 • NodeJSを使うのかio.jsを使うのか悩む必要もない • パフォーマンスもNodeJSより多少良い

vs NodeJS02

Page 26: Server Side Dart

APIを比較

• https://nodejs.org/api/ と https://api.dartlang.org/ を目diffして一部気づいたものを抜粋 • Dartに無いもの • REPL, TTY, smalloc,punycode,__dirname,__filename • Nodeに無いもの • mirrors, collection, coreのクラスいろいろ(Setとか)

vs NodeJS02

Page 27: Server Side Dart

APIを比較

• できる、できないレベルでいうと大して違いない • それぞれ別のアプローチだったり(isolate / child_process等)、コア部分には無いけどエコシステムでカバーしてたりする • そういった意味で、APIの比較はあまり意味をなさない

vs NodeJS02

Page 28: Server Side Dart

パフォーマンスを比較

• https://www.techempower.com/benchmarks/#section=data-r10&hw=peak&test=json&p=9zlfk-cn4

vs NodeJS02

Page 29: Server Side Dart

パフォーマンスを比較

• https://www.techempower.com/benchmarks/#section=data-r10&hw=peak&test=db&p=9zlfk-cn4

vs NodeJS02

Page 30: Server Side Dart

パフォーマンスを比較

• https://www.techempower.com/benchmarks/#section=data-r10&hw=peak&test=query&p=9zlfk-cn4

vs NodeJS02

Page 31: Server Side Dart

パフォーマンスを比較

• https://www.techempower.com/benchmarks/#section=data-r10&hw=peak&test=update&p=9zlfk-cn4

vs NodeJS02

Page 32: Server Side Dart

パフォーマンスを比較

• https://www.techempower.com/benchmarks/#section=data-r10&hw=peak&test=plaintext&p=9zlfk-cn4

vs NodeJS02

Page 33: Server Side Dart

パフォーマンスを比較

• 本当にこのベンチマークがあってるか微妙(生よりフレームワーク経由の方が速いなんて・・・) • とはいえ、JSON Serialize と Plaintext という、コア部分の速度に影響される部分でNodeより高いスコアが出てる。

vs NodeJS02

Page 34: Server Side Dart

環境構築の比較

• Macでのローカル環境の構築という意味だとどっちも簡単 • Linux上での構築という意味だとNodeJSに軍配 • Ubuntu/Debian系はapt-getでインストールできるけど他は大変 • VersionManager(nodebrew/nvm)はNodeに軍配 • DartのVersionManagerは知らない・・・ • ググったら maksimr/dvm ってのがあるみたいです • PaaSやクラウドだとどっちも大して変わらない気がします

vs NodeJS02

Page 35: Server Side Dart

エコシステムの比較

vs NodeJS02

パッケージ数 先月のDL数 サイト

Pub 1,673 不明 とりあえず作った感

NPM 150,629 1,496,922,095 カッコイイ

Page 36: Server Side Dart

主観的な比較

• pubが育ってないので、足りないパッケージは多い • パフォーマンスは当初想像していたほどの差は無い • が、そんな事関係ないレベルで書き心地が違う • NodeJS vs Dart だとNodeに軍配上がりそうなもんだけど、 JavaScript vs Dart で圧倒的にDartに軍配があがる。 • 結果として、NodeJS vs Dart は、Dartの勝利

vs NodeJS02

Page 37: Server Side Dart

Current and Future

03

Page 38: Server Side Dart

サーバーサイドDartの現在

• 使ってる人が少ない(特に国内) • フレームワークの選択肢が無い • Webアプリケーションなら Redstone か Shelf • RestfulAPI だけなら加えて RPC • どれを選んでも絶対に足りない機能がある • Ubuntu以外のオンプレに載せるの辛い • CentOS/RHELへのインストールが大変 • 情報が少ない

Current and Future03

Page 39: Server Side Dart

サーバーサイドDartの現在(プロダクト投入状況)

• Dart summit で “Moving from Node.js to Dart” を発表した Faisal Abid 氏の所属する Dynamatic社 がリリースした “Market Wolf” というAndroidAppのサーバーサイドはDartで書かれているようです。 • ソレ以外だと このサービス とか このサービス もサーバーサイドがDartで書かれてるらしいです。 • 少なくともメジャーなサービスでの導入実績は知らないです(ご存知の方教えてください><

Current and Future03

Page 40: Server Side Dart

現状で趣味アプリ作ってみた感想

• start と shelf を使ってみた感想 • “楽しい” と “辛い” が半々 • 辛み成分でいうと、出たてのNodeJSみたいな感じ • 書いてて、とてもキレイに書けるが、アレやコレが無い状態 • オンメモリ以外のセッション管理や、CSRFトークン&認証用のパッケージが見つからず結局自作 • 本当に pub はスカスカなんで、未来に向けて投資し放題

Current and Future03

Page 41: Server Side Dart

現状で趣味アプリ作ってみた感想

• lib/src 以下のディレクトリ構成のベストプラクティスが無い • pubに公開できるようなライブラリ単位ならともかく、どうディレクトリ切って、どこから _impl.dart にすべきなのかがふわっとしてる • パッケージルートのファイルが、importとpart でどんどん肥大化していく

Current and Future03

Page 42: Server Side Dart

現状で趣味アプリ作ってみた感想

• とか何かいろいろ愚痴っぽい事はあるものの、結局は楽しい。 • 「キレイに書く」ための方法がいくつも用意されてる。 • NodeJSで実現できなかった、「キレイに書かれた非同期処理」を非常に簡単に実装する事ができるのは気持ちいい。 • Stream / Future を使わざるを得ないので、使いこなすせると楽しい • 何やかんやゆーても新しい言語の習得は楽しい

Current and Future03

Page 43: Server Side Dart

将来に向けての期待と希望

• 何はともあれDartisanが増えてほしいです • Dartisanが増える -> pubが充実する -> 大勝利 • NodeJSの開発者もDartを触ってみると魅力に気づくはず • そのためにも 日本Dartユーザー会や日本のDartisansによる情報の増加は非常に重要だと思っています

Current and Future03

Page 44: Server Side Dart

将来に向けての期待と希望

• DartSDK Roadmap を見ても、サーバーサイドで関係ありそうなのは、「HTTP2 + gRPC」くらいですが、現時点で大抵の事は「dart:io」使えばできますし、dart-ext で(C/C++)拡張すればそれこそ夢は無限大な感じだと思ってます。

Current and Future03

Page 45: Server Side Dart

at the end…

99

Page 46: Server Side Dart

最後に

• 日本Dartユーザー会の発足・主催と、この会を開催していただき、本当にありがとうございました。 • 日本でのDartの盛り上がりが楽しみです。

at the end…99

Page 47: Server Side Dart

Thank you for listening!!

00