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
720
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
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
127
18k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
28
2.1k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
7k
Statistics for Hackers
jakevdp
796
220k
How To Stay Up To Date on Web Technology
chriscoyier
789
250k
Building Better People: How to give real-time feedback that sticks.
wjessup
365
19k
Gamification - CAS2011
davidbonilla
80
5.1k
Docker and Python
trallard
42
3.1k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
Imperfection Machines: The Place of Print at Facebook
scottboms
266
13k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
132
33k
No one is an island. Learnings from fostering a developers community.
thoeni
19
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