Domanda

Sono stato l'invio di email relativa alla mia domanda (rubino 1.8.7, Rails 2.3.2) come questo Thread.new{UserMailer.deliver_signup_notification(user)}

Dal rubino utilizzare fili verdi, non c'è alcun vantaggio prestazionale fare questo, o posso semplicemente usare UserMailer.deliver_signup_notification(user) ?

Grazie

È stato utile?

Soluzione

blocco globale VM sarà comunque quasi certamente applicare durante l'invio che la posta elettronica, il che significa nessuna differenza.

Non si dovrebbe avviare le discussioni in un ciclo di richiesta / risposta. Non si dovrebbe iniziare le discussioni a tutti a meno che non si può guardare loro di creare ad unirsi, e anche allora, è raramente vale la pena crea.

Rails non è thread-safe, e non intende essere dall'interno delle azioni di controllo. Solo dal Rails 2.3 ha solo dispacciamento stato thread-safe, e solo se lo si accende in environment.rb con config.threadsafe!.

questo articolo spiega più in dettaglio. Se si desidera inviare il messaggio in modo asincrono utilizzare BackgroundRb o il suo analogo.

Altri suggerimenti

In generale, utilizzando fili verdi per eseguire le operazioni in background in modo asincrono significa che l'applicazione può rispondere all'utente prima la posta viene inviata. Non siete preoccupati per sfruttare più CPU; sei preoccupato solo su off-caricamento del lavoro su un processo in background e restituendo una pagina web al più presto possibile.

E dall'esame della documentazione Rails, sembra deliver_signup_notification bloccherà abbastanza a lungo per prendere la posta in coda (anche se potrei sbagliarmi). Quindi, utilizzando un filo qui potrebbe rendere l'applicazione sembra più reattivo, a seconda di come il vostro programma di posta sia configurato.

Purtroppo, non è chiaro per me che deliver_signup_notification è necessariamente thread-safe. Avrei voluto leggere la documentazione con attenzione prima di fare affidamento su questo.

Si noti inoltre che si sta facendo ipotesi circa la durata di un processo di Rails una volta una richiesta è stata servita. Molte applicazioni Rails utilizzando DRB (o uno strumento simile) per scaricare queste attività in background su un processo di lavoro completamente separata. Il modo più semplice per farlo cambia abbastanza spesso - vedi Google per una serie di popolari librerie .

Ho usato la vostra strategia precisa e le nostre applicazioni sono attualmente in esecuzione della produzione (ma rotaie 2.2.2). Ho tenuto d'occhio su di esso e il nostro carico è stato relativamente basso (meno di 20 email inviate al giorno medio, con punte di circa 150 / giorno).

Finora abbiamo notato alcun problema, e questo sembra aver risolto molti problemi di prestazioni che stavamo avendo quando si utilizzano server di posta di Google.

Se avete bisogno di qualcosa in fretta poi dare un colpo, che ha lavorato per noi.

Saranno lo stesso per quanto ne so.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top