無料枠は「1回あたり」ではなく「1日の合計」で掛け算する:記録の書き込みが枠を超えていた話
記事03で、トレードbotを本番のお金で動かす前に、紙の上で測ると書いた。その試験は、5分ごとに自動で動く小さなプログラムに任せている。置き場所はCloudflareの無料枠だ。お金をかけずに回すつもりだった。
ところが、作って動かし始めた後で、計算が合っていないことに気づいた。1日のどこかで、無料枠の上限を超える作りになっていた。派手な失敗ではない。ただ、無人で回す仕組みほど、こういうところで黙って止まる。
記事01で、使っていいお金の上限を先に決めると書いた。無料枠を使うのは、その上限を守るためでもある。無料枠の中で回るなら、試す本数が増えても毎月の固定費は増えない。枠の数え方を間違えると、この前提ごと崩れる。
何が起きていたか
プログラムは5分ごとに1回動く。動くたびに、結果を記録に書き込む。この書き込みを、1回の処理の中で4回に分けて行っていた。
1回の処理で4回なら、少なく見える。問題は1日の合計だった。5分ごとなら、1日に288回動く。288回×4回で、1日1,152回の書き込みになる。
一方、Cloudflareの無料枠では、この記録への書き込みは1日1,000回までだ。ここでいう記録は、KVと呼ばれる置き場で、名前と中身を組にして保存する。しかも1,000回という上限は、仕組みごとではない。口座全体での合計だ。
いつ止まる計算だったか
無料枠の回数は、UTCの0時に数え直しになる。日本時間でいえば朝9時だ。そこから数えて1,000回に届くのは、250回目の処理になる。4回×250回で1,000回だ。
5分ごとに250回動くと、UTCの20時台の終わりに届く。日本時間の朝6時ごろだ。そこから朝9時の数え直しまで、書き込みは失敗し続ける。1日あたり残りの38回分、152回の書き込みが落ちる計算だった。
しかも、失敗しても何も言わない。プログラムは誰も見ていないところで動いている。記録が抜けていても、気づく人がいない。記事03では、記録を毎日欠かさず続けることが大事だと書いた。その記録が、毎朝3時間ほど抜ける作りだったわけだ。
上限を超えた時に何が起きるかも、先に見ておく
無料枠を超えた時の扱いは、サービスによって違う。止まるもの、超えた分が請求になるもの、黙って失敗するもの。今回は、黙って失敗する側だった。
請求が来るなら、少なくとも気づける。止まるなら、止まったことが見える。いちばん気づきにくいのは、動いているように見えて、中身だけ抜けていく形だ。無料枠の数字を見る時は、上限の回数と一緒に、超えた時の扱いも見るようにしている。
どう直したか
直し方は単純だ。1回の処理での書き込みを、1回にまとめた。4回に分けていた中身を1つの記録にまとめ、最後に1回だけ書く。これで1日の書き込みは288回になる。1,000回の枠のうち、700回あまりが残る。
直した後は、2つ確かめた。まず、3回分の処理を模擬で動かして、書き込みが3回で済むことを見た。1回の処理につき1回だ。次に、本番に入れた後も、試験が止まらずに続いていることを見た。
前の形で書いた記録は、消さずに残した。読むだけにして、新しい形の記録に引き継いでいる。書き込むのは新しい方だけだ。試験はもう始まっていた。途中で記録の形を変えると、そこで数字が途切れるおそれがある。30日分をつなげて見るつもりの記録なので、それまでの数字が消えないようにした。
同じ口座のほかの仕組みも、同じ枠を食う
もう一つ気をつけたいのは、この枠が口座全体で1つだという点だ。記事02で書いた、警告が来たときの受け口も、同じ口座で動いている。そちらが記録を書けば、同じ1,000回から引かれる。
つまり、1つの仕組みだけを見て「まだ余裕がある」と判断しても足りない。同じ口座に仕組みを足すたびに、全部の書き込みを足し直す必要がある。書き込みを288回まで減らしたことで、ほかの仕組みに回せる分が残った。
教訓は「1日の合計で掛け算する」
無料枠の数字を見ると、つい「1回の処理で何回使うか」で考えてしまう。4回なら少ない、と感じる。でも枠は、1日の合計で決まっている。そして定時で動く仕組みは、1日に何百回も動く。
なので今は、無料枠を使う仕組みを作る前に、次の3つを先に数えるようにしている。
- 1回の処理で、何回書き込むか
- 1日に何回動くか(5分ごとなら288回)
- 同じ口座のほかの仕組みが、1日に何回書き込むか
1つ目と2つ目を掛けて、3つ目を足す。その数が、枠の中に余裕をもって収まるか。作る前にこれを見ていれば、今回の作り直しは要らなかった。
動かす間隔も、この掛け算の一部だ。たとえば同じ仕組みを1分ごとに動かせば、1日に1,440回になる。1回の処理で1回しか書かなくても、それだけで1,000回を超える。間隔を短くするのは、書き込みを増やすのと同じことになる。
次の記事では、毎日「載っていない」と返し続けていた見張りのプログラムの話を書く。こちらも、作った後に気づいた失敗だ。