clerk-rate-limits
Clerkのレート制限とクォータを理解・管理できます。レート制限に達した場合やAPI利用を最適化したい時、高トラフィックシナリオに備える際に活用します。「clerk rate limit」「clerk quota」「clerk API limits」「clerk throttling」などのキーワードで起動します。
description の原文を見る
Understand and manage Clerk rate limits and quotas. Use when hitting rate limits, optimizing API usage, or planning for high-traffic scenarios. Trigger with phrases like "clerk rate limit", "clerk quota", "clerk API limits", "clerk throttling".
SKILL.md 本文
Clerk レート制限
概要
Clerkのレート制限システムを理解し、制限に達しないための戦略を実装します。
前提条件
- APIアクセス可能なClerkアカウント
- アプリケーションのトラフィックパターンの理解
- モニタリング・ロギングインフラストラクチャ
手順
ステップ1: レート制限を理解する
Clerk APIレート制限(2024年現在)
| エンドポイントカテゴリ | 無料プラン | プロプラン | Enterprise |
|---|---|---|---|
| 認証 | 100/分 | 500/分 | カスタム |
| ユーザー管理 | 100/分 | 500/分 | カスタム |
| セッション管理 | 200/分 | 1000/分 | カスタム |
| Webhooks | 無制限 | 無制限 | 無制限 |
クライアント側の制限
- SDKリクエストは自動的にスロットルされます
- ブラウザセッション: 10リクエスト/秒
- トークン更新: 50秒ごとに1回(自動)
ステップ2: レート制限ハンドリングを実装する
// lib/clerk-client.ts
import { clerkClient } from '@clerk/nextjs/server'
interface RateLimitConfig {
maxRetries: number
baseDelay: number
}
async function withRateLimitRetry<T>(
operation: () => Promise<T>,
config: RateLimitConfig = { maxRetries: 3, baseDelay: 1000 }
): Promise<T> {
let lastError: Error | null = null
for (let attempt = 0; attempt < config.maxRetries; attempt++) {
try {
return await operation()
} catch (error: any) {
lastError = error
// Check for rate limit error
if (error.status === 429 || error.code === 'rate_limit_exceeded') {
const delay = config.baseDelay * Math.pow(2, attempt)
console.warn(`Rate limited, retrying in ${delay}ms (attempt ${attempt + 1})`)
await new Promise(resolve => setTimeout(resolve, delay))
continue
}
// Non-rate-limit error, throw immediately
throw error
}
}
throw lastError
}
// Usage
export async function getUser(userId: string) {
const client = await clerkClient()
return withRateLimitRetry(() => client.users.getUser(userId))
}
ステップ3: バッチ操作
// lib/clerk-batch.ts
import { clerkClient } from '@clerk/nextjs/server'
// Instead of multiple individual calls
async function getBatchedUsers(userIds: string[]) {
const client = await clerkClient()
// Use getUserList with userId filter (single API call)
const { data: users } = await client.users.getUserList({
userId: userIds,
limit: 100
})
return users
}
// Paginated fetching with rate limit awareness
async function getAllUsers(batchSize = 100, delayMs = 100) {
const client = await clerkClient()
const allUsers = []
let offset = 0
while (true) {
const { data: users, totalCount } = await client.users.getUserList({
limit: batchSize,
offset
})
allUsers.push(...users)
offset += batchSize
if (allUsers.length >= totalCount) break
// Rate limit friendly delay
await new Promise(resolve => setTimeout(resolve, delayMs))
}
return allUsers
}
ステップ4: キャッシング戦略
// lib/clerk-cache.ts
import { unstable_cache } from 'next/cache'
import { clerkClient } from '@clerk/nextjs/server'
// Cache user data to reduce API calls
export const getCachedUser = unstable_cache(
async (userId: string) => {
const client = await clerkClient()
return client.users.getUser(userId)
},
['clerk-user'],
{
revalidate: 60, // Cache for 60 seconds
tags: ['clerk-users']
}
)
// In-memory cache for high-frequency lookups
const userCache = new Map<string, { user: any; timestamp: number }>()
const CACHE_TTL = 30000 // 30 seconds
export async function getUserWithCache(userId: string) {
const cached = userCache.get(userId)
if (cached && Date.now() - cached.timestamp < CACHE_TTL) {
return cached.user
}
const client = await clerkClient()
const user = await client.users.getUser(userId)
userCache.set(userId, { user, timestamp: Date.now() })
return user
}
ステップ5: レート制限の使用状況を監視する
// lib/clerk-monitor.ts
interface RateLimitMetrics {
endpoint: string
remaining: number
limit: number
resetAt: Date
}
const metrics: RateLimitMetrics[] = []
export function trackRateLimit(response: Response) {
const remaining = response.headers.get('x-ratelimit-remaining')
const limit = response.headers.get('x-ratelimit-limit')
const reset = response.headers.get('x-ratelimit-reset')
if (remaining && limit) {
metrics.push({
endpoint: response.url,
remaining: parseInt(remaining),
limit: parseInt(limit),
resetAt: reset ? new Date(parseInt(reset) * 1000) : new Date()
})
// Alert if approaching limit
if (parseInt(remaining) < parseInt(limit) * 0.1) {
console.warn('Approaching rate limit:', {
remaining,
limit,
endpoint: response.url
})
}
}
}
export function getRateLimitMetrics() {
return metrics.slice(-100) // Last 100 entries
}
出力
- リトライ機能付きレート制限ハンドリング
- バッチAPI操作
- キャッシング実装
- モニタリングシステム
レート制限ヘッダ
x-ratelimit-limit: 100
x-ratelimit-remaining: 95
x-ratelimit-reset: 1704067200
ベストプラクティス
- リクエストをバッチ処理する - 複数のgetUserコールではなくgetUserListを使用する
- 積極的にキャッシュする - ユーザーデータはリアルタイムではめったに変わりません
- Webhooksを使用する - ポーリングではなくClerkにプッシュアップデートさせる
- 指数バックオフを使用する - 遅延を増やしながらリトライする
- 使用状況を監視する - レート制限ヘッダを追跡する
エラーハンドリング
| エラー | 原因 | 対策 |
|---|---|---|
| 429 Too Many Requests | レート制限超過 | バックオフを実装し、キャッシュを増やす |
| quota_exceeded | 月額クォータに達した | プランをアップグレードするか使用量を減らす |
| concurrent_limit | 並列リクエストが多すぎる | リクエストをキューに入れる |
リソース
次のステップ
セキュリティのベストプラクティスについては clerk-security-basics に進みます。
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- Brmbobo
- リポジトリ
- Brmbobo/Web2podcast
- ライセンス
- MIT
- 最終更新
- 2026/1/26
Source: https://github.com/Brmbobo/Web2podcast / ライセンス: MIT
関連スキル
superpowers-streamer-cli
SuperPowers デスクトップストリーマーの npm パッケージをインストール、ログイン、実行、トラブルシューティングできます。ユーザーが npm から `superpowers-ai` をセットアップしたい場合、メールまたは電話でサインインもしくはアカウント作成を行いたい場合、ストリーマーを起動したい場合、表示されたコントロールリンクを開きたい場合、後で停止したい場合、またはソースコードへのアクセスなしに npm やランタイムの一般的な問題から復旧したい場合に使用します。
catc-client-ops
Catalyst Centerのクライアント操作・監視機能 - 有線・無線クライアントのリスト表示・フィルタリング、MACアドレスによる詳細なクライアント検索、クライアント数分析、時間軸での分析、SSIDおよび周波数帯によるフィルタリング、無線トラブルシューティング機能を提供します。MACアドレスやIPアドレスでのクライアント検索、サイト別やSSID別のクライアント数集計、無線周波数帯の分布分析、Wi-Fi信号の問題調査が必要な場合に活用できます。
ci-cd-and-automation
CI/CDパイプラインの設定を自動化します。ビルドおよびデプロイメントパイプラインの構築または変更時に使用できます。品質ゲートの自動化、CI内のテストランナー設定、またはデプロイメント戦略の確立が必要な場合に活用します。
shipping-and-launch
本番環境へのリリース準備を行います。本番環境へのデプロイ準備が必要な場合、リリース前チェックリストが必要な場合、監視機能の設定を行う場合、段階的なロールアウトを計画する場合、またはロールバック戦略が必要な場合に使用します。
linear-release-setup
Linear Releaseに向けたCI/CD設定を生成します。リリース追跡の設定、LinearのCIパイプライン構築、またはLinearリリースとのデプロイメント連携を実施する際に利用できます。GitHub Actions、GitLab CI、CircleCIなど複数のプラットフォームに対応しています。
tracking-application-response-times
API エンドポイント、データベースクエリ、サービスコール全体にわたるアプリケーションのレスポンスタイムを追跡・最適化できます。パフォーマンス監視やボトルネック特定の際に活用してください。「レスポンスタイムを追跡する」「API パフォーマンスを監視する」「遅延を分析する」といった表現で呼び出せます。