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
Identifying User Idenity
moro
6
9.3k
WebフロントエンドにおけるGraphQL(あるいはバックエンドのAPI)との向き合い方 / #241106_plk_frontend
izumin5210
4
1.2k
役立つログに取り組もう
irof
28
9.3k
AWS IaCの注目アップデート 2024年10月版
konokenj
3
3.2k
Pinia Colada が実現するスマートな非同期処理
naokihaba
4
200
Duckdb-Wasmでローカルダッシュボードを作ってみた
nkforwork
0
100
C#/.NETのこれまでのふりかえり
tomokusaba
1
180
イベント駆動で成長して委員会
happymana
1
260
[PyCon Korea 2024 Keynote] 커뮤니티와 파이썬, 그리고 우리
beomi
0
120
Sidekiqで実現する 長時間非同期処理の中断と再開 / Pausing and Resuming Long-Running Asynchronous Jobs with Sidekiq
hypermkt
6
3k
Nurturing OpenJDK distribution: Eclipse Temurin Success History and plan
ivargrimstad
0
330
OpenTelemetryでRailsのパフォーマンス分析を始めてみよう(KoR2024)
ymtdzzz
5
1.9k
Featured
See All Featured
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
42
9.2k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
246
1.3M
GitHub's CSS Performance
jonrohan
1030
460k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.1k
Thoughts on Productivity
jonyablonski
67
4.3k
How to Think Like a Performance Engineer
csswizardry
20
1.1k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
25
1.8k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
38
1.8k
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
Testing 201, or: Great Expectations
jmmastey
38
7.1k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.3k
Build The Right Thing And Hit Your Dates
maggiecrowley
33
2.4k
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