Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
AkkaHTTPの紹介とAkkaStreams連携(公開用)
Search
nishikawasasaki
September 20, 2018
0
710
AkkaHTTPの紹介とAkkaStreams連携(公開用)
ReactiveSystemMeetupin大阪
https://connpass.com/event/98181/
nishikawasasaki
September 20, 2018
Tweet
Share
More Decks by nishikawasasaki
See All by nishikawasasaki
ScalaのAkkaに見るおすすめポイント
nishikawasasaki
0
7.9k
ストリーム処理ことはじめ (公開用)
nishikawasasaki
6
6.4k
Featured
See All Featured
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
232
17k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
8
860
Speed Design
sergeychernyshev
24
610
Music & Morning Musume
bryan
46
6.2k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.1k
Art, The Web, and Tiny UX
lynnandtonic
297
20k
How To Stay Up To Date on Web Technology
chriscoyier
788
250k
Building a Scalable Design System with Sketch
lauravandoore
459
33k
Designing for humans not robots
tammielis
250
25k
What's in a price? How to price your products and services
michaelherold
243
12k
The Power of CSS Pseudo Elements
geoffreycrofte
73
5.3k
Transcript
Akka HTTP の紹介と Akka Streams 連携 Reactive System Meetup in
大阪 2018/09/20 Reactive System Meetup in 大阪 1 @にしかわささき
自己紹介 にしかわささき @nishikawasasaki • 広島@M4 → 神戸のシステム屋さん • Java Scala
JavaScript … • インフラ AWS KVS … • 検索 データ分析 GIS … • Vim → Emacs → vscode • マネージャー, , 2018/09/20 Reactive System Meetup in 大阪 2
目次 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
Akka HTTP とは 基本の紹介 2018/09/20 Reactive System Meetup in 大阪
4
Akka HTTP とは 2018/09/20 Reactive System Meetup in 大阪 5
Akka Streams ベース 旧 spray.io → Akka HTTP (多少の差異あり) HTTP を扱うモジュール群 (≠フレームワーク)
Akka HTTP とは 2018/09/20 Reactive System Meetup in 大阪 6
×フレームワーク → ◦「ライブラリスイート」 ユースケースにあわせて必要な部分だけを 組み合わせて使える 同じ機能でも抽象化の違う API を用意している
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 変換ユーティリティ
Akka HTTP とは 2018/09/20 Reactive System Meetup in 大阪 8
akka-http 抽象度 高 HTTP を便利に扱うための DSL 等を含む akka-http-core 抽象度 低 HTTP を扱うコア機能に限定し軽量・簡潔 HTTP クライアント機能
Akka HTTP (akka-http) の簡単な例 具体例 2018/09/20 Reactive System Meetup in
大阪 9
Akka HTTP の簡単な例 • 依存するライブラリと import 2018/09/20 Reactive System Meetup
in 大阪 10 https://doc.akka.io/docs/akka-http/current/introduction.html#using-akka-http
Akka HTTP の簡単な例 2018/09/20 Reactive System Meetup in 大阪 11
https://doc.akka.io/docs/akka-http/current/introduction.html#using-akka-http 全体像 レスポンス
Akka HTTP の簡単な例 2018/09/20 Reactive System Meetup in 大阪 12
https://doc.akka.io/docs/akka-http/current/introduction.html#using-akka-http 全体像 用意 HTTP 待受 停止 ルーティング
Akka HTTP の簡単な例 2018/09/20 Reactive System Meetup in 大阪 13
https://doc.akka.io/docs/akka-http/current/introduction.html#using-akka-http 用意
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
Akka HTTP の簡単な例 2018/09/20 Reactive System Meetup in 大阪 15
https://doc.akka.io/docs/akka-http/current/introduction.html#using-akka-http ルーティング
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 を指定
Akka HTTP の簡単な例 2018/09/20 Reactive System Meetup in 大阪 17
https://doc.akka.io/docs/akka-http/current/introduction.html#using-akka-http HTTP 待受
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 で待受開始 レスポンス
Akka HTTP の簡単な例 2018/09/20 Reactive System Meetup in 大阪 19
https://doc.akka.io/docs/akka-http/current/introduction.html#using-akka-http 停止
Akka HTTP の簡単な例 2018/09/20 Reactive System Meetup in 大阪 20
https://doc.akka.io/docs/akka-http/current/introduction.html#using-akka-http • 何か入力されるまで停止 • 待受を停止して終了する
Akka HTTP の簡単な例 2018/09/20 Reactive System Meetup in 大阪 21
https://doc.akka.io/docs/akka-http/current/introduction.html#using-akka-http 全体像 (再掲) ルーティング
akka-http の ルーティングとディレクティブ 慣れると便利? 2018/09/20 Reactive System Meetup in 大阪
22
ルーティングとディレクティブ • ディレクティブ (Directive) • 用意されたディレクティブや 自作のディレクティブを ネスト・組み合わせ = ルーティングツリーの作成
2018/09/20 Reactive System Meetup in 大阪 23
ルーティングとディレクティブ 例1: complete ディレクティブ リクエストの状態や方法、内容によらず 文字列を単純に返す 2018/09/20 Reactive System Meetup
in 大阪 24
ルーティングとディレクティブ 例1: complete ディレクティブ プレースホルダ _ を利用して短縮も可能 2018/09/20 Reactive System
Meetup in 大阪 25
ルーティングとディレクティブ 例2-a: get ディレクティブ GET リクエストの場合にだけ 中のディレクティブが有効となる 2018/09/20 Reactive System
Meetup in 大阪 26 GETした場合 GET以外 (POST) した場合
ルーティングとディレクティブ 例2-b: post ディレクティブ MethodDirectives として GET や POST、DELETE などが用意されている
2018/09/20 Reactive System Meetup in 大阪 27 POSTした場合 POST以外 (GET) した場合
ルーティングとディレクティブ 例3-1: path 系ディレクティブ (path) /foo/ へのリクエストも当てはまらない 2018/09/20 Reactive System
Meetup in 大阪 28 /foo にリクエストした場合 /foo 以外にリクエストした場合 当てはめたい場合は……?
ルーティングとディレクティブ 例3-2: pathPrefix ディレクティブ /foooooo や /foooooo/// へのリクエストも 当てはまってしまう 2018/09/20
Reactive System Meetup in 大阪 29 /foo/ にリクエストした場合 /foo 以外にリクエストした場合
ルーティングとディレクティブ 例3-3: pathEndOrSingleSlash ディレクティブ 2018/09/20 Reactive System Meetup in 大阪
30 /foo にリクエストした場合 /foo/ にリクエストした場合 それ以外にリクエストした場合
ルーティングとディレクティブ 例4: ディレクティブの連結 /foo と /bar の両方を受け付けるようにしたい 2018/09/20 Reactive System
Meetup in 大阪 31
ルーティングとディレクティブ 例4: ディレクティブの連結 「~ 」を使うとディレクティブの連結が可能 2018/09/20 Reactive System Meetup in
大阪 32 ~
ルーティングとディレクティブ • ディレクティブの組み合わせと連結によって 複雑なルーティングを柔軟に表現することが可能 • 他にもキャッシュや認証のディレクティブなど 便利なディレクティブが標準で多く用意されている 2018/09/20 Reactive System
Meetup in 大阪 33 https://doc.akka.io/docs/akka-http/current/routing-dsl/ directives/alphabetically.html
Akka HTTP と Akka Streams の関係 そもそものはなし…… 2018/09/20 Reactive System
Meetup in 大阪 34
Akka HTTP と Akka Streams の関係 2018/09/20 Reactive System Meetup
in 大阪 35 「Akka Streams ベース」 Akka HTTP もストリームを扱っている → akka-http では うまく akka-stream が隠されている
Akka HTTP と Akka Streams の関係 2018/09/20 Reactive System Meetup
in 大阪 36 HTTP 待受部分の抜粋 (抽象度高)
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
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っぽさ
Akka HTTP と Akka Streams の関係 Source Output のみ 2018/09/20
Reactive System Meetup in 大阪 39 Source Akka Streams の部品 Flow Input と Output の両方 Flow Sink Input のみ Sink
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 は 使わなくても良い 組み合わせ方は自由。 それぞれ 再利用も可能。
Akka HTTP と Akka Streams の関係 は Scala のソースにすると 2018/09/20
Reactive System Meetup in 大阪 41 Source Sink ソケットへのバインディングが Source
Akka HTTP と Akka Streams の関係 2018/09/20 Reactive System Meetup
in 大阪 42 ルーティング (処理) 部分の抜粋 (抽象度低)
Akka HTTP と Akka Streams の関係 2018/09/20 Reactive System Meetup
in 大阪 43 ルーティング (処理) 部分の抜粋 (抽象度低) Akka Streamsっぽさ
Akka HTTP と Akka Streams の関係 2018/09/20 Reactive System Meetup
in 大阪 44 ルーティング (処理) 部分の抜粋 (抽象度低) 1 接続あたりで考えると ・リクエストがSource ・処理が Flow ・レスポンスが Sink Flow[リクエスト→レスポンス]
Akka HTTP と Akka Streams の関係 Akka Streams を意識しなくても便利に使える
Akka HTTP にも Akka Streams が隠れている 2018/09/20 Reactive System Meetup in 大阪 45
Akka HTTP と Akka Streams の連携 応用 2018/09/20 Reactive System
Meetup in 大阪 46
Akka HTTP と Akka Streams の連携 2018/09/20 Reactive System Meetup
in 大阪 47 クライアントからファイルが ストリーミングでアップロードされる場合 →サーバーサイドの処理の状況に応じて 背圧制御をおこないたい (対応している場合)
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
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
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
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
まとめ さいごに 2018/09/20 Reactive System Meetup in 大阪 52
まとめ 2018/09/20 Reactive System Meetup in 大阪 53 Akka HTTP
では必要最小限な処理だけを 利用することができる Akka HTTP のディレクティブは 組み合わせしだいで複雑なルーティングを表現できる Akka Streams は意識しなくても便利に使えるが ある程度の理解があった方が捗る
紹介 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