5

GitHub APIusersは、 、orgsおよびのアクティビティ イベントの機能を提供しますrepos。APIは、1 ページあたり30 で合計 300 の 10 ページまでのページネーションをサポートします。レート制限は、ヘッダーを使用して実現されます。この API をポーリングして、最新のアクティビティを取得しようとしています。ただし、前述のように Github でサポートされている設計のため、このスキームは非常に非効率的です。でリクエストをしたとしましょうeventseventsETAGpage-1

https://api.github.com/users/me/events/orgs/my-org?page=1

ETAGこのページのエントリを取得します。今、私は次に移動しpage-2

https://api.github.com/users/me/events/orgs/my-org?page=2

ETAGこの 2 ページ目の を取得します。同様に、サポートされている 10 ページすべてからイベントを取得できます。

ここで、組織の Github アカウントで何らかのアクティビティが実行されたとしましょう。新しいイベントが 1 つだけ発生したとします。この場合poll、 API を使用するpage-1ETAG、変更されたページと新しいページがevent含まれて返されます。その前と同様pollingに、変更されたページも送信されます。ただし、この変更は、以前は の最後のイベントでしたが、現在は の一番上に移動しています。この「次へのシフト」は、すべてのページで発生します。発生した新しいイベントの数を確認する方法はありません。唯一の解決策は、ポーリングを継続して最新のイベントを取得することです。ただし、このアプローチには、以下で説明する重大な欠陥があります。page-2ETAGpage-2page-1page-2page-1events

eventsラウンド間の新しい数がpoll30 (1 ページの最大項目数) を超えると、状況はさらに悪化します。この場合、最新の新しい 30 イベントより前のイベントがpage-2直接スリップします。私だけpollがオンの場合、にpage-1スリップしたこれらのイベントが失われpage-2ます。私の頭に浮かぶ唯一の解決策は、イベント全体のキャッシュを保持してから、すべてのページをスイープすることです。ただし、これは非常に非効率的で望ましくない方法であり、イベント通知 API の目的を無効にします。

一部のgithub-devがこれに答えてくれることを願っています

4

1 に答える 1

7

各イベントには ID があり、イベントは応答で順序付けられているため、覚えておく必要があるのは、前の応答の最初のイベントの ID だけです (すべてのイベントではありません)。

だから、私がそれを行う方法は次のとおりです。

初期フェッチ:

  1. すべてのイベント ページを取得する (1 ~ 10 ページ)
  2. 最初のページの ETAG を保存する
  3. 最初のイベントの ID を最初のページに格納する

後続のフェッチ:

  1. 保存された ETAG を使用して、条件付きでイベントの最初のページを取得します
  2. 304 Not modified 応答を受信した場合は、新しいイベントがないため終了します
  3. 200 OK 応答を受信した場合は、新しいイベントがあります。保存された ID と同じ ID を持つイベントを含む最初のページまで、1 から 10 までのページを順番にフェッチします。そのイベントまでに新しくフェッチされたすべてのイベントは新しいイベントであり、処理する必要があります。したがって、新しいイベントの数は、以前に見たイベントまでのすべてのイベントをフェッチした結果として、段階的に検出されます。そして、取得する必要のあるページのみを取得しています。それ以上ではありません。
  4. 最初のページの ETAG を保存する
  5. 最初のイベントの ID を最初のページに格納する
  6. しばらく待ってから、手順 1 に進みます
于 2013-06-25T15:33:20.890 に答える