fluentdのv0.12.19から,buffer_queue_full_actionというパラメータを追加したので,その説明をします.
目的
fluentdのバッファはキューが全部埋まってデータをもう入れられない場合,Inputプラグイン側にBufferQueueLimitErrorを返します.これによって,in_forwardであれば送信側にエラーを返せるなど,リトライ/フォールバックがやりやすくなってます.
その一方in_tailのような場合には,どうせキューが空かないと次のデータを読み込んでもまたエラーになるので,ブロックして待って欲しいこともあります.
ということで,この二つを選べるようにしました.
v0.14でプラグインやバッファ周りのAPI改善を考えており,そこでback-pressure相当の機能を考えています.もし入るのであれば上の機能はいらなくなる予定ですが,そもそも入るのか,入るとしてもどの段階で入るか,はまだ未定なので,暫定的にbuffer_queue_full_actionをサポートしたという流れです.
使い方
バッファ用の設定なので,BufferedOutput系のプラグインで指定することになります.
buffer_queue_full_action exception # default
buffer_queue_full_action block # バッファのキューが空くまでInputがブロック
たとえばin_tailからout_elasticsearchに投げる場合などは,大抵Elasticsearch側が詰まってひたすらInput側にエラーが返ることになります.こういう場合にはblockが有効です.
一方,in_forwardからの入力を受け付けるOutputでこれを使うと,in_forwardから送信元のout_forwardにレスポンスが返らなくなるので,blockを使うべきではありません.
blockはある意味最終手段とかミニバッチ用として,本当に使って良いか検討してから使ってください.
今後
重要ではないOutput向けにデータを捨てるdrop_lastもサポートしようかと思いましたが,あまり需要が無さそうだったので,今回は見送りました.何か問題がありましたら,issueにでも報告してもらえると助かります.