$30 off During Our Annual Pro Sale. View Details »

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. Outputと
    BufferedOutputの間
    の何か
    風薬(@kazegusuri)
    Fluentd Casual Talks #3

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  7. そんな彼らに
    罠が!!

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  13. 設定方法
    • 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


    View Slide

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

    View Slide

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

    View Slide

  16. ご利用は計画的に
    fin

    View Slide