2012-02-05 19 views
13

RabbitMQ chiama la funzione di callback per un utente quando ha un messaggio per esso o il consumatore deve eseguire il polling del client RabbitMQ?RabbitMQ chiama la funzione di callback per un utente quando ha qualche messaggio?

Quindi, sul lato consumer, se c'è uno script PHP, RabbitMQ può chiamarlo e passare il messaggio/i parametri ad esso. per esempio. se la valutazione è presentata su shard 1 e la tabella aggregateRating si trova su shard 2, allora l'utente di RabbitMQ su shard 2 attiva lo script dicendogli aggRating.php e passa i parametri che sono stati inseriti in shard 1?

+1

Le librerie sono implementate in modo diverso. Molti di loro hanno il supporto per basic.consume.Se la tua libreria php no, dovrai scrivere la tua. Ad esempio, puoi guidare il tuo script php con uno script python o un programma java che consuma messaggi dal broker. – scvalex

+0

I client Python/Java non avrebbero dovuto eseguire il polling, ma avrebbero avuto bisogno di una connessione stabile con il broker. Il broker spingerebbe i messaggi ai client P/J. I client potrebbero quindi chiamare i tuoi script per ciascun messaggio. Vedere i tutorial di RabbitMQ per i dettagli: http://www.rabbitmq.com/getstarted.html – scvalex

+1

Non ho alcuna esperienza con PHP e non so nulla dei client PHP AMQP. Qualunque cosa ho detto sulla libreria PHP è solo un'ipotesi plausibile. Non ho davvero risposto alla tua domanda qui. A proposito, in futuro, potresti voler porre domande come questa alla mailing list RabbitMQ Discuss. Penso di essere l'unico sviluppatore di RabbitMQ che controlla SO; ma ci impegniamo a rispondere a qualsiasi domanda pubblicata sulla mailing list. – scvalex

risposta

9

Quello che si desidera è basic.consume, che consente al broker di inviare messaggi ai client.

Detto questo, le librerie sono implementate in modo diverso. Molti di loro hanno il supporto per basic.consume, ma a causa delle limitazioni intrinseche dei framework utilizzati, alcuni non lo fanno (in particolare il client ufficiale RabbitMQ C su cui sono basati molti altri client).

Se la libreria PHP non supporta basic.consume, è necessario utilizzare il polling (non valido) oppure è possibile utilizzare uno dei client più completi per gestire lo script. Ad esempio, potresti scrivere un programma Python o Java che utilizza il broker (quindi, il broker invia loro le consegne) e potrebbero chiamare lo script ogni volta che viene ricevuto un nuovo messaggio. official tutorials sono un'ottima introduzione alle API AMQP e sono un buon punto di partenza.

Questo è efficiente dalla maggior parte dei punti di vista, ma richiede una connessione stabile con il broker.

In caso di dubbi sulle funzionalità dei vari client o se è necessaria maggiore assistenza, la mailing list RabbitMQ Discuss è un ottimo posto per porre domande. Gli sviluppatori si impegnano a rispondere a qualsiasi query pubblicata lì.

0

Pecl amqp consente di utilizzare la funzionalità di consumo con il metodo AMQPQueue::consume. Hai solo bisogno di passare la funzione di callback in esso e verrà eseguita quando arriva il messaggio.

10

Il metodo AMQPQueue :: consume è ora un'implementazione "corretta" di basic.consume a partire dalla versione 1.0 della libreria AMQP di PHP (http://www.php.net/manual/en/amqpqueue.consume.php). Sfortunatamente, dal momento che PHP è un linguaggio a thread singolo, non puoi fare altro mentre aspetti un messaggio nello stesso spazio del processo. Se chiami AMQPQueue :: consuma e passa una richiamata, l'intera applicazione bloccherà e attenderà che il broker invii il messaggio successivo, a quel punto chiamerà la funzione di callback fornita. Se si desidera un metodo non bloccante, sarà necessario utilizzare AMQPQueue :: get (http://www.php.net/manual/en/amqpqueue.get.php), che eseguirà il polling del server per un messaggio e restituirà un FALSE booleano se non ci sono messaggi.

Non sono d'accordo con il suggerimento di scvatex di utilizzare un linguaggio separato per l'utilizzo di un approccio "push" a questo problema. PHP non è basato su IO, e quindi usare un linguaggio separato per chiamare uno script PHP quando arriva un messaggio sembra una complessità inutile: perché non usare solo AMQPQueue :: consumare e lasciare che il processo blocchi (attendere un messaggio), e mettere tutto la logica nel callback o rendere la callback eseguire uno script PHP separato.

Abbiamo eseguito quest'ultimo nel mio lavoro come un sistema di elaborazione dei lavori su larga scala in modo da poter separare gli errori e mantenere il processore del lavoro padre in esecuzione, indipendentemente da ciò che accade nei bambini. Se desideri una descrizione dettagliata di come impostare questo e alcuni esempi di codice, sarei più che felice di pubblicarli.

+0

Puoi per favore pubblicare i tuoi esempi sul sistema di elaborazione su larga scala (forse Github?) – JavaSa