Upgrade to Pro — share decks privately, control downloads, hide ads and more …

RustのWebフレームワーク周りの概観

E42cffccdc14c60a449caac8de0ce0e0?s=47 hayao
July 20, 2022

 RustのWebフレームワーク周りの概観

FutureCon2022での登壇資料です。

RustのWebフレームワーク周りの代表的なソフトウェアスタックであるaxum、hyper、tokio、mio、towerについて簡単に説明しました。

E42cffccdc14c60a449caac8de0ce0e0?s=128

hayao

July 20, 2022
Tweet

Other Decks in Programming

Transcript

  1. 1 RustによるWeb開発のエコシステム

  2. 自己紹介 本田紘規 2021年4月新卒入社 金融系PJに従事 2

  3. RustでWeb開発に触れたいきさつ ITほとんど未経験で入社 → 弊社はWebシステムの構築案件が多いので、Web開発の基礎を身に つける必要がある →Rustが好きだから、RustでWeb開発に入門しよう🤪 3

  4. RustでWeb開発を行うメリット • GCがなく、C/C++と同程度に高速。 • 型付けが強く、コンパイラの補助も強力なので、安定したシステムを 構築しやすいかもしれない。 • クールな機能をたくさん持っているので生産性高く開発できる。 4

  5. 本発表で参照するクレートの関係 axum hyper Service tokio mio use use web framework

    http server asynchronous runtime I/O library Routing ObjectをServiceに 変換してhyperに渡す 5
  6. 参照したバージョン axum 0.5.4 hyper 0.14.18 tokio 0.17.0 mio 0.8.0 tower

    0.4.11 6
  7. tokio axum hyper Service tokio mio use use web framework

    http server asynchronous runtime I/O library Routing ObjectをServiceに 変換してhyperに渡す 7
  8. tokio Rustのデファクトの非同期ランタイム。AWSの人が中心となって開発 していて、AWS内部でも使われている。 V1.0が出ていて成熟している。 関連クレートも充実しつつある。 • tracing • tokio-metrics •

    tokio-console 8
  9. tokio サンプル コード 9

  10. Output 10

  11. イメージ図 tokio runtime contextでspawnを呼べばtokioがtaskを良しなに実 行してくれる。 Thread Pool tokio runtime (multi

    thread scheduler) spawn Future tokio runtime context SpawnにFutureを渡すとtaskが生成される block_onを呼ぶことでruntimeを起動 11
  12. Futureトレイト 12

  13. Futureトレイト Runtimeはpollを呼ぶことでtaskを進行させる。 pollはすぐに値を返すことが期待されていて • Poll::Pending • Poll::ready(val) のいずれかを返す 13

  14. runtime task群の実行を管理 協調的スケジューリング taskがブロッキングI/Oを行って、ブロッキングしたり、busy loop に陥るのは厳禁 runtime全体がスタックする可能性がある。 ワークスティーリング idle状態のスレッドがbusyなスレッドからtaskを奪う 14

  15. mio axum hyper Service tokio mio use use web framework

    http server asynchronous runtime I/O library Routing ObjectをServiceに 変換してhyperに渡す 15
  16. mio クロスプラットフォームI/Oライブラリ I/Oイベントを監視する。 I/O多重化 このI/Oイベント監視して! (複数イベント登録可能) mio register OS poll

    Event loop 16
  17. hyper axum hyper Service tokio mio use use web framework

    http server asynchronous runtime I/O library Routing ObjectをServiceに 変換してhyperに渡す 17
  18. hyper HTTPクライアント・サーバーライブラリ。SeanさんというAWSの人が開発 している。 高速であること、正確であることを重視しているらしい V1.0へのロードマップが公開されていて、V1.0になるのもそう遠くなさそう。 Web開発エコシステムにおける主な役割 • HTTPプロトコルによるクライアントとのやり取り • Serviceとソケットを紐づけ

    18
  19. axum axum hyper Service tokio mio use use web framework

    http server asynchronous runtime I/O library Routing ObjectをServiceに 変換してhyperに渡す 19
  20. axum tokioチームのdavidさんという方を中心に開発されているWebフレーム ワーク 2021年7月に発表された若いフレームワーク。現在も活発に開発が進め られている。 RouterとHandlerに注力している。 20

  21. Routing 21

  22. Handler 引数に欲しいものを書き並べていく方式 22

  23. Handler トレイト 23

  24. call 関数 ライブラリ使用者が実装したハンドラとcall関数の紐づけ call Request<B> handler URI Method Body res

    Response (Pin<…>) from_request from_request from_request Into_response 24
  25. tower axum hyper Service tokio mio use use web framework

    http server asynchronous runtime I/O library Routing ObjectをServiceに 変換してhyperに渡す 25
  26. tower Serviceトレイトを定義 雰囲気的にはJavaのServlet インターフェースのような もの axumとhyperの橋渡し 26

  27. まとめ • RustによるWeb開発でaxumを使おうとすると、デフォルトでは hyper、tokio、mioが使われる。 • 基盤となるtokio、hyperは成熟していて、プロダクションで使えるク オリティ。 • Rustを使えば高速で安定したWebシステムを生産性高く構築できる かも?

    27