Sidekiq cron で予約公開と revalidate を統合する

やりたいこと

ブログサイトで「予約公開」を入れると、必ず付随で「予約時刻に Next.js の ISR を再生成する」が要る。これを別系統で組むと、publish と revalidate がズレる リスクが残る。Sidekiq の cron で 両方を 1 つの worker に集約するのが整然。

実装

毎分 1 回、scheduled で publishedat が過去になったものを published に遷移 + 即 ISR 再生成。トランザクションで囲むので、DB 更新と revalidate が必ずペアで走る。

RevalidatePostsWorker

revalidate するのは 記事ページ + トップ + 一覧 + カテゴリページ。新しい記事が出ると、最低この 4 つの URL は更新が必要。

Sidekiq 8 の cron 設定

Sidekiq 8 で cron スケジューラが builtin になった（Sidekiq.options[:scheduler]）。これ以前は sidekiq-cron gem を別途入れる必要があった。

config/sidekiq.yml の :scheduler: セクションだけで cron job が動く。

落とし穴

実運用で気付いた点 3 つ:
cron の頻度は「毎分」で十分

/1 で毎分実行。1 秒以下の精度は不要（ブログの予約公開は分単位で十分）。
publishedat は 必ず past timestamp に変える

scheduled → published に遷移する時、published_at を現在時刻にも更新するか、scheduled 時に設定した時刻のままにするか、で運用が変わる。

私は scheduled 時の時刻のまま にした。…