Slack Web APIの429をmethod・workspace単位で制御し、Retry-After後に再開する

Slack Web APIの429をmethod・workspace・appで記録し、Retry-Afterの待機を複数workerで共有して再開します。

AIものさし編集部

Slack Web APIでHTTP 429が返ったら、失敗したmethod、workspace、app、Retry-Afterを一組で記録します。一つのworkerを止めても、同じappとworkspaceの別workerが同じmethodを呼び続ければ負荷は下がりません。待機状態を共有し、同じ制限単位の要求をまとめて制御します。

この記事はアプリからSlackへ送るWeb API要求の制御です。Slackから届くEvents APIのACKや再送処理、missing_scopeやnot_in_channelとは分けます。以下は架空のキュー設計例で、Slack APIへの要求やrate limitの実測はしていません。

HTTP応答とmethodを先に確認する

HTTPステータスとheaderを保存できる箇所で429を確認します。SDKが自動再試行する場合、アプリが受け取る例外だけでなく、どこで待機が発生するかも把握します。ログへtokenやメッセージ本文を出さず、内部のworkspace識別子、method、要求時刻、Retry-After、試行回数を記録します。

表は横にスクロールできます

観測調べる対象同じ修復にしないこと
HTTP 429とRetry-After対象methodの呼出量と待機scope追加
missing_scopemethod要件・token・install待てば解決すると扱う
Events受信の再送受信応答・重複排除outboundの429と混同
timeoutや5xx結果の確定状況と再試行方針書込を無条件再送

Slackのrate limits資料(新しいタブで開く)は、Web APIの制限をapp・workspace・method単位で説明し、429のRetry-Afterは再試行までの秒数としています。別tokenへ交換して同じ要求を送ることを、待機の代わりにしません。

待機をworker間で共有する

架空例として、app A・workspace X・conversations.historyで429を受けた場合、その組合せのcooldownを共有保存します。workerごとに独立して待つより、該当キューのdispatch前に共通の再開時刻を確認する方が、同じ制限に対する同時再送を抑えやすくなります。

表は横にスクロールできます

要求の組合せ架空の制御確認する条件
A / X / conversations.historyRetry-Afterまで停止別workerも同じ待機を参照
A / X / users.info別methodとして判断そのmethod自身の制限
A / Y / conversations.history別workspaceとして判断Y側の待機・権限
別appや別token実際のapp対応を確認制限回避のための切替にしない

公式資料は、あるmethodで制限されても他methodや別workspaceの同methodを一律に止める必要はないと説明しています。ただし、別の要求が必ず成功する保証ではありません。投稿などmethod固有の制約もあるため、共通制御に加えて該当methodの仕様を確認します。

再開時に溜まった要求を一斉に放出すると、再び429へ戻りやすくなります。並列数とdispatch速度を調整し、再試行回数・総待機時間・キュー滞留の上限を決めます。上限を超えたら失敗を隠さず、再開待ちや要確認として残します。

SDKとアプリの二重再試行を避ける

SDKがRetry-Afterを処理している上に、呼出元とジョブ基盤も同じ要求を再実行すると、実際の試行数や待機時間が分からなくなります。利用SDKの版と再試行設定を確認し、どの層が何を再試行するかを決めます。

表は横にスクロールできます

層決める責務記録する値
SDKHTTPのrate-limit応答処理自動再試行の有無・上限
dispatch制御対象単位の待機共有再開時刻・並列数
ジョブ業務処理の再開・終了判断処理ID・再試行状態

読取でも取得ページの保存とcursorを対応させ、失敗したページから再開できるようにします。書込では429と、結果が不明なtimeoutを区別します。たとえば投稿後に応答だけ失われた場合、再送で二重投稿する可能性があるため、業務処理IDと実行結果を照合する経路が必要です。

historyやrepliesはアプリの適用条件を見る

Slackの2025年5月29日付の公式変更案内(その後の追記を含む)は、Marketplace外で商用配布されるappの新規作成・新規installationと、既存installation・社内向けappを区別しています。確認した案内では、既存installationと社内向けappは、この変更の対象外です。古い上限表や別appの実績から、自分の適用条件を確定しません。Slack:非Marketplace appのrate limit変更(新しいタブで開く)

この公式変更案内とconversations.historyの現行資料(新しいタブで開く)を合わせて、自分のappとinstallationに適用される条件を確認します。ページングを使わない取得にはより厳しい制限が適用され得るため、全件取得のつもりで同じ先頭ページを繰り返していないかも調べます。tokenのscopeと読めるchannelの条件は、rate limitとは別に満たす必要があります。

復旧を確認する

再開後は一回の成功だけでなく、待機を共有できていること、同じページをループしていないこと、キューが許容時間内に減ることを確認します。投稿などの副作用がある処理では、失敗前後の二重実行も照合します。

「429が消えた」だけで終了せず、対象workspaceとmethod、観測したRetry-After、調整した並列・再試行設定、未処理件数を記録します。必要な処理量が現行制約へ収まらない場合は、不要な全履歴取得や重複ポーリングを減らす設計へ戻ります。

確認した公式資料