Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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