Slide 1

Slide 1 text

Outputと BufferedOutputの間 の何か 風薬(@kazegusuri) Fluentd Casual Talks #3

Slide 2

Slide 2 text

自己紹介 • 風薬(@kazegusuri) • 最近Fluentd使い始めた – たまにPR投げたりしてます – GitHub: sabottenda • LLVM/Clangとか – 夏と冬にあるお祭りに参加してます – http://motipizza.com

Slide 3

Slide 3 text

登場人物 • Outputプラグインさん • BufferedOutputプラグインさん • 何か

Slide 4

Slide 4 text

BufferedOutputさん便利 • BufferedOutputさん – リクエストをバッファリングしてくれる • 仕事が多い日も大丈夫 – 失敗しても再送してくれる • しっかりもの

Slide 5

Slide 5 text

Outputさん便利 • Outputさん – 仕事はため込まないよ • ぼくの仕事はここまで • だけど仕事は速い – 失敗してもしらないフリ • お茶目さん

Slide 6

Slide 6 text

Output vs BufferedOutput • Outputさん – 普段の仕事はまかせよう – 失敗するものはまかせたらだめだぞ • BufferedOutputさん – 時間のかかる仕事はまかせよう • 仕事がたまってもちゃんと片付けてくれる – 失敗しそうなものはまかせよう • 失敗時のケアも難なくこなすできる人

Slide 7

Slide 7 text

そんな彼らに 罠が!!

Slide 8

Slide 8 text

BufferedOutputさん不器用 • 失敗時の再送は最初から行う – リクエストはまとめて1リクエストですべき – そうじゃないと2回リクエストしちゃう • 冪等性あればいいよ # あまり良くない例 def write(chunk) # メッセージ毎にAPIコール chunk.each do |tag, time, record| do_api_call(tag, time, record) end end

Slide 9

Slide 9 text

Outputさんその場しのぎ • Outputさんが仕事を押しつけられるケース – BufferedOutputさんができないので • 再送処理実装面倒だし~ – そもそもBufferedの書き方がわからない • 仕組みがわからないと少し複雑 だけど失敗時にロストします!!

Slide 10

Slide 10 text

間の何か • 二人の間の領域を満たす何かは無いのか… – バッファリングして欲しい – 再送して欲しい – 1リクエスト毎に処理したい

Slide 11

Slide 11 text

間の何か • 二人の間の領域を満たす何かは無いのか… – バッファリングして欲しい – 再送して欲しい – 1リクエスト毎に処理したい • fluent-plugin-bufferizeだ! – なおネーミングは若干ミスった感があります

Slide 12

Slide 12 text

fluent-plugin-bufferize • Outputプラグインに以下の機能を付与する – バッファリング – 1リクエスト毎の再送 – チャンクの途中で再起動しても続きから再開 • 実装はBufferedOutput – オプションが全て使える • buffer_type: メモリ/ファイル選択 • flush_intervalなどなど • 既存のOutputプラグインをそのまま使える

Slide 13

Slide 13 text

設定方法 • BufferedOutputのオプションを書く • configディレクティブに以前の設定を書く type bufferize buffer_type file buffer_path /var/log/fluent/myapp.*.buffer # outputプラグインの設定をconfigの中に書くだけ type http endpoint_url http://foo.bar.com/ http_method put

Slide 14

Slide 14 text

再送の実装は? • BufferedOutputをそのまま利用 – BufferedOutputでは例外が発生時に再送 – Outputプラグインの例外をそのまま渡す • BufferedOutputは最初から再送しようとする – どこまで処理したかをbufferizeが記憶 – 続きから再送

Slide 15

Slide 15 text

問題点 • Outputプラグインが例外をはかないと再送しない – 既存のプラグインは大抵エラーを無視する… – bufferize用に例外をはくようにする • 再送時のコストが大きい – 次のメッセージまで読みながらスキップしている – msgpackにIO#tellの機能が欲しい(もしくは自分の勘違いかも) • できたてほやほや

Slide 16

Slide 16 text

ご利用は計画的に fin