BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ アーティクル ”Fastify” Node.js用Webフレームワーク - 共同開発者Matteo Collina氏へのインタビュー

”Fastify” Node.js用Webフレームワーク - 共同開発者Matteo Collina氏へのインタビュー

キーポイント

  • Fastify is a Node.js web framework focused on performance and developer experience
  • The Fastify team has spent considerable time building a highly supportive and encouraging community 
  • Fastify gained adoption by solving real needs of Node.js developers
  • Contributing to Fastify is strongly encouraged and several active contributors have found contributing as a great way to advance their careers
  • The key to open source success is finding balance and not trying to do everything for everyone.

原文(投稿日:2020/08/28)へのリンク

Fasttifyは、Node.jsのエコシステムにおける多くのニーズを満たす、パフォーマンスオーバーヘッドの小さな、オープンソースのWebフレームワークです。Fastifyでは、強固なオープンソースプロジェクトとコミュニティを構築するための原動力として、開発者エクスペリエンスに重きを置いています。FastifyプロジェクトはOpenJS Foundationの一部です。

私たちは先日公開されたリリース3を含む、Fastifyプロジェクトの全容について詳しく知るべく、Matteo Collina氏のもとを訪ねました。氏はNearFormのテクニカルディレクタであり、Fastify開発者のひとりであると同時に、Node.jsプロジェクトのアクティブなコントリビュータでもあります。

InfoQ: Matteoさん、ご協力ありがとうございます。Fastifyの開発を始めたきっかけは、どのようなものだったのですか?

Collina: 2016年に私は、企業におけるNode.jsデプロイメントのスケールアップを支援し、パフォーマンス障害やボトルネックの解決を行う会社を、同僚のDavid Mark Clemens(当時はNearFormで働いていました)と一緒に立ち上げたのですが、それきっかけになりました。私たちのクライアントに共通する、いくつかの問題をそこで見付けたのです。

  1. CPUボトルネックを識別するためのフレームグラフ生成作業が極めて難しいものであること。私たちの目指す方向へ進むためには、もっと迅速なユーザフィードバックが必要であり、その中から0x(現在はNode Clinicの一部)が生まれたのです。
  2. ロギングがNode.jsアプリケーションの大きなボトルネックであったので、私たちはPinoを書きました。その頃のPinoは、場合によっては10倍ちかく高速でしたが、V8側の改善に加え、他のロガーもパフォーマンスに注目するようになったため、その差は2倍にまで縮まっています。Pinoは大きな成功を収め、現在では毎月200万回のダウンロードがあります。
  3. 当時のおもなWebフレームワーク(Express、Restify、Hapi、Koa)はどれも、Node.jsに大きなオーバーヘッドを発生させるため、スループットはNode.jsの持つ能力の10~25にまで低減されていました。既存のフレームワークと競合するために、新たなフレームワークでは言語の開発をキャッチアップし、拡張性のあるプラグインシステムを備えると同時に、オーバーヘッドをゼロに近付ける必要があったのです。

Node.js Summit 2016 San FranciscoでPinoを発表した後、私は第3の問題である、Webフレームワークの開発についての検討を始めたのですが、このタスクは私ひとりには荷が重すぎる(Davidは他の仕事にかかっていました)ので、別の会社から支援を受けることにしました。 

新たなWebフレームワークは、Node.jsと同じオープンガバナンスの精神に基づいて開発したいと思っていたので、まずはコミュニティを拡大して、フレームワークはその後にすることにしました。

最初にいくつかの予備的なモジュールとavvio(Fastifyのプラグインシステム)、fast-json-stringfy(JSONオブジェクトのレンダリングにおいて2倍のスループットを持つ)を開発して、概念検証モデルを短期間で構築しました。このモジュールの最初の名前は"beo" — "be open"の短縮版 — でした。Fastifyと名前を変えたのは2016年の終わりです。

Node.jsのトレーニングコースをBologna(私の"alma mater(母校)")で行っていた頃、Tomas Della Vedovaからオープンソースのキャリアを獲得する方法について質問された私は、このWebフレーム開発を一緒に行うことを持ちかけました。Tomasは現在、Elasticで働いていて、npmにあるElasticSearchクライアントのメンテナをしています。

InfoQ: Tomas Della Vedovaさんの話はとても素晴らしいですね。私も実際に、同じような方法で最初の仕事をもらいました!Fastifyを開発する中で、どのようなことを学びましたか?

