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
CSC305 Lecture 01
javiergs
PRO
1
140
Go製CLIツールGatling Commanderによる負荷試験実施の自動化
okmtz
3
630
XP2024 っていう国際会議に行ってきたよの記 / XP2024 Conference Report
bonotake
4
120
What is TDD?
urakawa_jinsei
1
190
利用者視点で考える、イテレータとの上手な付き合い方
syumai
4
210
Cohesion in Modeling and Design
mploed
3
180
5年分のツケを一気に払った話
soogie
3
960
C#および.NETに対する誤解をひも解く
ymd65536
0
180
Micro Frontends for Java Microservices - dev2next 2024
mraible
PRO
0
170
ビット演算の話 / Let's play with bit operations
kaityo256
PRO
3
140
Removing Corepack
yosuke_furukawa
PRO
9
1.1k
sqlcを利用してsqlに型付けを
kamiyam
0
220
Featured
See All Featured
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9k
What's in a price? How to price your products and services
michaelherold
243
11k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
Designing with Data
zakiwarfel
98
5.1k
10 Git Anti Patterns You Should be Aware of
lemiorhan
653
59k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
124
18k
Being A Developer After 40
akosma
84
590k
Bash Introduction
62gerente
608
210k
Creatively Recalculating Your Daily Design Routine
revolveconf
216
12k
Building Flexible Design Systems
yeseniaperezcruz
326
38k
Principles of Awesome APIs and How to Build Them.
keavy
125
17k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
28
1.7k
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