2011-11-11 16 views
5

Sto lavorando con XMPP e ho un messaggio di richiamata che viene attivato sull'evento di ogni messaggio inviato. Il mio obiettivo è inviare i dati che arrivano dal messaggio a un'API all'interno del callback e in base alla risposta inviare qualcosa utilizzando il client XMPP.Chiamate di metodi asincroni con Ruby come con Ajax

  1. Tipo di utente messaggio (Browser client di chat)
  2. messaggio arriva al server tramite XMPP
  3. messaggio viene inviato alla API
  4. di risposta ricevuto
  5. risposta viene inviata indietro al client di chat .

Il mio codice per questo è la seguente

admin_muc_client.activate_message_callbacks do |m|    
    sender = m.from.resource 
    room_slug = m.from.node 
    message = m.body     

    r = HTTParty.get('http://example.com/api/v1/query?msg=message') 
    Rails.logger.debug(r.inspect) 
    admin_muc_client.send_message("Message #{r.body}") if m.from.resource != 'admin' 
end 

La mia preoccupazione è che dal momento che il callback è evented e la richiesta alle API sarebbe una chiamata di blocco Questo potrebbe diventare un collo di bottiglia per l'intera applicazione . Preferirei usare qualcosa come AJAX per Javascript che genererebbe la richiesta e quando la risposta è disponibile invia i dati. Come potrei implementarlo in Ruby?

Ho visto delayed_job e backgroundrb che sembrano strumenti per il fuoco e dimenticano le operazioni. Avrei bisogno di qualcosa che attivi una richiamata in modo asincrono con la risposta.

Apprezzerei molto l'aiuto su come ottenere il comportamento asincrono che voglio. Ho anche familiarità con le code di messaggi come RabbitMQ, che ritengo sarebbero un'aggiunta di notevole complessità.

risposta

5

Hai guardato girl_friday? From it's wiki -

girl_friday è una libreria Ruby per eseguire attività asincrone. Spesso non si desidera bloccare una risposta Web eseguendo alcune attività, come l'invio di una e-mail, quindi è possibile utilizzare questa gemma per eseguirla in background. Funziona con qualsiasi applicazione Ruby, incluse le applicazioni Rails 3.

Perché non utilizzare nessuno dei milioni di altre soluzioni asincrone (Resque, dj, ecc.)? Perché girl_friday è più facile e più efficiente di quelle soluzioni: girl_friday viene eseguito nel tuo processo Rails e utilizza lo schema degli attori per una concorrenza sicura. Poiché viene eseguito nello stesso processo, non è necessario monitorare un insieme separato di processi, distribuire una base di codice separata, sprecare centinaia di MB extra di RAM per tali processi, ecc. Vedere la mia introduzione agli attori in Ruby per ulteriori dettagli.

È necessario scrivere codice thread-safe. Questo non è difficile da fare: il pattern dell'attore significa che ricevi un messaggio e lo elabori. Non ci sono dati condivisi che richiedono blocchi e potrebbero portare a deadlock nel codice dell'applicazione. Poiché girl_friday utilizza Threads sotto le copertine, devi assicurarti che il tuo ambiente Ruby possa eseguire Thread in modo efficiente. JRuby, Rubinius 1.2 e Ruby 1.9.2 dovrebbero essere sufficienti per la maggior parte delle applicazioni. Non supporto Ruby 1.8 a causa del suo supporto threading poveri.

Penso che questo sia quello che stai cercando.

+0

Impressionante darà uno scatto. Forse è questo. – Sid

+0

Ciò che trovo è che funziona nella console ma non aggiunge l'attività alla coda quando viene eseguita nell'applicazione in modalità di sviluppo. A proposito, sto guidando passeggeri e apache in modalità dev. – Sid

Problemi correlati