Collina: 何千もありますが、おもな3つを挙げてみましょう。

  1. "パフォーマンス"を後で考えることはできない、ということ。最初から考えておかなくてはなりません。"スクラッチから書き直す"大きな理由のひとつは、パフォーマンスなのです。
  2. コミュニティは何よりも大切である、ということ。私は、Fastifyの運用対応バージョンを提供するために必要な労力を、過小評価し過ぎていました。現在はこのコミュニティの中で、15人程度の人たちが手助けをしてくれています。
  3. ユーザが無償サポートを要求しても応じてはいけない、ということ。ユーザが自身で学び、自身のバグを修正できるようにすべきです。

InfoQ: オープンソースのメンテナの期待や時間に関してならば記事のひとつふたつは書けそうですが、今回は話題を変えましょう!FastifyのようなWebフレームワークの現在の状況に驚いていますか?

Collina: Expressが圧倒的な支持を得たために、エコシステムとしては多少停滞しているように思います。Expressの使用法に関するチュートリアルが無数にあって、その名前の多くにNode.jsが関連しています。 

Express v4はasync/awaitをネイティブにサポートしていません。async/awaitは、アプリケーション開発を大幅に簡略化する新しい言語構造なのですが、これをサポートしていないことで、アプリケーションがメモリリークの影響を受けると同時に、リソース枯渇によるサービス拒否攻撃の可能性もあります。回避策はいくつかありますが、フレームワークがネイティブにサポートしていない、という事実が問題であることに変わりはありませんし、Express v5は2014年から開発中のままです。

InfoQ: Dojoで開発しているひとりとして、Expressが近々Dojoに取って代わって、JSフレームワークの次期メジャーバージョンを記述する時間として最も長いものになってくれることを、実は密かに期待しています;) オープンソース開発の苦労については多くの話を聞きますが、どのような方法によって、FastifyとNode.jsの作業に対する熱意と集中を持ち続けているのでしょう?やりがいを感じた瞬間やストーリがあれば、教えて頂けますか?

Collina: 経験から言えば、オープンソースの苦労はメンテナンスが原因になっています。私の戦略はこうです — 私はおもに自分のバグを修正したり、他の人たちからのプルリクエストをレビューしたりしています。私(や私のクライアント)に影響しないバグを直接的、あるいは間接的に修正することはめったにありません。開発者や企業から、プルリクエストを送りたいという打診があった場合、私はこう返答します — "PRを送ってくれるのですね?ユニットテストを忘れないでください"。これはGitHubのテンプレートにもなっています。

InfoQ: この数年間でFastifyはどのように進化しましたか?パフォーマンスの大幅な向上につながったものとしては、何があるのでしょうか?

Collina: FastifyはNode.jsのコアとほぼ同じ速さなので、大幅なパフォーマンス改善というものはありません。オーバーヘッドは極めて少ないのです。難しい部分のひとつは、スループットを妥協することなく新機能を加える、というバランスを取ることです。

最新のv3リリースで大きく改善された点はTypeScriptのサポートで、これはおもにEthan Arrowood氏のコントリビューションによるものです。EthanにはNode.js Interactive 2018の時に、カナダのバンクーバで出会ったのですが、その時に彼からオープンソースを立ち上げる方法について質問されたので、Fastifyプロジェクトの活発なコミュニティについて話しました。2019年にそのEthanがFastifyの型を完全に書き直して、TypeScriptを快適に使用できるようにしてくれたのです。Ethanは現在、Microsoftのエンジニアです。

InfoQ: "Fastifyにコントリビュートして、Fastify関連の仕事を手に入れよう!"という共通スレッドができそうですね。

Collina: 誰に対しても保証はできませんが、実例はTomasやEthanの他にもあります。オープンソースは自身のネットワークを構築して、自分のできることを広く認知してもらうには絶好の手段です。仲間からのコードレビューを通じて、多くを学ぶこともできます — 納期がないOSSは、品質面でも優れている傾向があります。

InfoQ: Fastifyの今後の予定を教えてください。

