Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
OutputとBufferedOutputの間の何か
Search
kazegusuri
December 13, 2013
Programming
3.5k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
OutputとBufferedOutputの間の何か
Fluentd Casual Talks #3
kazegusuri
December 13, 2013
More Decks by kazegusuri
See All by kazegusuri
go-sqlite3を使ってCloud Spannerエミュレーターを作ってみた / Cloud Spanner emulator with go-sqlite3
kazegusuri
5
6.8k
handy-spanner GCPUG
kazegusuri
4
2.1k
Open SKT: メルペイ開発の裏側 / builderscon tokyo 2019 Open SKT
kazegusuri
22
28k
Keep watching and extending features of gRPC
kazegusuri
3
2.7k
Testing with microservices in merpay
kazegusuri
10
11k
Real World Mercari API Architecture
kazegusuri
1
6.4k
gRPC and REST with gRPC in practice
kazegusuri
19
8.2k
Fluentdで始めるPrometheus / Prometheus Tokyo Meetup #1
kazegusuri
1
2k
GRPCの実践と現状での利点欠点 / Go Conference 2016 Spring
kazegusuri
44
32k
Other Decks in Programming
See All in Programming
Built Our Own Background Agent at LayerX
layerx
PRO
10
5.2k
ここ半年くらいでAIに作らせたR用ツール
eitsupi
0
370
生成AIで帳票OCRが「簡単に」作れる時代になった?
kon_shou
0
700
【やさしく解説 設計編・中級 #1】一つの車に、運転手は一人 ~ある倉庫システムの事例から~
panda728
PRO
0
210
言葉の格闘技のススメ~紙とペンと言葉から始める、キャリアの描き方~
progresscicada
2
140
<title><a id="</title>君はこのHTMLをパースできるか"></a></title> #雑LT_study
pizzacat83
0
140
Claude CodeとAgentCore Gatewayを繋ぐ際の認証認可 / Authentication and authorization when connecting Claude Code with AgentCore Gateway
har1101
2
260
【やさしく解説 設計編・中級 #4】ルールの寿命と、システムの年輪
panda728
PRO
2
180
夏だ!祭りだ!祭りとはドメインモデリングでは?
ryugen04
0
220
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
300
AWS CDK を「作」ってみた 〜フルスクラッチで見えた CDK の裏側〜 / aws-cdk-from-scratch
gotok365
3
2.8k
ITヒヤリハットを整理してみた ~ライフサイクルと原因から考える再発防止策~
koukimiura
1
140
Featured
See All Featured
Mind Mapping
helmedeiros
PRO
1
300
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
480
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.7k
Skip the Path - Find Your Career Trail
mkilby
1
180
Deep Space Network (abreviated)
tonyrice
0
250
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
370
Being A Developer After 40
akosma
91
590k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
240
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
270
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
Transcript
Outputと BufferedOutputの間 の何か 風薬(@kazegusuri) Fluentd Casual Talks #3
自己紹介 • 風薬(@kazegusuri) • 最近Fluentd使い始めた – たまにPR投げたりしてます – GitHub: sabottenda
• LLVM/Clangとか – 夏と冬にあるお祭りに参加してます – http://motipizza.com
登場人物 • Outputプラグインさん • BufferedOutputプラグインさん • 何か
BufferedOutputさん便利 • BufferedOutputさん – リクエストをバッファリングしてくれる • 仕事が多い日も大丈夫 – 失敗しても再送してくれる •
しっかりもの
Outputさん便利 • Outputさん – 仕事はため込まないよ • ぼくの仕事はここまで • だけど仕事は速い –
失敗してもしらないフリ • お茶目さん
Output vs BufferedOutput • Outputさん – 普段の仕事はまかせよう – 失敗するものはまかせたらだめだぞ •
BufferedOutputさん – 時間のかかる仕事はまかせよう • 仕事がたまってもちゃんと片付けてくれる – 失敗しそうなものはまかせよう • 失敗時のケアも難なくこなすできる人
そんな彼らに 罠が!!
BufferedOutputさん不器用 • 失敗時の再送は最初から行う – リクエストはまとめて1リクエストですべき – そうじゃないと2回リクエストしちゃう • 冪等性あればいいよ #
あまり良くない例 def write(chunk) # メッセージ毎にAPIコール chunk.each do |tag, time, record| do_api_call(tag, time, record) end end
Outputさんその場しのぎ • Outputさんが仕事を押しつけられるケース – BufferedOutputさんができないので • 再送処理実装面倒だし~ – そもそもBufferedの書き方がわからない •
仕組みがわからないと少し複雑 だけど失敗時にロストします!!
間の何か • 二人の間の領域を満たす何かは無いのか… – バッファリングして欲しい – 再送して欲しい – 1リクエスト毎に処理したい
間の何か • 二人の間の領域を満たす何かは無いのか… – バッファリングして欲しい – 再送して欲しい – 1リクエスト毎に処理したい •
fluent-plugin-bufferizeだ! – なおネーミングは若干ミスった感があります
fluent-plugin-bufferize • Outputプラグインに以下の機能を付与する – バッファリング – 1リクエスト毎の再送 – チャンクの途中で再起動しても続きから再開 •
実装はBufferedOutput – オプションが全て使える • buffer_type: メモリ/ファイル選択 • flush_intervalなどなど • 既存のOutputプラグインをそのまま使える
設定方法 • 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>
再送の実装は? • BufferedOutputをそのまま利用 – BufferedOutputでは例外が発生時に再送 – Outputプラグインの例外をそのまま渡す • BufferedOutputは最初から再送しようとする –
どこまで処理したかをbufferizeが記憶 – 続きから再送
問題点 • Outputプラグインが例外をはかないと再送しない – 既存のプラグインは大抵エラーを無視する… – bufferize用に例外をはくようにする • 再送時のコストが大きい –
次のメッセージまで読みながらスキップしている – msgpackにIO#tellの機能が欲しい(もしくは自分の勘違いかも) • できたてほやほや
ご利用は計画的に fin