概要

別段深い理由はありませんが、このブログのバックエンドをDartAqueductで全て書き換えました。

このブログをリリースした2018年ではまずNode.js(Express)、その後Python(Flask)で書き直していました。
3つの言語/フレームワークで同じAPIを提供するWebサービスを構築してきたわけですが、結論から言うとDartが最も書いていて楽だし生産性も高いなと個人的には感じています。

なぜDartか

スクリプトライクにサクサク書ける上に型付き言語なDart、これは本当に自分好みです。
JVM以外でなんか簡単に色々書ける汎用言語が無いかな〜と探していてDartに辿り着きました。
RustとGoも試してはいましたが、Dartが癖が無くて自分には合っていました。

良くどのプログラミング言語を勉強するべきか、利用するべきかという事が話題になりますが、好きな物をやればいいと思います。
1つ勉強したらそれをずーっと使い続けないといけないわけでもないですし。
ただ、やはり何かプログラミング言語を勉強するというのは非常にコストが掛かるというのはよく分かります。
その点、Dart自体は特に変わったパラダイムを含んでいるわけでもなく、言語として非常にシンプルなので、勉強する際のコストがビックリするほど低いと思います。
なので、Dartの何処が優れているから使い始めた、というわけではなくて、「シンプルだから使ってみるか」っていう気軽さがDartを使い始めるきっかけになりました。

なぜAqueductか

DartといえばFlutterでのモバイルアプリ開発が盛り上がっていますが、自分の守備範囲が基本的にサーバサイドなので、やはりサーバサイドでDartを使ってみたい、と思い、フレームワークを探した所、Twitterでフォローしている方からAqueductをオススメされたのじゃあコレ使ってみよう、ということでAqueductにしてみました。
実際の所、DartでWebフレームワークと言うと今の所Aqueduct一強?な感じです。

Aqueductどうなの?

個人的には好きです。フルスタックなフレームワークなので、必要なものは全て標準で整っていると思います。
OAuth2.0周りの機能も標準で搭載されている上に、それらを使ったテストも非常に簡単に書けます。

まともに使ったのことの有るORMは、GrailsのGORMだけなのであまり比較は出来ませんが、AqueductのORMは、GORMから比べるとちょっと面倒くさいなぁ、という感じです。
本当に薄いORMなので、GORMのようなBlog.findAllByTitle('hoge')と言うような書き方は出来ず、基本的に全部自分でクエリを記述する必要が有ります。
ただ言い方を変えると、余計なものは何一つ無いシンプルな構成とも言えます。起動も早いです。

なお、標準で全部面倒を見てくれるようなDI機能は無いので、channel.dartというルーティング等初期化処理を記述するファイルに自分で必要なクラスのインスタンスを生成して、Controllerなどのコンストラクタに手動でDIしてあげる必要が有ります。
コレも良し悪しありますが、個人的には自動でDIされると何処で何が行われているのか判りづらくなるので、手動でDI出来るのはありがたいです。

なお、Dart自体には、Google製ですが非公式なDIライブラリが有るようです。
そのうちDartに組み込まれたりライブラリとして提供されるかも知れません。

ちなみに、標準でサポートされているデータベースはPostgreSQLのみのようです。
PostgreSQL好きなのでコレは問題にはなりませんでした。ちなみに9.6以降がサポートされています。

Dart/Aqueductの速度

ローカルの開発環境で、実際のデータを投入した状態でテストしてみると、ブログの一覧を取得するAPIであれば、同時接続数170ぐらいまでは1秒未満で処理できている感じです。

ab -n 1000 -c 170 localhost:8888/hogehogeなら、abの実行結果は大体Requests per second: 181.47 [#/sec] (mean)ぐらいになります。
全体のテストは大体5-6秒ぐらいです。

ちなみに、DBに接続しない単純にテキストをJSONで返す処理の場合、同じ条件(ab -n 1000 -c 170 localhost:8888/hogehoge)でテストすると、Requests per second: 13165.52 [#/sec] (mean)という結果になります。チョッパヤです。
数を増やしてab -n 10000 -c 1000 localhost:8888/hogehogeでテストしても結果は変わりません。

DBが絡むと大分遅くなります。これはもう本当に単純にそういうものなのか、それともAqueductのORMがネックなのか、もしくはPostgreSQLドライバがネックなのか、3点確認するべき点が残っています。
さらにJSONに変換する際にAqueductのModelがシリアライズされているので、そこの速度も調査する必要が有ります。
が、普通に動いているので、おいおいという感じです。

ただ、本番(つまりこのページを表示しているサーバ)に対して確認すると大分遅いです。
なので恐らくハードの違いだとは思いますが、別にサーバのロードアベレージ見ても特におかしな部分もないのでちょっとよくわからない状態です。
VPSですしDocker上で動かしているのでネットワークとかそこら辺なのかなとは予想しています。

なので、少なくともDart自体は非常に高速に動作する、という判断をしても良いと思います。

フロントエンドのバージョンアップ

ついでなのでNuxt.jsを1.0から2.6に一気にアップグレードしました。
コレはもう難しいことは何も考えずに、新しい最新のNuxt.jsバージョンの空プロジェクトを作成して、そこに既存のプログラムをコピーしました。
別段ハマるところもなくスムーズに移行することが出来ました。

基本的に満足

まだまだ自分のDart、Aqueduct力が低いのでよくわからない部分など有りますが、基本的に今回の新しい環境には大満足です。
Dart自体はやはりクライアントサイド(ブラウザ、モバイルアプリ)が主戦場だと思いますし、Flutter製アプリをブラウザで動かうようにする、Hummingbirdというプロジェクトが有るようなので、Dart自体は今後どんどん存在感を増してくるのは?と期待しています。