Slide 1

Slide 1 text

Akka HTTP の紹介と Akka Streams 連携 Reactive System Meetup in 大阪 2018/09/20 Reactive System Meetup in 大阪 1 @にしかわささき

Slide 2

Slide 2 text

自己紹介 にしかわささき @nishikawasasaki • 広島@M4 → 神戸のシステム屋さん • Java Scala JavaScript … • インフラ AWS KVS … • 検索 データ分析 GIS … • Vim → Emacs → vscode • マネージャー, , 2018/09/20 Reactive System Meetup in 大阪 2

Slide 3

Slide 3 text

目次 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

Slide 4

Slide 4 text

Akka HTTP とは 基本の紹介 2018/09/20 Reactive System Meetup in 大阪 4

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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 変換ユーティリティ

Slide 8

Slide 8 text

Akka HTTP とは 2018/09/20 Reactive System Meetup in 大阪 8 akka-http  抽象度 高  HTTP を便利に扱うための DSL 等を含む akka-http-core  抽象度 低  HTTP を扱うコア機能に限定し軽量・簡潔  HTTP クライアント機能

Slide 9

Slide 9 text

Akka HTTP (akka-http) の簡単な例 具体例 2018/09/20 Reactive System Meetup in 大阪 9

Slide 10

Slide 10 text

Akka HTTP の簡単な例 • 依存するライブラリと import 2018/09/20 Reactive System Meetup in 大阪 10 https://doc.akka.io/docs/akka-http/current/introduction.html#using-akka-http

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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 を指定

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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 で待受開始 レスポンス

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

Akka HTTP の簡単な例 2018/09/20 Reactive System Meetup in 大阪 21 https://doc.akka.io/docs/akka-http/current/introduction.html#using-akka-http 全体像 (再掲) ルーティング

Slide 22

Slide 22 text

akka-http の ルーティングとディレクティブ 慣れると便利? 2018/09/20 Reactive System Meetup in 大阪 22

Slide 23

Slide 23 text

ルーティングとディレクティブ • ディレクティブ (Directive) • 用意されたディレクティブや 自作のディレクティブを ネスト・組み合わせ = ルーティングツリーの作成 2018/09/20 Reactive System Meetup in 大阪 23

Slide 24

Slide 24 text

ルーティングとディレクティブ 例1: complete ディレクティブ リクエストの状態や方法、内容によらず 文字列を単純に返す 2018/09/20 Reactive System Meetup in 大阪 24

Slide 25

Slide 25 text

ルーティングとディレクティブ 例1: complete ディレクティブ プレースホルダ _ を利用して短縮も可能 2018/09/20 Reactive System Meetup in 大阪 25

Slide 26

Slide 26 text

ルーティングとディレクティブ 例2-a: get ディレクティブ GET リクエストの場合にだけ 中のディレクティブが有効となる 2018/09/20 Reactive System Meetup in 大阪 26 GETした場合 GET以外 (POST) した場合

Slide 27

Slide 27 text

ルーティングとディレクティブ 例2-b: post ディレクティブ MethodDirectives として GET や POST、DELETE などが用意されている 2018/09/20 Reactive System Meetup in 大阪 27 POSTした場合 POST以外 (GET) した場合

Slide 28

Slide 28 text

ルーティングとディレクティブ 例3-1: path 系ディレクティブ (path) /foo/ へのリクエストも当てはまらない 2018/09/20 Reactive System Meetup in 大阪 28 /foo にリクエストした場合 /foo 以外にリクエストした場合 当てはめたい場合は……?

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

ルーティングとディレクティブ 例4: ディレクティブの連結 /foo と /bar の両方を受け付けるようにしたい 2018/09/20 Reactive System Meetup in 大阪 31

Slide 32

Slide 32 text

ルーティングとディレクティブ 例4: ディレクティブの連結 「~ 」を使うとディレクティブの連結が可能 2018/09/20 Reactive System Meetup in 大阪 32 ~

Slide 33

Slide 33 text

ルーティングとディレクティブ • ディレクティブの組み合わせと連結によって 複雑なルーティングを柔軟に表現することが可能 • 他にもキャッシュや認証のディレクティブなど 便利なディレクティブが標準で多く用意されている 2018/09/20 Reactive System Meetup in 大阪 33 https://doc.akka.io/docs/akka-http/current/routing-dsl/ directives/alphabetically.html

Slide 34

Slide 34 text

Akka HTTP と Akka Streams の関係 そもそものはなし…… 2018/09/20 Reactive System Meetup in 大阪 34

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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っぽさ

Slide 39

Slide 39 text

Akka HTTP と Akka Streams の関係 Source Output のみ 2018/09/20 Reactive System Meetup in 大阪 39 Source Akka Streams の部品 Flow Input と Output の両方 Flow Sink Input のみ Sink

Slide 40

Slide 40 text

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 は 使わなくても良い 組み合わせ方は自由。 それぞれ 再利用も可能。

Slide 41

Slide 41 text

Akka HTTP と Akka Streams の関係 は Scala のソースにすると 2018/09/20 Reactive System Meetup in 大阪 41 Source Sink ソケットへのバインディングが Source

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

Akka HTTP と Akka Streams の関係 2018/09/20 Reactive System Meetup in 大阪 44 ルーティング (処理) 部分の抜粋 (抽象度低) 1 接続あたりで考えると ・リクエストがSource ・処理が Flow ・レスポンスが Sink Flow[リクエスト→レスポンス]

Slide 45

Slide 45 text

Akka HTTP と Akka Streams の関係  Akka Streams を意識しなくても便利に使える  Akka HTTP にも Akka Streams が隠れている 2018/09/20 Reactive System Meetup in 大阪 45

Slide 46

Slide 46 text

Akka HTTP と Akka Streams の連携 応用 2018/09/20 Reactive System Meetup in 大阪 46

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

まとめ さいごに 2018/09/20 Reactive System Meetup in 大阪 52

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

紹介 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