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.
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
+ [![Ruby Version](https://img.shields.io/badge/ruby-%3E%3D%203.4.2-ruby.svg)](https://www.ruby-lang.org)
4
+ [![Gem Version](https://badge.fury.io/rb/shoryuken-template.svg)](https://badge.fury.io/rb/shoryuken-template)
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](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