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

AkkaHTTPの紹介とAkkaStreams連携(公開用)

nishikawasasaki
September 20, 2018
640

 AkkaHTTPの紹介とAkkaStreams連携(公開用)

ReactiveSystemMeetupin大阪
https://connpass.com/event/98181/

nishikawasasaki

September 20, 2018
Tweet

Transcript

  1. Akka HTTP の紹介と Akka Streams 連携 Reactive System Meetup in

    大阪 2018/09/20 Reactive System Meetup in 大阪 1 @にしかわささき
  2. 自己紹介 にしかわささき @nishikawasasaki • 広島@M4 → 神戸のシステム屋さん • Java Scala

    JavaScript … • インフラ AWS KVS … • 検索 データ分析 GIS … • Vim → Emacs → vscode • マネージャー, , 2018/09/20 Reactive System Meetup in 大阪 2
  3. 目次 1. Akka HTTP とは 2. Akka HTTP の簡単な例 3.

    Akka HTTP のルーティングとディレクティブ 4. Akka HTTP と Akka Streams の関係 5. Akka HTTP と Akka Streams の連携 2018/09/20 Reactive System Meetup in 大阪 3
  4. Akka HTTP とは 2018/09/20 Reactive System Meetup in 大阪 5

     Akka Streams ベース  旧 spray.io → Akka HTTP (多少の差異あり)  HTTP を扱うモジュール群 (≠フレームワーク)
  5. Akka HTTP とは 2018/09/20 Reactive System Meetup in 大阪 6

    ×フレームワーク → ◦「ライブラリスイート」  ユースケースにあわせて必要な部分だけを 組み合わせて使える  同じ機能でも抽象化の違う API を用意している
  6. Akka HTTP とは 2018/09/20 Reactive System Meetup in 大阪 7

    Akka HTTP を構成するモジュール  akka-http 高レベルサーバーサイドAPI  akka-http-core 低レベルサーバーサイドAPI  akka-http-testkit テストユーティリティ  akka-http-spray-json JSON 変換ユーティリティ  akka-http-xml XML 変換ユーティリティ
  7. Akka HTTP とは 2018/09/20 Reactive System Meetup in 大阪 8

    akka-http  抽象度 高  HTTP を便利に扱うための DSL 等を含む akka-http-core  抽象度 低  HTTP を扱うコア機能に限定し軽量・簡潔  HTTP クライアント機能
  8. Akka HTTP の簡単な例 • 依存するライブラリと import 2018/09/20 Reactive System Meetup

    in 大阪 10 https://doc.akka.io/docs/akka-http/current/introduction.html#using-akka-http
  9. Akka HTTP の簡単な例 2018/09/20 Reactive System Meetup in 大阪 11

    https://doc.akka.io/docs/akka-http/current/introduction.html#using-akka-http 全体像 レスポンス
  10. Akka HTTP の簡単な例 2018/09/20 Reactive System Meetup in 大阪 12

    https://doc.akka.io/docs/akka-http/current/introduction.html#using-akka-http 全体像 用意 HTTP 待受 停止 ルーティング
  11. Akka HTTP の簡単な例 2018/09/20 Reactive System Meetup in 大阪 13

    https://doc.akka.io/docs/akka-http/current/introduction.html#using-akka-http 用意
  12. Akka HTTP の簡単な例 2018/09/20 Reactive System Meetup in 大阪 14

    https://doc.akka.io/docs/akka-http/current/introduction.html#using-akka-http • Actor を使うための準備 • Actor で処理を実行するために必要な ActorMaterializer の準備 • ExecutionContext の用意 (import scala.concurrent.ExecutionContext.Implicits.global でも可) Actor System は全体で 1 つ デフォルトは fork-join-executor
  13. Akka HTTP の簡単な例 2018/09/20 Reactive System Meetup in 大阪 15

    https://doc.akka.io/docs/akka-http/current/introduction.html#using-akka-http ルーティング
  14. Akka HTTP の簡単な例 2018/09/20 Reactive System Meetup in 大阪 16

    https://doc.akka.io/docs/akka-http/current/introduction.html#using-akka-http • DSL を使ってルーティングを定義 • 単純な HTML をレスポンス GET の場合の処理 レスポンスの content-type は HTML を指定
  15. Akka HTTP の簡単な例 2018/09/20 Reactive System Meetup in 大阪 17

    https://doc.akka.io/docs/akka-http/current/introduction.html#using-akka-http HTTP 待受
  16. Akka HTTP の簡単な例 2018/09/20 Reactive System Meetup in 大阪 18

    https://doc.akka.io/docs/akka-http/current/introduction.html#using-akka-http • 前ページで用意したルーティングを使って localhost:8080 で待受開始 レスポンス
  17. Akka HTTP の簡単な例 2018/09/20 Reactive System Meetup in 大阪 19

    https://doc.akka.io/docs/akka-http/current/introduction.html#using-akka-http 停止
  18. Akka HTTP の簡単な例 2018/09/20 Reactive System Meetup in 大阪 20

    https://doc.akka.io/docs/akka-http/current/introduction.html#using-akka-http • 何か入力されるまで停止 • 待受を停止して終了する
  19. Akka HTTP の簡単な例 2018/09/20 Reactive System Meetup in 大阪 21

    https://doc.akka.io/docs/akka-http/current/introduction.html#using-akka-http 全体像 (再掲) ルーティング
  20. ルーティングとディレクティブ 例3-1: path 系ディレクティブ (path) /foo/ へのリクエストも当てはまらない 2018/09/20 Reactive System

    Meetup in 大阪 28 /foo にリクエストした場合 /foo 以外にリクエストした場合 当てはめたい場合は……?
  21. ルーティングとディレクティブ 例3-2: pathPrefix ディレクティブ /foooooo や /foooooo/// へのリクエストも 当てはまってしまう 2018/09/20

    Reactive System Meetup in 大阪 29 /foo/ にリクエストした場合 /foo 以外にリクエストした場合
  22. ルーティングとディレクティブ 例3-3: pathEndOrSingleSlash ディレクティブ 2018/09/20 Reactive System Meetup in 大阪

    30 /foo にリクエストした場合 /foo/ にリクエストした場合 それ以外にリクエストした場合
  23. Akka HTTP と Akka Streams の関係 2018/09/20 Reactive System Meetup

    in 大阪 35  「Akka Streams ベース」 Akka HTTP もストリームを扱っている → akka-http では うまく akka-stream が隠されている
  24. Akka HTTP と Akka Streams の関係 2018/09/20 Reactive System Meetup

    in 大阪 36 HTTP 待受部分の抜粋 (抽象度高)
  25. Akka HTTP と Akka Streams の関係 2018/09/20 Reactive System Meetup

    in 大阪 37 HTTP 待受部分の抜粋 (抽象度低) https://doc.akka.io/docs/akka-http/current/server-side/ low-level-api.html#starting-and-stopping
  26. Akka HTTP と Akka Streams の関係 2018/09/20 Reactive System Meetup

    in 大阪 38 HTTP 待受部分の抜粋 (抽象度低) https://doc.akka.io/docs/akka-http/current/server-side/ low-level-api.html#starting-and-stopping Akka Streamsっぽさ
  27. Akka HTTP と Akka Streams の関係 Source Output のみ 2018/09/20

    Reactive System Meetup in 大阪 39 Source Akka Streams の部品 Flow Input と Output の両方 Flow Sink Input のみ Sink
  28. Akka HTTP と Akka Streams の関係 Source 1 つと Flow

    いくつかと Sink 1 つを 組み合わせて両端が「閉じた」処理の流れを形成する (→ RunnableGraph) 2018/09/20 Reactive System Meetup in 大阪 40 Source Sink Source Flow Sink Flow Sink Source Flow Flow は 使わなくても良い 組み合わせ方は自由。 それぞれ 再利用も可能。
  29. Akka HTTP と Akka Streams の関係 は Scala のソースにすると 2018/09/20

    Reactive System Meetup in 大阪 41 Source Sink ソケットへのバインディングが Source
  30. Akka HTTP と Akka Streams の関係 2018/09/20 Reactive System Meetup

    in 大阪 42 ルーティング (処理) 部分の抜粋 (抽象度低)
  31. Akka HTTP と Akka Streams の関係 2018/09/20 Reactive System Meetup

    in 大阪 43 ルーティング (処理) 部分の抜粋 (抽象度低) Akka Streamsっぽさ
  32. Akka HTTP と Akka Streams の関係 2018/09/20 Reactive System Meetup

    in 大阪 44 ルーティング (処理) 部分の抜粋 (抽象度低) 1 接続あたりで考えると ・リクエストがSource ・処理が Flow ・レスポンスが Sink Flow[リクエスト→レスポンス]
  33. Akka HTTP と Akka Streams の関係  Akka Streams を意識しなくても便利に使える

     Akka HTTP にも Akka Streams が隠れている 2018/09/20 Reactive System Meetup in 大阪 45
  34. Akka HTTP と Akka Streams の連携 2018/09/20 Reactive System Meetup

    in 大阪 47  クライアントからファイルが ストリーミングでアップロードされる場合 →サーバーサイドの処理の状況に応じて 背圧制御をおこないたい (対応している場合)
  35. Akka HTTP と Akka Streams の連携 2018/09/20 Reactive System Meetup

    in 大阪 48 JSON ファイルをストリームで受け付ける例 https://doc.akka.io/docs/akka-http/current/routing-dsl/ source-streaming-support.html#consuming-json-streaming-uploads
  36. Akka HTTP と Akka Streams の連携 2018/09/20 Reactive System Meetup

    in 大阪 49 JSON ファイルをストリームで受け付ける例 リクエスト (ストリーム) を Measurement 型の Source として 取り扱う https://doc.akka.io/docs/akka-http/current/routing-dsl/ source-streaming-support.html#consuming-json-streaming-uploads
  37. Akka HTTP と Akka Streams の連携 2018/09/20 Reactive System Meetup

    in 大阪 50 JSON ファイルをストリームで受け付ける例 Akka Streams をつかって 処理を実行 途中処理は Flow https://doc.akka.io/docs/akka-http/current/routing-dsl/ source-streaming-support.html#consuming-json-streaming-uploads
  38. Akka HTTP と Akka Streams の連携 2018/09/20 Reactive System Meetup

    in 大阪 51 JSON ファイルをストリームで受け付ける例 ストリームが終了して Future から結果を取り出せたら レスポンスを返す https://doc.akka.io/docs/akka-http/current/routing-dsl/ source-streaming-support.html#consuming-json-streaming-uploads
  39. まとめ 2018/09/20 Reactive System Meetup in 大阪 53 Akka HTTP

    では必要最小限な処理だけを 利用することができる Akka HTTP のディレクティブは 組み合わせしだいで複雑なルーティングを表現できる Akka Streams は意識しなくても便利に使えるが ある程度の理解があった方が捗る
  40. 紹介 2018/09/20 Reactive System Meetup in 大阪 54 Akka HTTPでWeb

    APIに仕立てる Think IT(シンクイット) https://thinkit.co.jp/article/15235 Scala関西Summit 2018 11/10(土),11/11(日) https://2018.scala-kansai.org/#top-timetable Akka実践バイブル アクターモデルによる 並行・分散システムの実現 https://www.shoeisha.co.jp/book/ detail/9784798153278