🍃このブログは移転しました。
3秒後、自動的に移動します・・・。

Cloudflare WorkersのCron Triggerで、サブリクエスト数制限と戦う

プランによっても変わるけど、Workersには制限がいろいろある。

  • デプロイできるコードのサイズ
  • 実行CPU時間
  • etc...

https://developers.cloudflare.com/workers/platform/limits

先日の発表で、そのあたりの一部が緩和されるという話があって、またひとつ使いやすいFaaSになったはず。

Workers, Now Even More Unbound: 15 Minutes, 100 Scripts, and No Egress Fees

ただそんな流れの中でも、相変わらず鎮座してる制限がありまして・・。

サブリクエスト数の制限

サブリクエストとは、Workerの処理中に発行された外部リソースへのリクエストのこと。端的にいえば`fetch()`できる回数に制限がある。

https://developers.cloudflare.com/workers/platform/limits#subrequests

現状、最大で50回までのサブリクエストが可能で、リダイレクトもカウントされるとのこと。

もともとやりたかったこと

というような、バッチ処理あるあるな内容。

これをCloudflare Workersでやる場合、このサブリクエスト数の制限が問題になる。

1度の呼び出しで「100件それぞれに対してAPIを叩く」っていうのが、そもそも実現できない。50件に収められるならいいけど、まあ基本的には無理。

ならばどうする?っていう話。

Cron Triggerの定義を変える

Workerを1回呼び出すごとに、50回までという制限がある。
ならば、Workerを2回呼び出せば、あわせて100回までいけるのでは?というのがこの記事の趣旨です。(解決策と言えるのかはさておき)

なのでたとえば、

# UTC 1時 = JST 10時 の、00分と30分
0,30 1 * * *

# UTC 1時 = JST 10時 の、5分置き
*/5 1 * * *

みたく、1度きりではなく複数回実行されるようにする。

そして、コード側でサブリクエスト数に気をつけて処理を分担するようにすれば、なんとかやりたいことができる・・・!

  • サーキットブレーカー的なコードが必要になる
  • 余裕をもって実行すると、空打ちになることもある

けど、それでもやりたいことは実現できた。

そこまでしてでやらんでも

っていうのもごもっともで、サブリクエスト数に制限のないAWSとかGCPとか、別のところでやれば良いという話ではある・・。

が、CFWは実行時間で課金されないというアドバンテージがあるので、バッチ処理でもうまく使っていきたいなーというわけで。

ただこの作戦のネックはもう1つあって、実は1Workerに設定できるCron Triggerは3つまでなのである・・。

  • 繰り返し前処理のCron
  • 繰り返すCron
  • 繰り返し後処理のCron

みたくすると、これで3枠を全部使い切ったことになり、それ以上は追加できなくなる。

Cloudflareさんへ、ここもなんとかしてくれませんかね〜。

2021/12/23 追記

Feature Request: Customize the subrequests limit · Issue #132 · cloudflare/miniflare · GitHub

中の人に言えば拡張してもらえるらしいと聞いて震えてる・・・。