おっしゃっていたのは以下の2点です。
1)"I would like to rate limit so that only 10,000 requests get processed/day"
2)"while still load balancing those 10,000 requests."
まず、エンド ユーザーからの各要求が n 台のマシンの 1 つにマップされる分割統治アプローチを使用しているようです。したがって、指定された期間内に 10,000 件のリクエストのみが処理されるようにするには、次の 2 つのオプションがあります。
1) すべての n 台のマシンからの結果
を、外部 API がアクセスできる別のエンドポイントにルーティングするコンバイナーを実装します。このエンドポイントは、処理中のジョブの数を数えることができ、しきい値を超えている場合はジョブを拒否します。
2) もう 1 つの方法は、1 日に処理したジョブの量を変数としてデータベース内に保存することです。次に、ジョブの最初の要求時にデータベースの値がしきい値に達しているかどうかを確認するのが一般的です (マシンの 1 つに渡す前に)。しきい値に達した場合は、最初からジョブを拒否します。これは、適切なメッセージと相まって、エンド ユーザーのエクスペリエンスが向上するという利点があります。
これら 10,000 のリクエストすべてが引き続き負荷分散され、1 つの CPU が他のどの CPU よりも多くのジョブを処理しないようにするには、単純なラウンド ロビン アプローチを使用して m 個の CPU にジョブを分散する必要があります。ラウンド ロビンを使用すると、ビン/カテゴリ化アプローチと対比して、ジョブ リクエストが n 個の CPU にできるだけ均一に分散されるようになります。ラウンド ロビンの欠点は、処理しているジョブの種類によっては、スケールアップを開始するときに大量のデータを複製する可能性があることです。これが懸念される場合は、ローカリティ センシティブ ハッシュ (LSH) 関数の形式を実装することを検討する必要があります。優れたハッシュ関数はデータを可能な限り均等に分散しますが、LSH では CPU が他の CPU よりも多くのジョブを処理することになります。■ ハッシュ対象として選択した属性のスキューが発生する可能性が高い場合。いつものように、両方に関連するトレードオフがあるため、ユース ケースに最も適していることがわかります。