javaを使用してtwitter4jの上にtwitterへのコネクタを構築しようとしています。Twitte4j が対処せず、ユーザーが対処することを期待している問題の 1 つは、レート制限の問題です。
Twitter4j を使用して Twitter API を最大限に活用するための私のアプローチは、その上に複数のスレッドを構築することです。データベースにツイート ID とユーザー ID を持つユーザーだけを含むツイート ダンプがあります。新しい情報が流入するたびに、Twitter にクエリを実行し、これらのテーブルを更新するには、Twitter スレッドが必要です。そこで、user テーブルを更新するスレッドと tweets テーブルを更新するスレッドの 2 つの異なるスレッドを作成しました。ユーザー更新スレッドは非常に簡単に実行できます。なぜなら、twitter は一度に最大 100 人のユーザーのクエリをサポートしています (ユーザー/ルックアップ)。ただし、つぶやきスレッドは、一度に 1 つのみ (つぶやき/表示) のみをサポートします。そこで、「つぶやき更新」スレッドを作成し、さらに 5 つのスレッドを開始します。各スレッドは、Twitter にクエリを送信し、一度に 1 つの投稿を更新します。ここで、ratelimit の出番です。だから、いつでも、私は 6 つのスレッドを実行し、TwitterService (私のサービス クラス) をクエリしています。これらのスレッドはクエリを実行する前に常に ratelimit に達しているかどうかをチェックし、ヒットしていればスリープ モードに移行します。したがって、スレッドが呼び出すサービス メソッドは次のようになります。
private synchronized void checkRateLimitStatus() {
if (rateLimitHit) {
try {
logger.warn("RateLimit has been reached");
wait(secondsUntilReset * 1000);
rateLimitHit = false;
secondsUntilReset = 0;
} catch (InterruptedException ie) {
ie.printStackTrace();
}
notifyAll();
}
}
ブール値の rateLimitHit は、残りのリクエスト数をチェックする Twitter4J リスナーによって設定されます。カウントがゼロになると、この bool は true に設定されます。コードは次のようになります。
public synchronized void onRateLimitStatus(RateLimitStatusEvent evt) {
RateLimitStatus status = evt.getRateLimitStatus();
if (status.getRemainingHits() == 0) {
rateLimitHit = true;
secondsUntilReset = status.getSecondsUntilReset();
}
}
これの問題は、たとえば、Twitter にあと 3 つのクエリが残っていて、メソッド checkRateLimitStatus() が 6 つのクエリすべてに対して false を返すことです (まだ設定されていないため)。したがって、すべてのスレッドは、カウントがまだゼロではないので開始します。ただし、Twitter で最初の 3 つのスレッドが完了すると、カウントはゼロになり、残りの 3 つのスレッドは失敗します。
この問題を解決するにはどうすればよいですか? これらのスレッドの信頼性を高めるにはどうすればよいですか?