É importante ressaltar que dependendo da ação você quer executar haverá maneiras diferentes de configurar o SQS, por exemplo você pode querer usar ele apenas como producer, ou seja, apenas para enviar mensagens para uma fila que será processada por outra aplicação, usar como fila de processamento dos seus jobs ou configurar workers que irão escutar as mensagens da fila e processá-la por exemplo para disparar um e-mail ou processar arquivos.
Utilizando como producer
Essa é a configuração mais simples pois você só precisa configurar as envs e adicionar a gem do SDK.
Primeiro adicione a gem do SDK do aws para trabalhar com SQS:
# Gemfile
gem 'aws-sdk-sqs'
$ bundler install
Adicione as envs necessárias para o SDK, essas envs são esperadas pela gem para se comunicar com sua conta na aws:
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=4
AWS_REGION=us-east-1
AWS_SQS_QUEUE_NAME=
AWS_QUEUE_URL=
Pode haver variações então sempre é bom dar uma conferida na documentação neste link
Agora basta instanciar o SDK e enviar a mensagem:
result = Aws::SQS::Client.new.send_message(
queue_url: ENV['AWS_QUEUE_URL'],
message_body: { order_id: "123" }.to_json
)
Utilizando como worker
Para isso utilizaremos a gem shoryuken que seria o equivalente ao Sidekiq para o Redis.
# Gemfile
gem 'shoryuken'
$ bundler install
Adicionamos um arquivo de configuração:
# config/shoryuken.yml
concurrency: 5
require: ./app/workers
queues:
- [ <%= ENV.fetch('AWS_SQS_QUEUE_NAME') %>, 1]
O “require” força o Rails a carregar os workers dessa pasta em ambiente de development.
Caso o projeto não reconheça a pasta dos workers, basta adicionar essa configuração:
config.eager_load_paths.delete("#{Rails.root}/app/workers")
config.eager_load_paths.unshift("#{Rails.root}/app")
Dependendo da versão do rails pode variar, mas seria uma configuração de autoload para arquivos de pastas que não são padrão em projetos Rails como por exemplo “jobs”, “controllers”, “services” etc.
Agora basta criar seus workers para escutar as filas
class ExampleWorker
include Shoryuken::Worker
shoryuken_options queue: ENV.fetch('AWS_SQS_QUEUE_NAME'), auto_delete: true
def perform(sqs_msg, body)
payload = JSON.parse(body)
::ExampleService.new(payload).call
end
end
Para ele ser reconhecido como worker, injetamos o módulo Shoryuken::Worker na classe.
Em shoryuken_options temos a opção queue que seria a fila que esse worker irá escutar e auto_delete que informa ao worker que deve apagar a mensagem do SQS após sua leitura ser feita com sucesso.
Para que os workers comecem a escutar as filas basta usar o comando:
$ bundle exec shoryuken -R -C config/shoryuken.yml
Onde a flag -R serve para carregar o ambiente do rails, carregando assim suas envs e gems.
E a flag -C seria para carregar o arquivo de configuração, sem ela teria que passar cada configuração nesse comando, como por exemplo as filas que devem ser escutadas.
Utilizando como fila de processamento de jobs
Aqui será utilizado novamente o shoryuken mas com uma configuração adicional, temos que mudar o queue_adapter do rails para utilizar essa gem.
# config/application.rb
config.active_job.queue_adapter = :shoryuken
Inicialmente o projeto gerencia o processamento do job tudo em memória, essa configuração serve para usar as configurações do shoryuken para gerenciar usando o SQS.
Agora basta criar um job
$ rails g job SayHello
class SayHelloJob < ActiveJob::Base
queue_as ENV.fetch('AWS_SQS_QUEUE_NAME', :default)
def perform(name)
sleep(2)
puts "Hello #{name}"
end
end
Para testar o job utilize o console do rails e a função perform_later.
SayHelloJob.perform_later("jackson")
Um ponto interessante aqui é que se utilizar o perform_now, o job será executado mas não será enviado para o SQS, pois tudo será executado de forma sincrona em memória.
Dentro do SQS, você verá uma mensagem com o seguinte body:
{
"job_class": "SayHelloJob",
"job_id": "883d23f0-1997-xxxxx-xxxxxxxx",
"provider_job_id": null,
"queue_name": "queue-name-example",
"priority":null,
"arguments":[ "jackson" ],
"executions": 0,
"exception_executions": {},
"locale": "en",
"timezone": "UTC",
"enqueued_at": "2026-04-03T12:57:41.629214813Z",
"scheduled_at":null
}
Os argumentos passados no job ficarão dentro da chave “arguments” e os demais campos são configurações do próprio job.
Referências:
https://github.com/ruby-shoryuken/shoryuken/wiki/Getting-Started
https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/SQS/Client.html
Top comments (0)