In a rails web app, if I write messages to a queue like rabbitmq, how will clients be notified when a producer sends a message to the queue?
I’m guessing I have to create a seperate process that runs in the background to respond to messages correct? i.e. this code is outside of the scope of a web application.
If this is the case, is it possible to re-use the models/libs that are in the rails application already? do I have to copy this code in 2 places then?
It looks like your application requires what’s usually called a background or worker process. This is a fairly common requirement for any moderately complex web application.
Yes – you’re right about this. Whilst it’s perfectly possible to use threads to handle the background tasks (in your case, reading and processing messages from RabbitMQ), the standard and recommended route for a Rails application is to run a separate background process.
Absolutely. The simplest possible way to get this working is by using Rails’ built in runner command.
Another option is to create a ruby script which loads up your Rails application. For example, you could create the file
my_script.rbin the root of your project, which might look something like this:If your needs become more complex, or you find that you need to run more than one background process to keep up with the volume of data you need to process, you might want to look at one of the many available libraries and frameworks which can help with this.
Once you’ve created your background process, you’ll need a way to run it continuously when you deploy it to your production server. Whilst it’s possible to use libraries like daemons, as suggested by ctcherry, I would recommend using a dedicated tool like upstart (if deploying to ubuntu) or runit. A good summary of the most popular options is available here.