Collina: 1年程度は安定性に関する作業をして、2021年の第1~2四半期、ユーザに影響を与えることなくNode.js 10.xのサポートを排除できた時点で、次のメジャーバージョンをリリースする計画です(https://github.com/nodejs/Release参照)。それまでは、エコシステムモジュールを中心に、優れた開発者エクスペリエンスを提供したいと思っています。

InfoQ: Fastifyにコントリビュートしたい場合、どのように関係を持てばよいのでしょうか?

Collina: https://www.fastify.io/contribute/に、新しい参加者が解決可能な"good first issue"がリストアップされています。プルリクエストは通常、短期間でレビューされます。まずは気になる部分を修正したり、使いたい機能を開発したりすることをお勧めします。バグやtypoを見つけたら、PRを送るか、イシューをオープンしてください!

InfoQ: Fastifyに関するサクセスストーリで、公開できるものはありますか? 

Collina: 話すことのできないストーリが多いのですが、話せるものもいくつかあります!NearFormは先頃、アイルランド(および他の数カ国)向けに、COVID-19接触追跡アプリケーションを公開しました。このサービスはすべてFastify上に構築されていて、使用者数は数日間で0から150万アクティブユーザ数にまで急増しています。

Yoox-Net-A-Porterでは数年前から、FastifyをAPIゲートウェイロジックとして使用しています。詳細は、"Microservices: Solving a problem like routing ― 2020 update"、"Microservices: Solving a problem like routing — part 1"、"Microservices: Solving a problem like routing ― part 2"を参照してください。

InfoQ: Denoが多くの話題を呼んでいますが、一方で同プロジェクトに対しては懐疑的な意見もかなり見受けられます。これについては、どう思いますか?

Collina: 競争があるのはよいことです!Denoはたくさんの優れたアイデアをNode.jsコミュニティに提供してくれています(トップレベルawaitやセキュリティポリシなど、実装も始まっています)。

DemoがNode.jsとは異なる領域のひとつは、そのモジュールシステムです。npmとNode.jsが大きな成功を収めた本質的な理由は、ソフトウェアの再利用という重要な問題を解決したことにある、と私は思っています。ですが、ご存知のように、世界規模でのソフトウェアの大規模な再利用にはいくつかの問題がありました。Denoのモジュールシステムは基本的に、現在のnpmほど安全ではないと思います。新たな"leftpad"問題が起きるのは必然ですが、こちらでは、それを修正する"中央エンティティ"は存在しないのです。

Denoのシェア拡大に向けたマーケティングアプローチは好きではないので、その件についてツィートしている人たちのフォローは止めました。例えば、メンテナのひとりはパリのある講演で、Denoが"Node.jsをぶち壊す(destroy Node.js)"と主張しています(その部分は、講演の記録からは除外されています)。同じような"Node.jsをぶち壊す"というツイートはコミュニティのあちらこちらに見られますし、Denoのツィッターアカウント自体も、Node.jsをジョークで挑発しているのです。技術的な面からは、彼らがベンチマークに使用しているテクノロジは、公平な比較を行っていません。私が2020年5月に行った計測(他の人による実証もあります)では、合成負荷(synthetic load)によるテストにおいて、Node.jsはDenoの2倍近い速度を達成しています。

現時点ではDenoを使い始める(あるいはサポートする)理由は見つかりませんし、Denoを取り巻く現在のコミュニティ文化は、私たちがその発展に一生懸命取り組んでいるNode.jsやFastifyの文化のように魅力的な、あるいは協力的なものではありません。

InfiQ: 開発作業やセルフケアに関して、読者に公開したいような個人的な習慣は何かありますか?

Collina: 適切な環境のために投資すること、ですね。私たちは画面の前で多くの時間を過ごしますから、机(スタンディングオプションがあれば理想)やモニタ、椅子、ラップトップ、キーボード、マウス、マイクやカメラなどの品質が大きな問題になります。椅子と机、それからスクリーンは、作業中の人間工学的な姿勢を保つた上で最も重要なものです。さもなければ、背中をひどく痛めることになります。ソファやキッチンテーブルで作業するのは、長期的な解決策にはなりませんから、現在の"リモートファースト"な世界では注意する必要があります。

InfoQ: 適当な運動をして、よく食べること — ここで時間を掛けて説明することではありませんね :) Metteoさん、InfoQと読者のために、Fastifyの説明をして頂いてありがとうございました!

インタビュー回答者について

Matteo Collina氏はNearFormのテクニカルディレクタとして、世界のトップブランドを対象としたコンサルト活動をしています。2014年に氏は、"Application Platforms for the Internet of Things"という論文でPh.D.を取得しました。また、Node.js Technical Steering Committeeのメンバとして、ストリームや診断、httpに注目しています。さらに氏は、高速ロガーのPinoFasify Webフレームワークの作者で、ざっと名を挙げただけでもNode.js Interactive、NodeConf.eu、NodeSummit、JSConf.Asia、WebRebels、JsDayなど、60を越えるカンファレンスを経験した、国際的に名の知られた講演者でもあり、Packt(訳注:英国の出版社)の編集した"Node.js Cookbook, Third Edition"の共著者のひとりでもあります。夏になると氏は、Siroccoのセーリングを楽しんでいます。

この記事に星をつける

おすすめ度
スタイル

BT