3

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 つのスレッドは失敗します。

この問題を解決するにはどうすればよいですか? これらのスレッドの信頼性を高めるにはどうすればよいですか?

4

1 に答える 1

1

レート制限ステータスの取得が、他のアクションと同じ Twitter とのメッセージに基づいていると仮定すると、このステータスをチェックして信頼性をもたらそうとする試みが失敗するというラグが常に存在します。同期的に操作しない限り、ステータスが最新でなくなる可能性は常にあります。エラーの場合は、レート制限ステータスをローカルで計算し、すべてのスレッドを自己回復可能にすることをお勧めします。また、待機/通知メカニズムを使用することは、CPU 時間の浪費の観点から、繰り返し可能なアクションに適しています。

于 2012-06-09T09:21:59.927 に答える