2010-04-03 1 views
6

ich für skalierbare Art und Weise suchen die zu folgenden Aktionen:PHP holen alle Verfolger Twitter und vergleichen sie mit Freunden

  • Benutzeranmeldung
  • Liefert alle Freunde von Twitter
  • Liefert alle Verfolger von Twitter
  • Alle anzeigen Freunde, die keine Follower sind

Das Problem: Wie kann dies skalierbar gemacht werden? Ein Benutzer kann bis zu 2 Millionen Freunde oder Follower haben. Momentan speichere ich beide innerhalb einer SQLite-Tabelle und vergleiche sie durch eine Schleife. Wenn der Benutzer zurückkommt, wird die Tabelle gelöscht und der Prozess beginnt erneut.

Das funktioniert auf 100 - 1000 Freunden .. wird aber mit 500000 Freunden knifflig sein. Ich kann die Listen nicht cachen, weil sie jeden Moment ändern können.

Kennt jemand eine gute Weise, solch große Datenmenge zu behandeln?

+2

Ist es wirklich realistisch, dass jemand 500.000 Freunde hat? –

Antwort

0

Ich weiß nicht, wie Ihre Datenbank aussieht, aber so würde ich es einrichten.

CREATE TABLE twitter_users (
    user_id INTEGER PRIMARY KEY NOT NULL, 
    screen_name VARCHAR(20) NOT NULL 
); 

CREATE TABLE friends (
    friend_id INTEGER PRIMARY KEY NOT NULL 
); 

CREATE TABLE followers (
    follower_id INTEGER PRIMARY KEY NOT NULL 
); 

Dann können Sie diese SQL verwenden, um die Freunde zu bekommen, die keine Anhänger sind.

SELECT friend_id, screen_name 
FROM friends 
LEFT JOIN followers ON follower_id = friend_id 
LEFT JOIN twitter_users ON user_id = friend_id 
WHERE follower_id IS NULL 

Wenn der Bildschirm Name ist NULL es bedeutet, dass sie nicht in Ihrem twitter_users Tisch. Sie können die fehlenden Benutzer nachschlagen und für später speichern. Bildschirmnamen können sich ändern, sodass Sie die Tabelle möglicherweise regelmäßig aktualisieren müssen.

Verwenden Sie die APIs friends/ids und followers/ids, um eine Liste von Freundschafts- und Follower-IDs 5.000 auf einmal zu erhalten. Verwenden Sie die API users/lookup, um bis zu 100 Bildschirmnamen zu erhalten. Wenn ein Benutzer 2.000.000 Freunde hat, werden 400 API-Aufrufe benötigt, um die Liste der IDs zu erhalten, so dass Sie die Liste zumindest für beliebte Benutzer noch zwischenspeichern sollten.

0

Eine andere Sache, darauf hinzuweisen - müssen Sie alle Freunde anzeigen, die nicht gleichzeitig Anhänger sind? Wenn Sie zum Beispiel nur eine begrenzte Anzahl von 20 anzeigen möchten, können Sie diese 20 berechnen. wenn sie mehr anfordern, dann berechnen Sie mehr im laufenden Betrieb (oder tun Sie es im Hintergrund, während Sie Ihre Website durchsuchen; bei jeder Anfrage ein paar mehr generieren).

Ich kann mir keine Situation vorstellen, in der Sie ein paar Millionen Ergebnisse auf einer Seite anzeigen müssten, auch wenn das die theoretische Grenze ist.

der Ansatz also, dass (aus mit einem kurzen browse an ihrer API-Dokumentation) zu

  • greifen wäre ein Teil ihrer Freunde funktionieren könnte (es scheint, dass Sie 100 pro Anfrage bekommen sowieso) mit der statuses/friends API
  • für jedes abgerufene Freund
    • die friendships/show verwenden den Folger Status zwischen den beiden
    • , um festzustellen, ob Sie genügend Ergebnisse (zB 20) haben dann brechen, du bist
    • getan

Dieser Ansatz hat mehr Anfragen an den Server benötigen, als rate limiting Richtlinien von Twitters erlaubt ist, aber dann wieder, mit 2.000.000 Freunden bei 100 die gesamte Freundesliste eines Benutzers bekommen Freunde pro Anfrage werden auch das Limit überschreiten, bevor Sie alle bekommen (150 Anfragen x 100 pro Anfrage = 15, 000). Wie planen Sie, dieses Problem anzugehen?

+0

Sie könnten den Benutzer immer seinen eigenen Follower-Feed exportieren lassen und ihn als Teil des Startvorgangs senden ... Neugierig, wenn es eine sichere Möglichkeit gibt, diese an einen Drittanbieter-Prozessor weiterzuleiten (dobutful) – jcolebrand

0

Nicht die einzige Möglichkeit, dies zu tun, aber effektiv: Führen Sie eine Crontab aus, um täglich eine Liste von Twitter-Benutzern von einer Website mit einer öffentlichen Liste (oder Twitter) herunterzuladen und diese Freunde dann zu indizieren Tag). Dann greifen Sie mit Hilfe von cUrl auf die twitter API zu, um eine Liste Ihrer Freunde zu erhalten - und passen Sie die Arrays an. Dies funktioniert gut, weil Sie Ihren Algorithmus während des Betriebs verbessern können. Wie oben erwähnt, werden die einschränkenden Richtlinien Sie davon abhalten, etwas anderes zu tun. Viel Glück! =)