Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Apache Kafkaとストリーム処理/Reactive Streams

Apache Kafkaとストリーム処理/Reactive Streams

2018-05-26に行われた「JJUG CCC 2018 Spring」で発表した時の資料です。

Tomoyoshi Ogura

May 26, 2018
Tweet

More Decks by Tomoyoshi Ogura

Other Decks in Programming

Transcript

  1. © ChatWork • 小椋友芳 • ChatWork株式会社コアテクノロジー開発室所属 ◦ ソフトウェアエンジニア ◦ サーバーサイド開発

    • Java、Scala、Akka、Golang、DDD、Kafka ◦ JavaはJDK 1.2から使ってます ◦ Kafkaは2016年からプロダクトで利用 • twitter: @tomoyoshi_ogura • github: tarugo07 自己紹介 JJUG CCC 2018 Spring
  2. © ChatWork • 業務の効率化と会社の成長を目的とした ビジネスコミュニケーションツールを開発、運営 • 導入企業社数: 17万4000社以上(2018年4月末日時点) • ビジョン:世界の働き方を変える

    • Scala、PHP、Swift、Kotlin等で開発 • エンジニア募集中です ◦ Scalaで開発したいJavaエンジニアの方 ◦ https://corp.chatwork.com/ja/recruit/ 会社紹介 JJUG CCC 2018 Spring
  3. © ChatWork • Apache Kafkaとストリーム処理 • Akka Streamsの基本とプログラムの書き方 • Apache

    Kafkaの基本 • Alpakka Kafka Connectorの使い方 • まとめ アジェンダ JJUG CCC 2018 Spring
  4. © ChatWork Apache Kafkaとは • 2011年にLinkedInが公開した分散メッセージングシステム • 大量のデータを高速に収集してリアルタイムに処理する • Pull型(Publish-Subscribeモデル)を採用しているのでスループットの調整ができる

    • ダウンタイムなしにスケールすることができる • クラスタ化により耐障害性や高可用性を実現している • ディスクに永続化することで長時間データを保持できる • メッセージの到達保証があるのでデータを失い難い JJUG CCC 2018 Spring
  5. © ChatWork • 大量のデータをリアルタイムに処理するにはストリーム処理が重要 • ストリーム処理の特徴 ◦ 無限に発生するデータを処理する ◦ 処理が永続的に継続する

    ◦ リアルタイム(低レイテンシ)に処理を行う • ストリーム処理の課題 ◦ 受信側の処理能力の限界を超えたデータを送信してしまうことがある ストリーム処理 JJUG CCC 2018 Spring
  6. © 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
  7. © 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
  8. © ChatWork • Reactive Streamsの実装の1つ ◦ バックプレッシャーによる制御フロー ◦ ノンブロッキング ◦

    非同期ストリーム処理 • アクターベースで処理を実行 • 豊富な定義済み処理ステージ • 型安全 Akka Streamsとは JJUG CCC 2018 Spring
  9. © ChatWork • デフォルトではストリーム処理中に例外が発生すると停止する • スーパーバイザー戦略を指定することで動作を変更することができる • 指定できる戦略 ◦ Stop:失敗としてストリーム処理を停止する(デフォルト)

    ◦ Resume:問題の要素を捨ててストリーム処理を続行する ◦ Restart:問題の要素を捨てて処理ステージを再起動する(処理ステージの状態は破棄) • スーパーバイザー戦略を指定する方法 ◦ マテリアライザーに指定 ◦ 処理ステージに指定 ◦ スーパーバイザー戦略の判定順位は処理ステージが優先される エラー処理 JJUG CCC 2018 Spring
  10. © ChatWork • Akka Streamsの処理ステージをテストする方法は色々ある ◦ akka-testkitモジュールのTestProbeを利用 ◦ akka-stream-testkitモジュールのテスト用のSourceやSinkを利用 •

    どの方法でもSource、Sink、Flowといった処理ステージを別々に保持しておくことが重要 Akka Streamsのテスト JJUG CCC 2018 Spring
  11. © ChatWork • Producerの作成時にはProducerSettingsに設定情報を登録する ◦ 接続先するKafka Broker ◦ キーと値のSerializer ◦

    チューニングパラメータ • 設定情報はapplication.confから設定することも可能 Producer JJUG CCC 2018 Spring
  12. © ChatWork • Consumerの作成時にはConsumerSettingsに設定情報を登録する ◦ 接続するKafka Broker ◦ Consumer Group

    ID ◦ キーと値のDeserializer ◦ チューニングパラメータ • 設定情報はapplication.confから設定することも可能 Consumer JJUG CCC 2018 Spring
  13. © ChatWork メッセージ保証とConsumerでの処理方法 • At Most Once ◦ 重複はないがロストする可能性がある ◦

    メッセージを受け取りoffsetをcommitしてから処理を実行 • At Least Once ◦ 必ず一回処理されるが重複する可能性がある ◦ メッセージを受け取って処理を実行してからoffsetをcommit • Exactly Once ◦ 正確に一回処理され重複もロストもない ◦ メッセージの処理とoffsetのcommitを同時に行う ◦ offsetを外部ストレージに保存しないと難しい Consumerのメッセージ保証について JJUG CCC 2018 Spring