shoryuken-template 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.rubocop.yml +60 -0
- data/CHANGELOG.md +74 -0
- data/CONTRIBUTING.md +98 -0
- data/INSTALLATION.md +361 -0
- data/LICENSE.txt +21 -0
- data/PUBLISHING.md +111 -0
- data/Procfile.example +13 -0
- data/QUICKSTART.md +156 -0
- data/README.md +393 -0
- data/RUBY_3.4_FEATURES.md +341 -0
- data/Rakefile +31 -0
- data/UPGRADE_GUIDE.md +293 -0
- data/examples/configuration_example.rb +47 -0
- data/examples/fifo_worker_example.rb +60 -0
- data/examples/heroku_setup.rb +59 -0
- data/examples/parallel_worker_example.rb +49 -0
- data/examples/standard_worker_example.rb +38 -0
- data/examples/worker_specific_config_example.rb +134 -0
- data/lib/shoryuken/template/configuration.rb +133 -0
- data/lib/shoryuken/template/error_handler.rb +118 -0
- data/lib/shoryuken/template/logger.rb +92 -0
- data/lib/shoryuken/template/version.rb +7 -0
- data/lib/shoryuken/template/workers/base_worker.rb +72 -0
- data/lib/shoryuken/template/workers/fifo_worker.rb +84 -0
- data/lib/shoryuken/template/workers/parallel_worker.rb +120 -0
- data/lib/shoryuken/template/workers/standard_worker.rb +44 -0
- data/lib/shoryuken/template.rb +16 -0
- data/shoryuken.yml.example +43 -0
- data/sig/shoryuken/template.rbs +6 -0
- metadata +192 -0
data/PUBLISHING.md
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# 📦 Guia de Publicação no RubyGems
|
|
2
|
+
|
|
3
|
+
## Pré-requisitos
|
|
4
|
+
|
|
5
|
+
1. Conta no RubyGems: https://rubygems.org/sign_up
|
|
6
|
+
2. Gem configurada localmente
|
|
7
|
+
|
|
8
|
+
## Publicar pela Primeira Vez
|
|
9
|
+
|
|
10
|
+
### 1. Configure suas credenciais
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
gem signin
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Isso vai pedir suas credenciais do RubyGems.
|
|
17
|
+
|
|
18
|
+
### 2. Publique a gem
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
cd /Users/sousmile/github/shoryuken-template
|
|
22
|
+
|
|
23
|
+
# Método 1: Usando rake (recomendado)
|
|
24
|
+
rake release
|
|
25
|
+
|
|
26
|
+
# Método 2: Manual
|
|
27
|
+
gem build shoryuken-template.gemspec
|
|
28
|
+
gem push shoryuken-template-0.3.0.gem
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Publicar Nova Versão
|
|
32
|
+
|
|
33
|
+
### 1. Atualize a versão
|
|
34
|
+
|
|
35
|
+
Edite `lib/shoryuken/template/version.rb`:
|
|
36
|
+
|
|
37
|
+
```ruby
|
|
38
|
+
module Shoryuken
|
|
39
|
+
module Template
|
|
40
|
+
VERSION = "0.3.1" # Atualize aqui
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### 2. Commit e tag
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
git add lib/shoryuken/template/version.rb
|
|
49
|
+
git commit -m "Bump version to 0.3.1"
|
|
50
|
+
git push origin master
|
|
51
|
+
|
|
52
|
+
git tag -a v0.3.1 -m "Version 0.3.1"
|
|
53
|
+
git push origin v0.3.1
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### 3. Publique
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
rake release
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Versionamento Semântico
|
|
63
|
+
|
|
64
|
+
Siga o padrão [Semantic Versioning](https://semver.org/):
|
|
65
|
+
|
|
66
|
+
- **MAJOR** (1.0.0): Mudanças incompatíveis na API
|
|
67
|
+
- **MINOR** (0.1.0): Nova funcionalidade compatível
|
|
68
|
+
- **PATCH** (0.0.1): Correção de bugs compatível
|
|
69
|
+
|
|
70
|
+
### Exemplos:
|
|
71
|
+
|
|
72
|
+
- Bug fix: `0.3.0` → `0.3.1`
|
|
73
|
+
- Nova feature: `0.3.0` → `0.4.0`
|
|
74
|
+
- Breaking change: `0.3.0` → `1.0.0`
|
|
75
|
+
|
|
76
|
+
## Usar no Projeto Depois de Publicar
|
|
77
|
+
|
|
78
|
+
```ruby
|
|
79
|
+
# Gemfile
|
|
80
|
+
gem 'shoryuken-template', '~> 0.3.0'
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
bundle install
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Troubleshooting
|
|
88
|
+
|
|
89
|
+
### Erro: "You have already activated X"
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
bundle update shoryuken-template
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### Erro: "Permission denied"
|
|
96
|
+
|
|
97
|
+
Verifique se está logado:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
gem signin
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Reverter uma publicação
|
|
104
|
+
|
|
105
|
+
⚠️ **CUIDADO**: Não é possível deletar gems do RubyGems. Você só pode "yankar" (remover de listagens):
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
gem yank shoryuken-template -v 0.3.0
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Mas a gem ainda estará disponível para quem já a instalou.
|
data/Procfile.example
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Procfile para Heroku
|
|
2
|
+
# Copie para Procfile na raiz do seu projeto
|
|
3
|
+
|
|
4
|
+
# Worker padrão com YJIT habilitado (Ruby 3.4+)
|
|
5
|
+
worker: RUBY_YJIT_ENABLE=1 bundle exec shoryuken -R -C config/shoryuken.yml
|
|
6
|
+
|
|
7
|
+
# Workers específicos (opcional) - com YJIT
|
|
8
|
+
# worker_orders: RUBY_YJIT_ENABLE=1 bundle exec shoryuken -q orders-queue -R
|
|
9
|
+
# worker_images: RUBY_YJIT_ENABLE=1 bundle exec shoryuken -q images-queue -R
|
|
10
|
+
# worker_transactions: RUBY_YJIT_ENABLE=1 bundle exec shoryuken -q transactions-queue.fifo -R
|
|
11
|
+
|
|
12
|
+
# Web (se necessário)
|
|
13
|
+
# web: bundle exec puma -C config/puma.rb
|
data/QUICKSTART.md
ADDED
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
# 🚀 Guia de Início Rápido
|
|
2
|
+
|
|
3
|
+
Este guia mostra como começar a usar o Shoryuken Template em 5 minutos.
|
|
4
|
+
|
|
5
|
+
## Requisitos
|
|
6
|
+
|
|
7
|
+
- Ruby >= 3.4.2
|
|
8
|
+
- AWS SQS configurado
|
|
9
|
+
|
|
10
|
+
## 1. Instalação
|
|
11
|
+
|
|
12
|
+
Adicione ao seu `Gemfile`:
|
|
13
|
+
|
|
14
|
+
```ruby
|
|
15
|
+
gem 'shoryuken-template'
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Execute:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
bundle install
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## 2. Configuração Básica
|
|
25
|
+
|
|
26
|
+
Crie `config/initializers/shoryuken_template.rb`:
|
|
27
|
+
|
|
28
|
+
```ruby
|
|
29
|
+
require 'shoryuken/template'
|
|
30
|
+
|
|
31
|
+
Shoryuken::Template.configure do |config|
|
|
32
|
+
config.thread_pool_size = 10
|
|
33
|
+
config.thread_timeout = 300
|
|
34
|
+
end
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## 3. Crie seu Primeiro Worker
|
|
38
|
+
|
|
39
|
+
### Worker Padrão
|
|
40
|
+
|
|
41
|
+
```ruby
|
|
42
|
+
# app/workers/my_first_worker.rb
|
|
43
|
+
class MyFirstWorker
|
|
44
|
+
include Shoryuken::Template::Workers::StandardWorker
|
|
45
|
+
|
|
46
|
+
worker_options queue: 'my-queue'
|
|
47
|
+
|
|
48
|
+
def process_message(body)
|
|
49
|
+
log_info("Processando mensagem", data: body)
|
|
50
|
+
|
|
51
|
+
# Sua lógica aqui
|
|
52
|
+
puts "Recebido: #{body}"
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## 4. Configure o Shoryuken
|
|
58
|
+
|
|
59
|
+
Crie `config/shoryuken.yml`:
|
|
60
|
+
|
|
61
|
+
```yaml
|
|
62
|
+
aws:
|
|
63
|
+
region: us-east-1
|
|
64
|
+
|
|
65
|
+
concurrency: 10
|
|
66
|
+
delay: 0
|
|
67
|
+
|
|
68
|
+
queues:
|
|
69
|
+
- [my-queue, 1]
|
|
70
|
+
|
|
71
|
+
require:
|
|
72
|
+
- ./config/environment.rb
|
|
73
|
+
- ./app/workers/my_first_worker.rb
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## 5. Execute Localmente
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
bundle exec shoryuken -R -C config/shoryuken.yml
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## 6. Deploy no Heroku
|
|
83
|
+
|
|
84
|
+
### Adicione as variáveis de ambiente:
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
heroku config:set AWS_REGION=us-east-1
|
|
88
|
+
heroku config:set AWS_ACCESS_KEY_ID=your_key
|
|
89
|
+
heroku config:set AWS_SECRET_ACCESS_KEY=your_secret
|
|
90
|
+
heroku config:set SHORYUKEN_THREAD_POOL_SIZE=10
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Crie um `Procfile`:
|
|
94
|
+
|
|
95
|
+
```
|
|
96
|
+
worker: bundle exec shoryuken -R -C config/shoryuken.yml
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Deploy:
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
git add .
|
|
103
|
+
git commit -m "Adiciona Shoryuken workers"
|
|
104
|
+
git push heroku main
|
|
105
|
+
heroku ps:scale worker=1
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## 7. Monitoramento
|
|
109
|
+
|
|
110
|
+
Visualize os logs:
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
heroku logs --tail --ps worker
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## Próximos Passos
|
|
117
|
+
|
|
118
|
+
### Worker Paralelo (para processar em lote)
|
|
119
|
+
|
|
120
|
+
```ruby
|
|
121
|
+
class BatchWorker
|
|
122
|
+
include Shoryuken::Template::Workers::ParallelWorker
|
|
123
|
+
|
|
124
|
+
worker_options queue: 'batch-queue', batch: true
|
|
125
|
+
|
|
126
|
+
def process_message(body)
|
|
127
|
+
# Cada mensagem é processada em uma thread
|
|
128
|
+
process_item(body)
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### Worker FIFO (para processamento ordenado)
|
|
134
|
+
|
|
135
|
+
```ruby
|
|
136
|
+
class FifoWorker
|
|
137
|
+
include Shoryuken::Template::Workers::FifoWorker
|
|
138
|
+
|
|
139
|
+
worker_options queue: 'fifo-queue.fifo'
|
|
140
|
+
|
|
141
|
+
def process_message(body, message_group_id)
|
|
142
|
+
# Processamento sequencial garantido
|
|
143
|
+
process_in_order(body)
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## Ajuda
|
|
149
|
+
|
|
150
|
+
- 📖 Documentação completa: [README.md](README.md)
|
|
151
|
+
- 💡 Exemplos: [examples/](examples/)
|
|
152
|
+
- 🐛 Problemas: [GitHub Issues](https://github.com/sousmile/shoryuken-template/issues)
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
**Dica**: Use `log_info`, `log_error`, etc. dentro dos workers para logs estruturados automáticos!
|
data/README.md
ADDED
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
# Shoryuken Template
|
|
2
|
+
|
|
3
|
+
[](https://www.ruby-lang.org)
|
|
4
|
+
[](https://badge.fury.io/rb/shoryuken-template)
|
|
5
|
+
[](https://opensource.org/licenses/MIT)
|
|
6
|
+
|
|
7
|
+
Template estruturado para projetos que utilizam a gem [Shoryuken](https://github.com/ruby-shoryuken/shoryuken) para consumir mensagens de filas SQS da AWS.
|
|
8
|
+
|
|
9
|
+
## 📋 Requisitos
|
|
10
|
+
|
|
11
|
+
- Ruby >= 3.4.2
|
|
12
|
+
- Shoryuken >= 6.0
|
|
13
|
+
- Concurrent-ruby >= 1.3
|
|
14
|
+
- AWS SQS
|
|
15
|
+
|
|
16
|
+
## 🚀 Funcionalidades
|
|
17
|
+
|
|
18
|
+
- **3 tipos de workers prontos para uso:**
|
|
19
|
+
- 🔹 Worker Padrão: processa uma mensagem por vez
|
|
20
|
+
- 🔹 Worker Paralelo: processa mensagens em lote usando threads
|
|
21
|
+
- 🔹 Worker FIFO: processa mensagens sequencialmente de filas FIFO
|
|
22
|
+
|
|
23
|
+
- **Pool de threads configurável** com `concurrent-ruby`
|
|
24
|
+
- Configuração global ou específica por worker
|
|
25
|
+
- Timeouts individuais por worker
|
|
26
|
+
- **Tratamento de erros robusto** com retry automático
|
|
27
|
+
- **Logging estruturado** em formato JSON
|
|
28
|
+
- **Timeout por thread** para evitar travamentos
|
|
29
|
+
- **Otimizado para Heroku**
|
|
30
|
+
|
|
31
|
+
## 📦 Instalação
|
|
32
|
+
|
|
33
|
+
### Via Git (Recomendado atualmente)
|
|
34
|
+
|
|
35
|
+
Adicione ao seu `Gemfile`:
|
|
36
|
+
|
|
37
|
+
```ruby
|
|
38
|
+
# Usando uma versão específica (tag)
|
|
39
|
+
gem 'shoryuken-template', git: 'https://github.com/sousmile/shoryuken-template.git', tag: 'v0.3.0'
|
|
40
|
+
|
|
41
|
+
# OU usando sempre a última versão do master
|
|
42
|
+
gem 'shoryuken-template', git: 'https://github.com/sousmile/shoryuken-template.git', branch: 'master'
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Execute:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
bundle install
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Via RubyGems (Em breve)
|
|
52
|
+
|
|
53
|
+
```ruby
|
|
54
|
+
gem 'shoryuken-template', '~> 0.3.0'
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
bundle install
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### 🚀 Habilitando YJIT (Recomendado)
|
|
62
|
+
|
|
63
|
+
Para melhor performance, habilite o YJIT do Ruby 3.4:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
# Localmente
|
|
67
|
+
RUBY_YJIT_ENABLE=1 bundle exec shoryuken -R -C config/shoryuken.yml
|
|
68
|
+
|
|
69
|
+
# No Heroku (Procfile)
|
|
70
|
+
worker: RUBY_YJIT_ENABLE=1 bundle exec shoryuken -R -C config/shoryuken.yml
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**Performance:** YJIT pode melhorar a performance em até 20%! 🚀
|
|
74
|
+
|
|
75
|
+
## 🔧 Configuração
|
|
76
|
+
|
|
77
|
+
### Configuração Básica
|
|
78
|
+
|
|
79
|
+
```ruby
|
|
80
|
+
require 'shoryuken/template'
|
|
81
|
+
|
|
82
|
+
Shoryuken::Template.configure do |config|
|
|
83
|
+
# Pool de threads GLOBAL (padrão para todos os workers)
|
|
84
|
+
config.thread_pool_size = 20 # Número de threads no pool global
|
|
85
|
+
config.thread_timeout = 300 # Timeout em segundos (global)
|
|
86
|
+
|
|
87
|
+
# Logging
|
|
88
|
+
config.logger_level = :info
|
|
89
|
+
|
|
90
|
+
# Retry
|
|
91
|
+
config.max_retries = 3
|
|
92
|
+
config.retry_delay = 5
|
|
93
|
+
|
|
94
|
+
# Configuração ESPECÍFICA por worker (opcional)
|
|
95
|
+
config.configure_worker('ImageProcessorWorker',
|
|
96
|
+
thread_pool_size: 30, # Pool dedicado com 30 threads
|
|
97
|
+
thread_timeout: 600 # Timeout de 10 minutos
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
config.configure_worker('EmailWorker',
|
|
101
|
+
thread_pool_size: 50, # Pool maior para I/O bound
|
|
102
|
+
thread_timeout: 30 # Timeout menor
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
# Error handler customizado (opcional)
|
|
106
|
+
config.error_handler = lambda do |error, worker_name, message|
|
|
107
|
+
# Enviar para Sentry, Rollbar, etc
|
|
108
|
+
Sentry.capture_exception(error)
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### Variáveis de Ambiente
|
|
114
|
+
|
|
115
|
+
Todas as configurações podem ser definidas via variáveis de ambiente:
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
SHORYUKEN_THREAD_POOL_SIZE=20
|
|
119
|
+
SHORYUKEN_THREAD_TIMEOUT=300
|
|
120
|
+
SHORYUKEN_LOG_LEVEL=info
|
|
121
|
+
SHORYUKEN_MAX_RETRIES=3
|
|
122
|
+
SHORYUKEN_RETRY_DELAY=5
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### Configuração para Heroku
|
|
126
|
+
|
|
127
|
+
```ruby
|
|
128
|
+
# config/initializers/shoryuken.rb
|
|
129
|
+
require 'shoryuken/template'
|
|
130
|
+
|
|
131
|
+
Shoryuken::Template.configure do |config|
|
|
132
|
+
# Ajusta threads baseado no tipo de dyno
|
|
133
|
+
config.thread_pool_size = ENV.fetch('SHORYUKEN_THREAD_POOL_SIZE', 10).to_i
|
|
134
|
+
config.thread_timeout = 25 # Menor que o timeout do Heroku (30s)
|
|
135
|
+
|
|
136
|
+
# Workers específicos podem ter configurações diferentes
|
|
137
|
+
config.configure_worker('HeavyProcessingWorker',
|
|
138
|
+
thread_pool_size: 5,
|
|
139
|
+
thread_timeout: 600 # 10 minutos para tarefas pesadas
|
|
140
|
+
)
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
# Graceful shutdown
|
|
144
|
+
Signal.trap('TERM') do
|
|
145
|
+
Shoryuken::Template.configuration.reset_thread_pools!
|
|
146
|
+
exit(0)
|
|
147
|
+
end
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## 📝 Uso
|
|
151
|
+
|
|
152
|
+
### Worker Padrão (StandardWorker)
|
|
153
|
+
|
|
154
|
+
Processa uma mensagem por vez de uma fila SQS normal:
|
|
155
|
+
|
|
156
|
+
```ruby
|
|
157
|
+
class OrderProcessorWorker
|
|
158
|
+
include Shoryuken::Template::Workers::StandardWorker
|
|
159
|
+
|
|
160
|
+
worker_options queue: 'orders-queue'
|
|
161
|
+
|
|
162
|
+
def process_message(body)
|
|
163
|
+
order_id = body['order_id']
|
|
164
|
+
|
|
165
|
+
log_info("Processando pedido", order_id: order_id)
|
|
166
|
+
|
|
167
|
+
# Sua lógica aqui
|
|
168
|
+
process_order(order_id)
|
|
169
|
+
|
|
170
|
+
log_info("Pedido processado", order_id: order_id)
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Worker Paralelo (ParallelWorker)
|
|
176
|
+
|
|
177
|
+
Processa múltiplas mensagens em paralelo usando threads:
|
|
178
|
+
|
|
179
|
+
```ruby
|
|
180
|
+
class ImageProcessorWorker
|
|
181
|
+
include Shoryuken::Template::Workers::ParallelWorker
|
|
182
|
+
|
|
183
|
+
worker_options queue: 'images-queue', batch: true
|
|
184
|
+
|
|
185
|
+
def process_message(body)
|
|
186
|
+
image_id = body['image_id']
|
|
187
|
+
|
|
188
|
+
log_info("Processando imagem", image_id: image_id)
|
|
189
|
+
|
|
190
|
+
# Cada mensagem é processada em uma thread separada
|
|
191
|
+
download_and_process_image(image_id)
|
|
192
|
+
|
|
193
|
+
log_info("Imagem processada", image_id: image_id)
|
|
194
|
+
end
|
|
195
|
+
end
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### Worker FIFO (FifoWorker)
|
|
199
|
+
|
|
200
|
+
Processa mensagens sequencialmente de filas FIFO:
|
|
201
|
+
|
|
202
|
+
```ruby
|
|
203
|
+
class TransactionWorker
|
|
204
|
+
include Shoryuken::Template::Workers::FifoWorker
|
|
205
|
+
|
|
206
|
+
worker_options queue: 'transactions-queue.fifo'
|
|
207
|
+
|
|
208
|
+
def process_message(body, message_group_id)
|
|
209
|
+
transaction_id = body['transaction_id']
|
|
210
|
+
|
|
211
|
+
log_info(
|
|
212
|
+
"Processando transação",
|
|
213
|
+
transaction_id: transaction_id,
|
|
214
|
+
message_group_id: message_group_id
|
|
215
|
+
)
|
|
216
|
+
|
|
217
|
+
# Processamento sequencial garantido
|
|
218
|
+
process_transaction(transaction_id)
|
|
219
|
+
end
|
|
220
|
+
end
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
## ⚙️ Configuração Avançada
|
|
224
|
+
|
|
225
|
+
### Pool e Timeout Específico por Worker
|
|
226
|
+
|
|
227
|
+
Você pode configurar pool de threads e timeout individualmente para cada worker:
|
|
228
|
+
|
|
229
|
+
```ruby
|
|
230
|
+
Shoryuken::Template.configure do |config|
|
|
231
|
+
# Configuração global (fallback)
|
|
232
|
+
config.thread_pool_size = 10
|
|
233
|
+
config.thread_timeout = 300
|
|
234
|
+
|
|
235
|
+
# Workers I/O bound: mais threads, timeout menor
|
|
236
|
+
config.configure_worker('EmailWorker',
|
|
237
|
+
thread_pool_size: 50,
|
|
238
|
+
thread_timeout: 30
|
|
239
|
+
)
|
|
240
|
+
|
|
241
|
+
# Workers CPU bound: menos threads, timeout maior
|
|
242
|
+
config.configure_worker('VideoProcessorWorker',
|
|
243
|
+
thread_pool_size: 5,
|
|
244
|
+
thread_timeout: 1800 # 30 minutos
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
# Workers com tarefas variadas: usa configuração global
|
|
248
|
+
# (não precisa configurar explicitamente)
|
|
249
|
+
end
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
**Como funciona:**
|
|
253
|
+
- Cada worker configurado tem seu próprio pool de threads
|
|
254
|
+
- Workers não configurados usam o pool global
|
|
255
|
+
- Timeout é verificado por thread individualmente
|
|
256
|
+
|
|
257
|
+
**Quando usar configuração específica:**
|
|
258
|
+
- ✅ Workers com necessidades muito diferentes de recursos
|
|
259
|
+
- ✅ Separar workers I/O bound de CPU bound
|
|
260
|
+
- ✅ Isolar workers críticos de workers experimentais
|
|
261
|
+
- ❌ Não abuse: muitos pools pequenos = overhead desnecessário
|
|
262
|
+
|
|
263
|
+
## 🔍 Logging
|
|
264
|
+
|
|
265
|
+
Todos os logs são estruturados em formato JSON:
|
|
266
|
+
|
|
267
|
+
```json
|
|
268
|
+
{
|
|
269
|
+
"timestamp": "2026-01-16T10:30:45.123Z",
|
|
270
|
+
"level": 2,
|
|
271
|
+
"message": "Mensagem processada com sucesso",
|
|
272
|
+
"pid": 12345,
|
|
273
|
+
"thread_id": 70123456789,
|
|
274
|
+
"environment": "production",
|
|
275
|
+
"worker": "OrderProcessorWorker",
|
|
276
|
+
"order_id": "ORD-123",
|
|
277
|
+
"duration": 1.234
|
|
278
|
+
}
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
### Métodos de Log Disponíveis
|
|
282
|
+
|
|
283
|
+
```ruby
|
|
284
|
+
log_debug("Mensagem de debug", context: "valor")
|
|
285
|
+
log_info("Mensagem informativa", user_id: 123)
|
|
286
|
+
log_warn("Aviso", count: 10)
|
|
287
|
+
log_error("Erro encontrado", error: e.message)
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
## 🛡️ Tratamento de Erros
|
|
291
|
+
|
|
292
|
+
### Retry Automático
|
|
293
|
+
|
|
294
|
+
O sistema tenta automaticamente reprocessar mensagens que falharam:
|
|
295
|
+
|
|
296
|
+
```ruby
|
|
297
|
+
# Configuração
|
|
298
|
+
config.max_retries = 3
|
|
299
|
+
config.retry_delay = 5 # segundos com backoff exponencial
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
### Error Handler Customizado
|
|
303
|
+
|
|
304
|
+
```ruby
|
|
305
|
+
config.error_handler = lambda do |error, worker_name, message|
|
|
306
|
+
Sentry.capture_exception(error, extra: {
|
|
307
|
+
worker: worker_name,
|
|
308
|
+
message_id: message&.message_id
|
|
309
|
+
})
|
|
310
|
+
end
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
## 🏗️ Estrutura do Projeto
|
|
314
|
+
|
|
315
|
+
```
|
|
316
|
+
lib/shoryuken/template/
|
|
317
|
+
├── configuration.rb # Configuração e pool de threads
|
|
318
|
+
├── logger.rb # Sistema de logging estruturado
|
|
319
|
+
├── error_handler.rb # Tratamento de erros e retry
|
|
320
|
+
└── workers/
|
|
321
|
+
├── base_worker.rb # Worker base
|
|
322
|
+
├── standard_worker.rb # Worker padrão
|
|
323
|
+
├── parallel_worker.rb # Worker paralelo
|
|
324
|
+
└── fifo_worker.rb # Worker FIFO
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
## 🎯 Boas Práticas
|
|
328
|
+
|
|
329
|
+
### 1. Configuração de Threads
|
|
330
|
+
|
|
331
|
+
**Pool Global (recomendações por tipo de dyno):**
|
|
332
|
+
- **Dyno Standard-1X**: 10 threads
|
|
333
|
+
- **Dyno Standard-2X**: 20 threads
|
|
334
|
+
- **Performance-M**: 40 threads
|
|
335
|
+
- **Performance-L**: 80 threads
|
|
336
|
+
|
|
337
|
+
**Pools Específicos por Worker:**
|
|
338
|
+
- Configure apenas workers com necessidades muito diferentes
|
|
339
|
+
- Workers I/O bound: mais threads (ex: 50 para email/HTTP)
|
|
340
|
+
- Workers CPU bound: menos threads (ex: 5 para processamento de vídeo)
|
|
341
|
+
|
|
342
|
+
### 2. Timeouts
|
|
343
|
+
|
|
344
|
+
- Mantenha timeouts menores que 30s para workers web-facing no Heroku
|
|
345
|
+
- Use timeouts maiores (600-1800s) para operações batch/assíncronas
|
|
346
|
+
- Configure timeout específico para workers com necessidades especiais
|
|
347
|
+
|
|
348
|
+
### 3. Worker Paralelo
|
|
349
|
+
|
|
350
|
+
- Use para operações I/O bound (downloads, uploads, chamadas HTTP)
|
|
351
|
+
- Evite para operações CPU intensivas (use menos threads)
|
|
352
|
+
- Monitore o uso de memória
|
|
353
|
+
- Configure pool específico se necessário
|
|
354
|
+
|
|
355
|
+
### 4. Worker FIFO
|
|
356
|
+
|
|
357
|
+
- Use apenas para operações que DEVEM ser sequenciais
|
|
358
|
+
- Garante ordem dentro do mesmo `message_group_id`
|
|
359
|
+
- Performance menor que workers padrão
|
|
360
|
+
- Geralmente não precisa de configuração específica de pool
|
|
361
|
+
|
|
362
|
+
## 📚 Exemplos
|
|
363
|
+
|
|
364
|
+
Veja a pasta `examples/` para exemplos completos:
|
|
365
|
+
|
|
366
|
+
- `standard_worker_example.rb` - Worker padrão
|
|
367
|
+
- `parallel_worker_example.rb` - Worker paralelo
|
|
368
|
+
- `fifo_worker_example.rb` - Worker FIFO
|
|
369
|
+
- `configuration_example.rb` - Configuração completa
|
|
370
|
+
- `heroku_setup.rb` - Setup para Heroku
|
|
371
|
+
|
|
372
|
+
## 🧪 Testes
|
|
373
|
+
|
|
374
|
+
```bash
|
|
375
|
+
bundle exec rake test
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
## 📄 Licença
|
|
379
|
+
|
|
380
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
|
381
|
+
|
|
382
|
+
## 🤝 Contribuindo
|
|
383
|
+
|
|
384
|
+
1. Fork o projeto
|
|
385
|
+
2. Crie uma branch para sua feature (`git checkout -b feature/nova-feature`)
|
|
386
|
+
3. Commit suas mudanças (`git commit -am 'Adiciona nova feature'`)
|
|
387
|
+
4. Push para a branch (`git push origin feature/nova-feature`)
|
|
388
|
+
5. Abra um Pull Request
|
|
389
|
+
|
|
390
|
+
## 📞 Suporte
|
|
391
|
+
|
|
392
|
+
- GitHub Issues: https://github.com/sousmile/shoryuken-template/issues
|
|
393
|
+
- Email: andrade.rmn@gmail.com
|