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

OutputとBufferedOutputの間の何か

59c0cc69a8ad4ca8d26d752b3b795b55?s=47 kazegusuri
December 13, 2013

 OutputとBufferedOutputの間の何か

Fluentd Casual Talks #3

59c0cc69a8ad4ca8d26d752b3b795b55?s=128

kazegusuri

December 13, 2013
Tweet

Transcript

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

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

    • LLVM/Clangとか – 夏と冬にあるお祭りに参加してます – http://motipizza.com
  3. 登場人物 • Outputプラグインさん • BufferedOutputプラグインさん • 何か

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

    しっかりもの
  5. Outputさん便利 • Outputさん – 仕事はため込まないよ • ぼくの仕事はここまで • だけど仕事は速い –

    失敗してもしらないフリ • お茶目さん
  6. Output vs BufferedOutput • Outputさん – 普段の仕事はまかせよう – 失敗するものはまかせたらだめだぞ •

    BufferedOutputさん – 時間のかかる仕事はまかせよう • 仕事がたまってもちゃんと片付けてくれる – 失敗しそうなものはまかせよう • 失敗時のケアも難なくこなすできる人
  7. そんな彼らに 罠が!!

  8. BufferedOutputさん不器用 • 失敗時の再送は最初から行う – リクエストはまとめて1リクエストですべき – そうじゃないと2回リクエストしちゃう • 冪等性あればいいよ #

    あまり良くない例 def write(chunk) # メッセージ毎にAPIコール chunk.each do |tag, time, record| do_api_call(tag, time, record) end end
  9. Outputさんその場しのぎ • Outputさんが仕事を押しつけられるケース – BufferedOutputさんができないので • 再送処理実装面倒だし~ – そもそもBufferedの書き方がわからない •

    仕組みがわからないと少し複雑 だけど失敗時にロストします!!
  10. 間の何か • 二人の間の領域を満たす何かは無いのか… – バッファリングして欲しい – 再送して欲しい – 1リクエスト毎に処理したい

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

    fluent-plugin-bufferizeだ! – なおネーミングは若干ミスった感があります
  12. fluent-plugin-bufferize • Outputプラグインに以下の機能を付与する – バッファリング – 1リクエスト毎の再送 – チャンクの途中で再起動しても続きから再開 •

    実装はBufferedOutput – オプションが全て使える • buffer_type: メモリ/ファイル選択 • flush_intervalなどなど • 既存のOutputプラグインをそのまま使える
  13. 設定方法 • 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>
  14. 再送の実装は? • BufferedOutputをそのまま利用 – BufferedOutputでは例外が発生時に再送 – Outputプラグインの例外をそのまま渡す • BufferedOutputは最初から再送しようとする –

    どこまで処理したかをbufferizeが記憶 – 続きから再送
  15. 問題点 • Outputプラグインが例外をはかないと再送しない – 既存のプラグインは大抵エラーを無視する… – bufferize用に例外をはくようにする • 再送時のコストが大きい –

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