2010-04-03 7 views
6

Cerco modo scalabile per effettuare le seguenti operazioni:PHP recuperare tutti seguaci di Twitter e confrontarle con amici

  • User login
  • recuperare tutti gli amici da Twitter
  • Fetch tutti Following da Twitter
  • Visualizza tutti gli amici che non sono follower

Il problema: come può essere fatto in modo scalabile? Un utente può avere fino a 2 milioni di amici o follower. Attualmente sto memorizzando entrambi all'interno di una tabella SQLite e li confronta attraverso un ciclo. Quando l'utente torna, la tabella viene cancellata e il processo ricomincia.

Questo funziona trova su 100 - 1000 amici .. ma sarà difficile con 500000 amici. Non riesco a memorizzare le liste perché possono cambiare ogni momento.

Qualcuno sa un buon modo per gestire una quantità così grande di dati?

+2

È davvero realistico che qualcuno abbia 500.000 amici? –

risposta

0

Non so come sia il tuo database, ma questo è come lo configurerei.

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 
); 

Quindi è possibile utilizzare questo SQL per ottenere gli amici che non sono follower.

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 

Se il nome dello schermo è NULL vuol dire che non sono nella vostra tabella twitter_users. Puoi cercare gli utenti mancanti e conservarli per dopo. I nomi delle schermate possono cambiare, quindi potrebbe essere necessario aggiornare periodicamente la tabella.

Utilizzare le API friends/ids e followers/ids per ottenere un elenco di id di amici e follower 5.000 alla volta. Utilizza l'API users/lookup per ottenere fino a 100 nomi di schermate. Se un utente ha 2.000.000 di amici ci vorranno 400 chiamate api per ottenere l'elenco di id, quindi è comunque necessario memorizzare nella cache l'elenco almeno per gli utenti più popolari.

0

Un'altra cosa da sottolineare - è necessario visualizzare tutti gli amici che non sono follower in una volta? Se hai solo bisogno di visualizzare un numero limitato alla volta, 20 per esempio, allora puoi semplicemente calcolare quelli 20; se ne richiedono di più, quindi calcolare più al volo (o farlo in background mentre navigano nel tuo sito, a ogni richiesta, generarne altri).

Non riesco a immaginare una situazione in cui è necessario visualizzare un paio di milioni di risultati in una pagina, anche se questo è il limite teorico.

Quindi, l'approccio che potrebbe funzionare (da avere una breve rassegna alla loro documentazione API) sarebbe quello di

  • afferrare un pezzo di loro amici (sembra che si ottiene il 100 per ogni richiesta in ogni caso) utilizzando il statuses/friends API
  • per ogni amico recuperato
    • utilizzare il friendships/show per determinare lo stato seguace tra i due
    • se hai abbastanza risultati (ad esempio 20) poi pausa, il gioco è fatto

Questo approccio richiede ulteriori richieste al server di quanto è consentito dal rate limiting politiche di Twitter, ma poi di nuovo, ottenendo l'intero elenco amico di un utente con 2.000.000 amici a 100 anche gli amici per richiesta supereranno il limite prima di averli tutti (150 richieste x 100 per richiesta = 15.000). Come pensi di affrontare questo problema?

+0

si può sempre avere l'utente esportare il proprio feed follower e inoltrarlo come parte del processo di avvio ... Curioso se esiste un modo sicuro per trasferirlo a un processore di terze parti (dobutful) – jcolebrand

0

Non l'unico modo per farlo, ma efficace: eseguire un crontab per scaricare un elenco di utenti twitter ogni giorno da un sito che ha una lista pubblica (o Twitter stessa), quindi indicizzare quegli amici (esegui forse 1000 ogni giorno). Quindi accedi all'API di Twitter tramite PHP utilizzando cUrl per recuperare un elenco dei tuoi amici e abbina gli array. Funziona bene perché puoi migliorare il tuo algoritmo mentre procedi- come indicato sopra le politiche di limitazione ti impediranno di fare qualsiasi altra cosa. In bocca al lupo! =)

Problemi correlati