Amazon Simple Queing Service (SQS) + Ruby
Amazon SQS is a distributed queue messaging service. The idea of SQS is to remove the direct associations between producer and consumer and act as mediator between them.
Consider that you have a large application like websites monitoring which involve many stages like
- Downloading a website
- Processing the downloaded website
- Generating report of the above processing
The traditional approach (called as Client-Server architecture) is to send the notification using a simple HTTP ,REST , SOAP etc request. But it too has some disadvantage as it require extra care and precision to handle all possible response e.g Time-out,Server down etc.
One can save this time and effort my using SQS.
e.g Instead of sending the direct request to Server one can use to SQS to interact with Server/Client an can eventually cut down some of drawback of traditional architecture.
Setting up Amazon SQS in Ruby: There are various library available for using Amazon SQS in Ruby (e.g right_aws, sqs)
Pre-requitise:- aws-access-key-id
- aws-secret-access-key
- ruby-library(right_aws or sqs gem) both of which is provide by the Amazon (or you can ask for incase) during the process of account-registration
In your irb console
require "rubygems"
require "right_aws"
aws_access_key_id = "Your access key id"
aws_secret_access_key = "Your secret access Key"
sqs = RightAws::SqsGen2.new(aws_access_key_id,aws_secret_access_key)
This basically initialize the sqs object for you to work on.
One can create a new queue just by a single method.
queue(queue_name, create=true, visibility=nil)
carefully look at parameter supplied.
queue_name => name of queue. create => true (create a queue if it does not exist (optional)). visibility => set visibility (which make the message reappear after a specified time if not delete from queue).
One key point about visibility is that one can’t set visibility more than 7200 sec for a queue or a message .But you can set so from RightScale (Cloud Computing management Platform).
e.g
my_queue = queue('queue_1')
just look at few other methods.
1 send_message or push :- Send message to the specified queue.
my_queue.send_message "This is my first message"
2 receive or pop :- Receive message from the specified queue.
message_received = my_queue.receive
puts message_received.body
=>; "This is my first message";
3 receive_messages : - There is also a method called receive_messages to receive an array of messages but it never returned me more than one message so if it work for you it fine then syntax is like this
receive_messages(number_of_message=1,visibility=nil)
my_queue.receive_messages(2,60) => return and array of messages
4 delete : - Delete a message or a queue
my_queue.delete => "delete the my_queue for SQS"
message_received.delete => "delete the message from the intended queue"
5 size :- Specify the no of message in?the queue
my_queue.size => 4 #"4" message in my_queue
6 name :- Specify name of the queue
my_queue.name => "queue_1" #Name of the queue
Note There is delay lag in all request and response sent or received to or from SQS server don’t assume to work it instantaneous approximately of around 45 sec -1 minute or it can be more.
e.gIf you send a message to the queue don’t assume it to appear instantaneously in the queue
Pricing Model => $0.10 per 100,000 requests.
Message Size => 64KB
For more information on Pricing and message size click here.
Thank you