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

OutputとBufferedOutputの間の何か

kazegusuri
December 13, 2013

 OutputとBufferedOutputの間の何か

Fluentd Casual Talks #3

kazegusuri

December 13, 2013
Tweet

More Decks by kazegusuri

Other Decks in Programming

Transcript

  1. 自己紹介 • 風薬(@kazegusuri) • 最近Fluentd使い始めた – たまにPR投げたりしてます – GitHub: sabottenda

    • LLVM/Clangとか – 夏と冬にあるお祭りに参加してます – http://motipizza.com
  2. Output vs BufferedOutput • Outputさん – 普段の仕事はまかせよう – 失敗するものはまかせたらだめだぞ •

    BufferedOutputさん – 時間のかかる仕事はまかせよう • 仕事がたまってもちゃんと片付けてくれる – 失敗しそうなものはまかせよう • 失敗時のケアも難なくこなすできる人
  3. BufferedOutputさん不器用 • 失敗時の再送は最初から行う – リクエストはまとめて1リクエストですべき – そうじゃないと2回リクエストしちゃう • 冪等性あればいいよ #

    あまり良くない例 def write(chunk) # メッセージ毎にAPIコール chunk.each do |tag, time, record| do_api_call(tag, time, record) end end
  4. fluent-plugin-bufferize • Outputプラグインに以下の機能を付与する – バッファリング – 1リクエスト毎の再送 – チャンクの途中で再起動しても続きから再開 •

    実装はBufferedOutput – オプションが全て使える • buffer_type: メモリ/ファイル選択 • flush_intervalなどなど • 既存のOutputプラグインをそのまま使える
  5. 設定方法 • BufferedOutputのオプションを書く • configディレクティブに以前の設定を書く <match *> type bufferize buffer_type

    file buffer_path /var/log/fluent/myapp.*.buffer # outputプラグインの設定をconfigの中に書くだけ <config> type http endpoint_url http://foo.bar.com/ http_method put </config> </match>
  6. 問題点 • Outputプラグインが例外をはかないと再送しない – 既存のプラグインは大抵エラーを無視する… – bufferize用に例外をはくようにする • 再送時のコストが大きい –

    次のメッセージまで読みながらスキップしている – msgpackにIO#tellの機能が欲しい(もしくは自分の勘違いかも) • できたてほやほや