Slide 1

Slide 1 text

Kafkaを利用したアプリケーションで のオフセットの制御について Tomoyoshi Ogura 2017/05/14 Scala将軍達の後の祭り2017

Slide 2

Slide 2 text

自己紹介 Scala将軍達の後の祭り2017 2017/05/14 © ChatWork All rights reserved. ● 小椋友芳 ● ChatWork株式会社コアテクノロジー開発室所属 ● Scala歴4年 ● twitter: @tomoyoshi_ogura ● github: tarugo07

Slide 3

Slide 3 text

アジェンダ Scala将軍達の後の祭り2017 2017/05/14 © ChatWork All rights reserved. ● Kafkaのオフセットの重要性 ● オフセットとコミットの基本 ● アプリの処理に合わせたオフセットの制御方法

Slide 4

Slide 4 text

オフセットとアプリケーション Scala将軍達の後の祭り2017 2017/05/14 © ChatWork All rights reserved. ● オフセットはアプリケーションに大きな影響を与える ○ 同じメッセージを重複して処理 ○ メッセージをロストする危険性 ○ パフォーマンスの劣化

Slide 5

Slide 5 text

オフセットとコミット Scala将軍達の後の祭り2017 2017/05/14 © ChatWork All rights reserved. ● オフセットとはパーティション内でメッセージを一意に識別する番号 ● コンシューマはパーティションのメッセージをどこまで読み取ったかオフセット で追跡する ● オフセットは特別な__consumer_offsetsトピックで管理される ● コミットはパーティションの現在のオフセットを更新すること

Slide 6

Slide 6 text

Consumerの重要なプロパティ Scala将軍達の後の祭り2017 2017/05/14 © ChatWork All rights reserved. ● auto.offset.reset ○ オフセットがない場合の動作 ○ デフォルトはlatest ● enable.auto.commit ○ コンシューマが自動的にオフセットをコミット ● max.poll.records ○ 一回のpoll()で取得するメッセージ件数

Slide 7

Slide 7 text

コミットの方法 Scala将軍達の後の祭り2017 2017/05/14 © ChatWork All rights reserved. ● オフセットのコミット方法は複数ある ○ 自動コミット ○ commitSync() ○ commitAsync()

Slide 8

Slide 8 text

自動コミット Scala将軍達の後の祭り2017 2017/05/14 © ChatWork All rights reserved. ● コンシューマが自動でオフセットをコミットする ● enable.auto.commit = true ● コミット間隔のデフォルトは5秒 ○ auto.commit.interval.msで制御 ● poll()で取得したメッセージの最大のオフセットをコミット

Slide 9

Slide 9 text

commitSync() Scala将軍達の後の祭り2017 2017/05/14 © ChatWork All rights reserved. ● オフセットのコミットを明示的に制御したい場合に使用 ● auto.commit.offset = false ● メッセージの欠落を排除しリバランスでの重複メッセージの件数を減らす ● commitSync()はpoll()で取得した最新のオフセットをコミット ○ 明示的にオフセット値を指定することも可能 ● コミットに失敗すると例外

Slide 10

Slide 10 text

commitAsync() Scala将軍達の後の祭り2017 2017/05/14 © ChatWork All rights reserved. ● commitSync()の非同期版 ● auto.commit.offset = false ● poll()で取得した最新のオフセットをコミット ● ブローカーのレスポンスを待たずにコミットのリクエストを投げて終了 ● コミットのリトライをしない

Slide 11

Slide 11 text

アプリでAt Most Onceの処理をしたい Scala将軍達の後の祭り2017 2017/05/14 © ChatWork All rights reserved. ● At Most Once ○ 最高1回処理するが保証がない ● 自動コミットを利用する ○ enable.auto.commit = true ○ auto.commit.interval.msは短く設定 ● consumer.commitSync()を実行しない ● poll()でオフセットがコミットされる

Slide 12

Slide 12 text

アプリでAt Least Onceの処理をしたい Scala将軍達の後の祭り2017 2017/05/14 © ChatWork All rights reserved. ● At Least Once ○ 最低一回処理するが重複する可能性もある ● commitSync()をアプリの処理が終わった後に実行 ○ auto.commit.offset = false

Slide 13

Slide 13 text

アプリでExactly Onceの処理をしたい Scala将軍達の後の祭り2017 2017/05/14 © ChatWork All rights reserved. ● Exactly Once ○ 正確に一回処理する ● オフセットの管理とアプリケーションの処理を一つのアトミックなトランザク ションで処理する ○ オフセットをRDBなどの外部ストレージに保存すると簡単 ● ConsumerRebalanceListerとseek()を利用 ○ auto.commit.offset = false

Slide 14

Slide 14 text

Exactly Onceの実装イメージ Scala将軍達の後の祭り2017 2017/05/14 © ChatWork All rights reserved.

Slide 15

Slide 15 text

Exactly Onceの実装イメージ Scala将軍達の後の祭り2017 2017/05/14 © ChatWork All rights reserved.

Slide 16

Slide 16 text

まとめ Scala将軍達の後の祭り2017 2017/05/14 © ChatWork All rights reserved. ● Kakfaを使う場合はオフセットの管理に気をつけよう ● アプリケーションの性質に合わせて正しいオフセットの制御を ○ At Most Once ○ At Least Once ○ Exactly Once