2010-02-12 14 views
6

Hai utilizzato PHP da un po 'di tempo e mi chiedevo cosa fosse tutta questa "coda di messaggi". Prendiamo Facebook per esempio. Posso aggiornare il mio stato ma poi devo mostrare gli aggiornamenti di stato a tutti i miei amici (diciamo che ho 3000 follower). Ancora più lavoro se ci sono commenti e devono essere notificati a tutti gli amici che hanno lasciato un commento via email. Con l'esempio che ho visto, sembra che tutto ciò che fa una coda di messaggi è prendere il "messaggio" (il mio aggiornamento di stato) e metterlo in uno spazio temporaneo (file system o tabella DB). Poi ho un cron job che lo estrae e aggiorna il mio tavolo.Aiutami a capire come funziona l'accodamento dei messaggi

Detto ciò, come faccio a manipolare tali dati? Immagino di essere confuso su come questo mi possa davvero aiutare. Come si traduce la seguente funzione in una coda di messaggi e quindi si pianifica l'esecuzione della funzione in un secondo momento?

1 - Aggiorna il mio stato 2 - Ora pubblicalo sulla mia pagina e su tutti i miei amici. 3 - Se il commento è rimasto, inviare ora l'ultimo commento a coloro che "si iscrivono" a quel commento.

La mia domanda è: come posso manipolare quei dati? Inserisco semplicemente il "commento", quindi ho un "lavoro" che estrae quel commento e lo inserisce in una funzione che lo elabora?

Ecco un esempio che ho intenzione di esaminare.

http://www.freeopenbook.com/php-hacks/phphks-CHP-5-SECT-18.html

Grazie in anticipo.

risposta

3

La mia domanda è, come posso manipolare tali dati? Devo solo inserire il "commento" quindi avere un "job" che tira fuori quel commento e collegare in una funzione che lo elabora?

Esattamente

.

Gli aggiornamenti dello stato di pubblicazione nelle pagine di Facebook probabilmente non implicano l'accodamento dei messaggi: non conosco il loro design specifico, ma suppongo che i dati aggiornati siano forniti solo su richiesta tramite una query quando gli utenti caricano le loro pagine . (A meno che Facebook ha un processo separato per denormalizzare i dati di aggiornamento di stato.)

Al contrario, l'invio di notifiche aggiornamento di stato di posta elettronica è un ottimo candidato per l'accodamento dei messaggi.

Un'implementazione tipica implicherebbe la scrittura di un nuovo messaggio (generalmente minimo, forse solo l'ID utente) in una specifica coda di messaggi, forse la coda "EmailStatusUpdateNotifications".

Un altro processo quindi deseleziona i messaggi e sa esattamente cosa fare con essi. Un processo dedicato all'invio di messaggi di posta elettronica di aggiornamento dello stato utilizza l'id utente (il contenuto del messaggio) per caricare lo stato corrente e un elenco degli indirizzi email dei tuoi amici, creare i messaggi e-mail e inviarli.

Si scopre che è possibile trovare molte buone informazioni sull'architettura di Facebook in Why are Facebook, Digg, and Twitter so hard to scale? con Scalabilità elevata.

+0

grazie per la spiegazione. La coda dei messaggi può avere più "colonne". Se sto memorizzando user_id e il messaggio, la mia funzione dovrebbe analizzarlo in qualche modo. O è solo un "file" piatto. – luckytaxi

+0

Esattamente (di nuovo): si ha il controllo sul contenuto (o sul corpo) e il formato dei messaggi, e il processore o la funzione devono solo sapere come analizzarli. (La maggior parte delle implementazioni delle code dei messaggi offre anche una varietà di formati di serializzazione, ma di solito non è necessario gestirli direttamente a meno che non si stia navigando nel contenuto della coda non elaborata.) –

+0

ah ok. Immagino che xml sarebbe utile allora, eh? – luckytaxi

2

Inserisco semplicemente il "commento", quindi ho un "lavoro" che estrae quel commento e lo inserisce in una funzione che lo elabora?

Uno dei punti con code di messaggi è di disaccoppiare i servizi, e di fare l'elaborazione asincrona.

Avresti un servizio di coda dei messaggi in esecuzione, quando qualcuno cambia il loro stato invierai un messaggio a una determinata coda. Potresti farlo dal codice php che viene eseguito quando un utente cambia il suo stato.

Avresti quindi un servizio/processo in background in esecuzione da qualche parte che estrae i messaggi da quella coda. Sarebbe certamente qualcosa di esterno al processo PHP che ha inviato il messaggio in base a una chiamata HTTP. Quel lavoro estrae i messaggi dalla coda, esegue l'elaborazione dei messaggi, come capire a chi inviare la posta e quindi inviare la posta.

Ora hai un modo flessibile per gestire tali aggiornamenti di posta.

  • Sarebbe abbastanza facile eseguire il servizio di aggiornamento di posta su un altro computer rispetto al server web.
  • È più semplice ridimensionare se è necessaria maggiore potenza.
  • È possibile implementare più facilmente un'invio ritardato, ad es. potresti aspettare un minuto o 2 con l'invio della posta e se l'utente aggiorna il suo stato di nuovo, tu mandi solo 1 mail, non 2
  • Se avessi fatto tutto questo all'interno della richiesta http dell'utente che ha cambiato il suo stato, lui ' D devo aspettare fino a quando tutta quella elaborazione è stata completata.
+0

Sì, ho avuto un problema con l'invio di una mail carico di barche! Dovrò capire quale lingua usare quando estrai i dati. Mi chiedo quanto bene funziona php tramite la CLI. – luckytaxi

Problemi correlati