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
Apache Kafkaとストリーム処理/Reactive Streams
Search
Tomoyoshi Ogura
May 26, 2018
Programming
4
3.1k
Apache Kafkaとストリーム処理/Reactive Streams
2018-05-26に行われた「JJUG CCC 2018 Spring」で発表した時の資料です。
Tomoyoshi Ogura
May 26, 2018
Tweet
Share
More Decks by Tomoyoshi Ogura
See All by Tomoyoshi Ogura
Kafkaを利用したアプリケーションでのオフセットの制御について/Kafka Offsets
tarugo07
1
1.1k
DDDで利用するアーキテクチャと プレゼンテーション層について/DDD Architecture
tarugo07
0
3.7k
Other Decks in Programming
See All in Programming
テストケースの名前はどうつけるべきか?
orgachem
PRO
0
130
数十万行のプロジェクトを Scala 2から3に完全移行した
xuwei_k
0
270
Semantic Kernelのネイティブプラグインで知識拡張をしてみる
tomokusaba
0
180
プロダクトの品質に コミットする / Commit to Product Quality
pekepek
2
770
rails stats で紐解く ANDPAD のイマを支える技術たち
andpad
1
290
たのしいparse.y
ydah
3
120
Jakarta EE meets AI
ivargrimstad
0
230
今からはじめるAndroidアプリ開発 2024 / DevFest 2024
star_zero
0
1k
Monixと常駐プログラムの勘どころ / Scalaわいわい勉強会 #4
stoneream
0
270
17年周年のWebアプリケーションにTanStack Queryを導入する / Implementing TanStack Query in a 17th Anniversary Web Application
saitolume
0
250
fs2-io を試してたらバグを見つけて直した話
chencmd
0
220
暇に任せてProxmoxコンソール 作ってみました
karugamo
1
720
Featured
See All Featured
Art, The Web, and Tiny UX
lynnandtonic
298
20k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
28
2.1k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
159
15k
YesSQL, Process and Tooling at Scale
rocio
169
14k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
29
2k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
7k
It's Worth the Effort
3n
183
28k
Building Adaptive Systems
keathley
38
2.3k
Designing on Purpose - Digital PM Summit 2013
jponch
116
7k
Fashionably flexible responsive web design (full day workshop)
malarkey
405
66k
A better future with KSS
kneath
238
17k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
132
33k
Transcript
Apache Kafkaとストリーム処理 Tomoyoshi Ogura 2018/05/26 JJUG CCC 2018 Spring
© ChatWork • 小椋友芳 • ChatWork株式会社コアテクノロジー開発室所属 ◦ ソフトウェアエンジニア ◦ サーバーサイド開発
• Java、Scala、Akka、Golang、DDD、Kafka ◦ JavaはJDK 1.2から使ってます ◦ Kafkaは2016年からプロダクトで利用 • twitter: @tomoyoshi_ogura • github: tarugo07 自己紹介 JJUG CCC 2018 Spring
© ChatWork • 業務の効率化と会社の成長を目的とした ビジネスコミュニケーションツールを開発、運営 • 導入企業社数: 17万4000社以上(2018年4月末日時点) • ビジョン:世界の働き方を変える
• Scala、PHP、Swift、Kotlin等で開発 • エンジニア募集中です ◦ Scalaで開発したいJavaエンジニアの方 ◦ https://corp.chatwork.com/ja/recruit/ 会社紹介 JJUG CCC 2018 Spring
© ChatWork • Apache Kafkaとストリーム処理 • Akka Streamsの基本とプログラムの書き方 • Apache
Kafkaの基本 • Alpakka Kafka Connectorの使い方 • まとめ アジェンダ JJUG CCC 2018 Spring
© ChatWork Apache Kafkaとストリーム処理 JJUG CCC 2018 Spring
© ChatWork Apache Kafkaとは • 2011年にLinkedInが公開した分散メッセージングシステム • 大量のデータを高速に収集してリアルタイムに処理する • Pull型(Publish-Subscribeモデル)を採用しているのでスループットの調整ができる
• ダウンタイムなしにスケールすることができる • クラスタ化により耐障害性や高可用性を実現している • ディスクに永続化することで長時間データを保持できる • メッセージの到達保証があるのでデータを失い難い JJUG CCC 2018 Spring
© ChatWork システム間でデータを連携するためのハブやデータの集約先として利用 Apache Kafkaのユースケース JJUG CCC 2018 Spring
© ChatWork • 大量のデータをリアルタイムに処理するにはストリーム処理が重要 • ストリーム処理の特徴 ◦ 無限に発生するデータを処理する ◦ 処理が永続的に継続する
◦ リアルタイム(低レイテンシ)に処理を行う • ストリーム処理の課題 ◦ 受信側の処理能力の限界を超えたデータを送信してしまうことがある ストリーム処理 JJUG CCC 2018 Spring
© ChatWork • ノンブロッキングなバックプレッシャーを持つ非同期ストリーム処理の標準仕様 ◦ Reactive Streams • Java 9で標準化されてインターフェースが追加
◦ JEP 266: More Concurrency Updates ◦ java.util.concurrent.Flow • 主な実装 ◦ Akka Streams ◦ Ratpack ◦ Reactor ◦ RxJava Reactive Streams JJUG CCC 2018 Spring
© ChatWork • Alpakka Kafka Connector ◦ Apache KafkaをAkka Streamsに接続するためのコネクタ
◦ Akka Streamsのコネクタを提供するプロジェクトであるAlpakkaで提供 ◦ Akka Streamsからの利用が前提になっているので実装が簡単にできる このセッションではJavaでのAkka Streamsを使ったプログラムの方法とAlpakka Kafka Connector をAkka Streamsで利用する方法を説明します。 KafkaでReactive Streams JJUG CCC 2018 Spring
© ChatWork Akka Streamsの基本 JJUG CCC 2018 Spring
© ChatWork • Reactive Streamsの実装の1つ ◦ バックプレッシャーによる制御フロー ◦ ノンブロッキング ◦
非同期ストリーム処理 • アクターベースで処理を実行 • 豊富な定義済み処理ステージ • 型安全 Akka Streamsとは JJUG CCC 2018 Spring
© ChatWork プロジェクトにakka-streamモジュールの依存関係を追加する • Maven • Gradle • SBT Akka
Streamsを使うには JJUG CCC 2018 Spring
© ChatWork Akka Streamsの用語としてグラフと処理ステージがある • グラフとはストリームデータが流れる一連の処理経路の定義 • 処理ステージとはグラフを構築する処理ブロック ◦ Source、Sink、Flowの3種類に分類される
Akka Streamsの用語 JJUG CCC 2018 Spring
© ChatWork Source • 1つの出力を持つ処理ステージ • 下流の処理ステージがデータを受け取る準備ができている時に出力する • 定義済みの処理ステージにはfrom、single、repeat、rangeなどがある Source
JJUG CCC 2018 Spring
© ChatWork Sink • 1つの入力を持つ処理ステージ • 上流の処理ステージにデータの受け入れを要求する • 受け入れ速度によっては上流の処理ステージを遅らせる可能性がある •
定義済みの処理ステージにはforeach、fold、seq、ignoreなどがある Sink JJUG CCC 2018 Spring
© ChatWork Flow • 1つの入力と出力を持つ処理ステージ • 上流と下流を接続し、データの変換を行う • 定義済みの処理ステージにはmap、filter、drop、takeなどがある Flow
JJUG CCC 2018 Spring
© ChatWork RunnableGraph • 両端をそれぞれSourceとSinkに接続されている • 実行準備ができているグラフ RunnableGraph JJUG CCC
2018 Spring
© ChatWork 処理ステージを合成すると新たな処理ステージになる • SourceとFlowを繋げるとSourceになる • FlowとSinkを繋げるとSinkになる • FlowとFlowを繋げるとFlowになる 処理ステージの合成
JJUG CCC 2018 Spring
© ChatWork Akka Streamsを実行するには次の2つのステップが必要 1. 処理ステージを定義する ◦ Sink、Source、Flowを定義する ◦ Sink、Source、Flowを繋げてRunnableGraphを作成
2. 作成したグラフを実行 Akka Streamsを実行するには JJUG CCC 2018 Spring
© ChatWork 1から100までの数値で10の倍数の数値を標準出力に表示する 実際にAkka Streamsの実行してみる JJUG CCC 2018 Spring
© ChatWork Materialized values JJUG CCC 2018 Spring
© ChatWork 処理ステージが提供する補助値で実行(materialize)された時に得られる値 処理結果を取得したり、外部からストリームの制御を行う事ができる Materialized values JJUG CCC 2018 Spring
© ChatWork 処理ステージの合成時に提供するMaterialized valuesを指定する事が可能 合成時のMaterialized valuesの指定 JJUG CCC 2018 Spring
© ChatWork ファイルのバイト数と行数を確認する Materialized valuesを実行してみる JJUG CCC 2018 Spring
© ChatWork エラー処理 JJUG CCC 2018 Spring
© ChatWork • デフォルトではストリーム処理中に例外が発生すると停止する • スーパーバイザー戦略を指定することで動作を変更することができる • 指定できる戦略 ◦ Stop:失敗としてストリーム処理を停止する(デフォルト)
◦ Resume:問題の要素を捨ててストリーム処理を続行する ◦ Restart:問題の要素を捨てて処理ステージを再起動する(処理ステージの状態は破棄) • スーパーバイザー戦略を指定する方法 ◦ マテリアライザーに指定 ◦ 処理ステージに指定 ◦ スーパーバイザー戦略の判定順位は処理ステージが優先される エラー処理 JJUG CCC 2018 Spring
© ChatWork スーパーバイザー戦略をマテリアライザーに指定 スーパーバイザー戦略の指定 JJUG CCC 2018 Spring
© ChatWork スーパーバイザー戦略を処理ステージに指定 スーパーバイザー戦略の指定 JJUG CCC 2018 Spring
© ChatWork ストリームのテスト JJUG CCC 2018 Spring
© ChatWork • Akka Streamsの処理ステージをテストする方法は色々ある ◦ akka-testkitモジュールのTestProbeを利用 ◦ akka-stream-testkitモジュールのテスト用のSourceやSinkを利用 •
どの方法でもSource、Sink、Flowといった処理ステージを別々に保持しておくことが重要 Akka Streamsのテスト JJUG CCC 2018 Spring
© ChatWork プロジェクトにakka-testkitモジュールの依存関係を追加する • Maven • Gradle • SBT akka-testkitを使うには
JJUG CCC 2018 Spring
© ChatWork プロジェクトにakka-stream-testkitモジュールの依存関係を追加する • Maven • Gradle • SBT akka-stream-testkitを使うには
JJUG CCC 2018 Spring
© ChatWork テストモジュールを使わないテスト方法 テストモジュールを使わないテスト JJUG CCC 2018 Spring
© ChatWork Akka StreamsがActorに変換されて実行されるのでTestPorbeを使ってテスト可能 TestProbeを使ったテスト JJUG CCC 2018 Spring
© ChatWork TestSourceはSourceの機能の実現できる TestSourceを使ったテスト JJUG CCC 2018 Spring
© ChatWork TestSinkはSinkの機能を実現できる TestSinkを使ったテスト JJUG CCC 2018 Spring
© ChatWork Apache Kafkaの基本 JJUG CCC 2018 Spring
© ChatWork • KafkaはBroker(cluster)、Producer、Consumerで構成される • Producerはメッセージの配信を行う • Consumerはメッセージの購読を行う • BrokerはProducer、Consumer間でメッセージの受け渡しを行うためのキュー
Kafkaの基本構成 JJUG CCC 2018 Spring
© ChatWork • KafkaはTopicにメッセージを保存する • Topicは負荷分散のため1つ以上のPartitionに分割されている TopicとPartition JJUG CCC 2018
Spring
© ChatWork • offsetはPartition内でメッセージを一意に識別する番号 • ConsumerはPartitionのメッセージを何処まで読み取ったかoffsetで追跡する • commitはPartitionの現在のoffsetを更新すること Consumerとoffset JJUG
CCC 2018 Spring
© ChatWork • Consumerはグループ単位でメッセージを購読する • 1つのPartitionは1つのグループの1つのConsumerが購読する • Consumerの並列数はPartitionの数以下になる Consumer Group
JJUG CCC 2018 Spring
© ChatWork Alpakka Kafka Connector JJUG CCC 2018 Spring
© ChatWork • Akka Streamの処理ステージとしてKafkaにアクセスするためのライブラリ ◦ Producer、Concumerの両方を処理ステージに組み込める • Akka Streamsのコネクタを提供するプロジェクトであるAlpakkaのコンポーネントの1つ
◦ 以前はAkka Streams KafkaやReactive Kafkaとよばれていた Alpakka Kafka Connector JJUG CCC 2018 Spring
© ChatWork プロジェクトにakka-stream-kafkaモジュールの依存関係を追加する • Maven • Gradle • SBT Alpakka
Kafka Connectorを使うには JJUG CCC 2018 Spring
© ChatWork • Producerの作成時にはProducerSettingsに設定情報を登録する ◦ 接続先するKafka Broker ◦ キーと値のSerializer ◦
チューニングパラメータ • 設定情報はapplication.confから設定することも可能 Producer JJUG CCC 2018 Spring
© ChatWork SinkにKafkaProducerを組み込む SinkでProducerを使う JJUG CCC 2018 Spring
© ChatWork FlowにKafkaProducerを組み込む FlowでProducerを使う JJUG CCC 2018 Spring
© ChatWork • Consumerの作成時にはConsumerSettingsに設定情報を登録する ◦ 接続するKafka Broker ◦ Consumer Group
ID ◦ キーと値のDeserializer ◦ チューニングパラメータ • 設定情報はapplication.confから設定することも可能 Consumer JJUG CCC 2018 Spring
© ChatWork ConsumerでKafkaからメッセージ読み込む offsetのcommitはenable.auto.commitによる Consumerを使う JJUG CCC 2018 Spring
© ChatWork メッセージ保証とConsumerでの処理方法 • At Most Once ◦ 重複はないがロストする可能性がある ◦
メッセージを受け取りoffsetをcommitしてから処理を実行 • At Least Once ◦ 必ず一回処理されるが重複する可能性がある ◦ メッセージを受け取って処理を実行してからoffsetをcommit • Exactly Once ◦ 正確に一回処理され重複もロストもない ◦ メッセージの処理とoffsetのcommitを同時に行う ◦ offsetを外部ストレージに保存しないと難しい Consumerのメッセージ保証について JJUG CCC 2018 Spring
© ChatWork At Most Onceでの実行 At Most Once JJUG CCC
2018 Spring
© ChatWork At Least Onceでの実行例 1件ずつoffsetをcommitするので遅い At Least Once JJUG
CCC 2018 Spring
© ChatWork At Least Onceでの実行例 offsetのcommitを複数件まとめて行うので速いが重複になる件数も増える At Least Once (Batch
Commit) JJUG CCC 2018 Spring
© ChatWork • 大量のデータをリアルタイムに処理するにはストリーム処理が大事です • Reactive Streamsに準拠した実装ならマシンの性能を最大限に活かせる • Akka Streamsは処理ステージを細かく分けて実装できるので見通しが良くなる
• Alpakka Kafka ConnectorでKafkaの処理をReactive Streamsとして扱うことができます まとめ JJUG CCC 2018 Spring
© ChatWork ご清聴ありがとうございました JJUG CCC 2018 Spring