smart_message 0.0.12 โ†’ 0.0.16

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.
Files changed (117) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/CHANGELOG.md +155 -1
  4. data/Gemfile.lock +6 -6
  5. data/README.md +71 -25
  6. data/docs/core-concepts/architecture.md +5 -10
  7. data/docs/getting-started/examples.md +0 -12
  8. data/docs/getting-started/quick-start.md +4 -9
  9. data/docs/index.md +6 -4
  10. data/docs/reference/serializers.md +160 -488
  11. data/docs/reference/transports.md +47 -146
  12. data/docs/transports/memory-transport.md +2 -1
  13. data/docs/transports/multi-transport.md +484 -0
  14. data/docs/transports/redis-transport-comparison.md +215 -350
  15. data/docs/transports/redis-transport.md +3 -22
  16. data/examples/README.md +6 -9
  17. data/examples/city_scenario/README.md +1 -1
  18. data/examples/city_scenario/messages/emergency_911_message.rb +0 -1
  19. data/examples/city_scenario/messages/emergency_resolved_message.rb +0 -1
  20. data/examples/city_scenario/messages/fire_dispatch_message.rb +0 -1
  21. data/examples/city_scenario/messages/fire_emergency_message.rb +0 -1
  22. data/examples/city_scenario/messages/health_check_message.rb +0 -1
  23. data/examples/city_scenario/messages/health_status_message.rb +0 -1
  24. data/examples/city_scenario/messages/police_dispatch_message.rb +0 -1
  25. data/examples/city_scenario/messages/silent_alarm_message.rb +0 -1
  26. data/examples/file/00_run_all_file_demos.rb +260 -0
  27. data/examples/file/01_basic_file_transport_demo.rb +237 -0
  28. data/examples/file/02_fifo_transport_demo.rb +289 -0
  29. data/examples/file/03_file_watching_demo.rb +332 -0
  30. data/examples/file/04_multi_transport_file_demo.rb +432 -0
  31. data/examples/file/README.md +257 -0
  32. data/examples/memory/00_run_all_demos.rb +317 -0
  33. data/examples/memory/01_message_deduplication_demo.rb +18 -32
  34. data/examples/memory/02_dead_letter_queue_demo.rb +9 -12
  35. data/examples/memory/03_point_to_point_orders.rb +3 -5
  36. data/examples/memory/04_publish_subscribe_events.rb +15 -16
  37. data/examples/memory/05_many_to_many_chat.rb +19 -22
  38. data/examples/memory/06_stdout_publish_only.rb +145 -0
  39. data/examples/memory/07_proc_handlers_demo.rb +13 -14
  40. data/examples/memory/08_custom_logger_demo.rb +136 -140
  41. data/examples/memory/09_error_handling_demo.rb +7 -10
  42. data/examples/memory/10_entity_addressing_basic.rb +25 -31
  43. data/examples/memory/11_entity_addressing_with_filtering.rb +32 -36
  44. data/examples/memory/12_regex_filtering_microservices.rb +10 -11
  45. data/examples/memory/13_header_block_configuration.rb +0 -5
  46. data/examples/memory/14_global_configuration_demo.rb +12 -14
  47. data/examples/memory/15_logger_demo.rb +0 -1
  48. data/examples/memory/README.md +37 -20
  49. data/examples/memory/log/demo_app.log.1 +100 -0
  50. data/examples/memory/log/demo_app.log.2 +100 -0
  51. data/examples/multi_transport_example.rb +114 -0
  52. data/examples/redis/01_smart_home_iot_demo.rb +20 -24
  53. data/examples/redis/README.md +0 -2
  54. data/examples/utilities/box_it.rb +12 -0
  55. data/examples/utilities/doing.rb +19 -0
  56. data/examples/utilities/temp.md +28 -0
  57. data/lib/smart_message/base.rb +24 -17
  58. data/lib/smart_message/configuration.rb +2 -23
  59. data/lib/smart_message/dead_letter_queue.rb +1 -1
  60. data/lib/smart_message/errors.rb +3 -0
  61. data/lib/smart_message/header.rb +1 -1
  62. data/lib/smart_message/logger/default.rb +1 -1
  63. data/lib/smart_message/messaging.rb +37 -66
  64. data/lib/smart_message/plugins.rb +42 -41
  65. data/lib/smart_message/serializer/base.rb +1 -1
  66. data/lib/smart_message/serializer.rb +3 -2
  67. data/lib/smart_message/subscription.rb +18 -20
  68. data/lib/smart_message/transport/async_publish_queue.rb +284 -0
  69. data/lib/smart_message/transport/base.rb +42 -8
  70. data/lib/smart_message/transport/fifo_operations.rb +264 -0
  71. data/lib/smart_message/transport/file_operations.rb +200 -0
  72. data/lib/smart_message/transport/file_transport.rb +149 -0
  73. data/lib/smart_message/transport/file_watching.rb +72 -0
  74. data/lib/smart_message/transport/memory_transport.rb +23 -4
  75. data/lib/smart_message/transport/partitioned_files.rb +46 -0
  76. data/lib/smart_message/transport/redis_transport.rb +11 -0
  77. data/lib/smart_message/transport/registry.rb +0 -1
  78. data/lib/smart_message/transport/stdout_transport.rb +73 -41
  79. data/lib/smart_message/transport/stdout_transport.rb.backup +88 -0
  80. data/lib/smart_message/transport.rb +0 -1
  81. data/lib/smart_message/version.rb +1 -1
  82. metadata +25 -37
  83. data/docs/guides/redis-queue-getting-started.md +0 -697
  84. data/docs/guides/redis-queue-patterns.md +0 -889
  85. data/docs/guides/redis-queue-production.md +0 -1091
  86. data/docs/transports/redis-enhanced-transport.md +0 -524
  87. data/docs/transports/redis-queue-transport.md +0 -1304
  88. data/examples/redis_enhanced/README.md +0 -319
  89. data/examples/redis_enhanced/enhanced_01_basic_patterns.rb +0 -233
  90. data/examples/redis_enhanced/enhanced_02_fluent_api.rb +0 -331
  91. data/examples/redis_enhanced/enhanced_03_dual_publishing.rb +0 -281
  92. data/examples/redis_enhanced/enhanced_04_advanced_routing.rb +0 -419
  93. data/examples/redis_queue/01_basic_messaging.rb +0 -221
  94. data/examples/redis_queue/01_comprehensive_examples.rb +0 -508
  95. data/examples/redis_queue/02_pattern_routing.rb +0 -405
  96. data/examples/redis_queue/03_fluent_api.rb +0 -422
  97. data/examples/redis_queue/04_load_balancing.rb +0 -486
  98. data/examples/redis_queue/05_microservices.rb +0 -735
  99. data/examples/redis_queue/06_emergency_alerts.rb +0 -777
  100. data/examples/redis_queue/07_queue_management.rb +0 -587
  101. data/examples/redis_queue/README.md +0 -366
  102. data/examples/redis_queue/enhanced_01_basic_patterns.rb +0 -233
  103. data/examples/redis_queue/enhanced_02_fluent_api.rb +0 -331
  104. data/examples/redis_queue/enhanced_03_dual_publishing.rb +0 -281
  105. data/examples/redis_queue/enhanced_04_advanced_routing.rb +0 -419
  106. data/examples/redis_queue/redis_queue_architecture.svg +0 -148
  107. data/ideas/README.md +0 -41
  108. data/ideas/agents.md +0 -1001
  109. data/ideas/database_transport.md +0 -980
  110. data/ideas/improvement.md +0 -359
  111. data/ideas/meshage.md +0 -1788
  112. data/ideas/message_discovery.md +0 -178
  113. data/ideas/message_schema.md +0 -1381
  114. data/lib/smart_message/transport/redis_enhanced_transport.rb +0 -399
  115. data/lib/smart_message/transport/redis_queue_transport.rb +0 -555
  116. data/lib/smart_message/wrapper.rb.bak +0 -132
  117. /data/examples/memory/{06_pretty_print_demo.rb โ†’ 16_pretty_print_demo.rb} +0 -0
@@ -1,486 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # examples/redis_queue/04_load_balancing.rb
3
- # Load balancing and consumer groups with Redis Queue Transport
4
-
5
- require_relative '../../lib/smart_message'
6
-
7
- puts "โš–๏ธ Redis Queue Transport - Load Balancing Demo"
8
- puts "=" * 50
9
-
10
- #==============================================================================
11
- # Transport Configuration
12
- #==============================================================================
13
-
14
- # Create shared transport for load balancing examples
15
- shared_transport = SmartMessage::Transport::RedisQueueTransport.new(
16
- url: 'redis://localhost:6379',
17
- db: 4, # Use database 4 for load balancing examples
18
- queue_prefix: 'load_balance_demo',
19
- consumer_group: 'demo_workers',
20
- block_time: 500 # Fast response for demo
21
- )
22
-
23
- #==============================================================================
24
- # Work Message Classes
25
- #==============================================================================
26
-
27
- class ProcessingTask < SmartMessage::Base
28
- transport :redis_queue, {
29
- url: 'redis://localhost:6379',
30
- db: 4,
31
- queue_prefix: 'load_balance_demo'
32
- }
33
-
34
- property :task_id, required: true
35
- property :task_type, required: true
36
- property :complexity, default: 'medium' # low, medium, high
37
- property :estimated_seconds, default: 1
38
- property :payload, default: {}
39
-
40
- def process
41
- complexity_icon = case complexity
42
- when 'high' then '๐Ÿ”ฅ'
43
- when 'medium' then 'โšก'
44
- when 'low' then '๐Ÿƒ'
45
- else 'โš™๏ธ'
46
- end
47
-
48
- puts "#{complexity_icon} Processing #{task_id} [#{task_type}] - #{complexity} complexity (#{estimated_seconds}s)"
49
-
50
- # Simulate work
51
- sleep(estimated_seconds * 0.1) # Scale down for demo
52
-
53
- puts "โœ… Completed #{task_id} by worker #{Thread.current.object_id.to_s[-4..-1]}"
54
- end
55
- end
56
-
57
- class EmailTask < SmartMessage::Base
58
- transport :redis_queue, {
59
- url: 'redis://localhost:6379',
60
- db: 4,
61
- queue_prefix: 'load_balance_demo'
62
- }
63
-
64
- property :email_id, required: true
65
- property :recipient, required: true
66
- property :subject, required: true
67
- property :template, default: 'default'
68
- property :priority, default: 'normal'
69
-
70
- def process
71
- priority_icon = case priority
72
- when 'urgent' then '๐Ÿšจ'
73
- when 'high' then 'โ—'
74
- when 'normal' then '๐Ÿ“ง'
75
- when 'low' then '๐Ÿ“ฎ'
76
- else '๐Ÿ“ฌ'
77
- end
78
-
79
- worker_id = Thread.current.object_id.to_s[-4..-1]
80
- puts "#{priority_icon} Worker-#{worker_id}: Email #{email_id} โ†’ #{recipient}"
81
- puts " Subject: #{subject} [#{priority}]"
82
-
83
- # Simulate email sending
84
- sleep(rand(0.5..1.5))
85
-
86
- puts "๐Ÿ“ค Email #{email_id} sent by worker-#{worker_id}"
87
- end
88
- end
89
-
90
- class DataAnalysisTask < SmartMessage::Base
91
- transport :redis_queue, {
92
- url: 'redis://localhost:6379',
93
- db: 4,
94
- queue_prefix: 'load_balance_demo'
95
- }
96
-
97
- property :analysis_id, required: true
98
- property :dataset, required: true
99
- property :analysis_type, required: true
100
- property :rows, default: 1000
101
- property :columns, default: 10
102
-
103
- def process
104
- worker_id = Thread.current.object_id.to_s[-4..-1]
105
- puts "๐Ÿ“Š Worker-#{worker_id}: Analyzing #{dataset} [#{analysis_type}]"
106
- puts " Dataset: #{rows} rows ร— #{columns} columns"
107
-
108
- # Simulate analysis work
109
- sleep(rand(0.8..2.0))
110
-
111
- puts "๐ŸŽฏ Analysis #{analysis_id} completed by worker-#{worker_id}"
112
- end
113
- end
114
-
115
- #==============================================================================
116
- # Consumer Group Setup
117
- #==============================================================================
118
-
119
- puts "\n๐Ÿ‘ฅ Setting up consumer groups for load balancing:"
120
-
121
- # Group 1: General processing workers
122
- puts "1๏ธโƒฃ Setting up 'processing_workers' group (3 workers)"
123
- processing_workers = []
124
- 3.times do |i|
125
- worker_thread = Thread.new do
126
- worker_transport = SmartMessage::Transport::RedisQueueTransport.new(
127
- url: 'redis://localhost:6379',
128
- db: 4,
129
- queue_prefix: 'load_balance_demo',
130
- consumer_group: 'processing_workers',
131
- block_time: 1000
132
- )
133
-
134
- # Subscribe to processing tasks directed to worker pool
135
- worker_transport.where
136
- .to('worker_pool')
137
- .consumer_group('processing_workers')
138
- .subscribe do |message_class, message_data|
139
- data = JSON.parse(message_data)
140
- worker_id = Thread.current.object_id.to_s[-4..-1]
141
- puts "โš™๏ธ Worker-#{i+1}-#{worker_id} received: #{data['task_id'] || data['email_id'] || data['analysis_id']}"
142
- end
143
- end
144
- processing_workers << worker_thread
145
- end
146
-
147
- # Group 2: Email workers
148
- puts "2๏ธโƒฃ Setting up 'email_workers' group (2 workers)"
149
- email_workers = []
150
- 2.times do |i|
151
- worker_thread = Thread.new do
152
- worker_transport = SmartMessage::Transport::RedisQueueTransport.new(
153
- url: 'redis://localhost:6379',
154
- db: 4,
155
- queue_prefix: 'load_balance_demo',
156
- consumer_group: 'email_workers',
157
- block_time: 1000
158
- )
159
-
160
- # Subscribe to email tasks
161
- worker_transport.where
162
- .type('EmailTask')
163
- .consumer_group('email_workers')
164
- .subscribe do |message_class, message_data|
165
- data = JSON.parse(message_data)
166
- worker_id = Thread.current.object_id.to_s[-4..-1]
167
- puts "๐Ÿ“ง EmailWorker-#{i+1}-#{worker_id} received: #{data['email_id']}"
168
- end
169
- end
170
- email_workers << worker_thread
171
- end
172
-
173
- # Group 3: Analytics workers
174
- puts "3๏ธโƒฃ Setting up 'analytics_workers' group (4 workers)"
175
- analytics_workers = []
176
- 4.times do |i|
177
- worker_thread = Thread.new do
178
- worker_transport = SmartMessage::Transport::RedisQueueTransport.new(
179
- url: 'redis://localhost:6379',
180
- db: 4,
181
- queue_prefix: 'load_balance_demo',
182
- consumer_group: 'analytics_workers',
183
- block_time: 1000
184
- )
185
-
186
- # Subscribe to analytics tasks
187
- worker_transport.where
188
- .type('DataAnalysisTask')
189
- .consumer_group('analytics_workers')
190
- .subscribe do |message_class, message_data|
191
- data = JSON.parse(message_data)
192
- worker_id = Thread.current.object_id.to_s[-4..-1]
193
- puts "๐Ÿ“Š AnalyticsWorker-#{i+1}-#{worker_id} received: #{data['analysis_id']}"
194
- end
195
- end
196
- analytics_workers << worker_thread
197
- end
198
-
199
- # Give workers time to start
200
- sleep 2
201
-
202
- #==============================================================================
203
- # Load Balancing Demonstration
204
- #==============================================================================
205
-
206
- puts "\n๐Ÿ“ค Demonstrating load balancing with multiple workers:"
207
-
208
- # Test 1: Processing tasks distributed among 3 workers
209
- puts "\n๐Ÿ”ธ Test 1: General processing tasks (distributed among 3 workers)"
210
- 5.times do |i|
211
- ProcessingTask.new(
212
- task_id: "PROC-#{sprintf('%03d', i + 1)}",
213
- task_type: ['data_import', 'file_conversion', 'image_resize', 'pdf_generation', 'backup'][i],
214
- complexity: ['low', 'medium', 'high', 'medium', 'low'][i],
215
- estimated_seconds: [1, 2, 3, 2, 1][i],
216
- payload: { batch_size: rand(100..1000) },
217
- _sm_header: {
218
- from: 'task_scheduler',
219
- to: 'worker_pool'
220
- }
221
- ).publish
222
- end
223
-
224
- sleep 3
225
-
226
- # Test 2: Email tasks distributed among 2 workers
227
- puts "\n๐Ÿ”ธ Test 2: Email tasks (distributed among 2 workers)"
228
- 6.times do |i|
229
- EmailTask.new(
230
- email_id: "EMAIL-#{sprintf('%03d', i + 1)}",
231
- recipient: "user#{i + 1}@example.com",
232
- subject: [
233
- 'Welcome to our service!',
234
- 'Your order confirmation',
235
- 'Password reset request',
236
- 'Monthly newsletter',
237
- 'Account verification required',
238
- 'Special offer inside!'
239
- ][i],
240
- template: ['welcome', 'order', 'password_reset', 'newsletter', 'verification', 'promotion'][i],
241
- priority: ['normal', 'high', 'urgent', 'low', 'normal', 'high'][i],
242
- _sm_header: {
243
- from: 'email_service',
244
- to: 'email_queue'
245
- }
246
- ).publish
247
- end
248
-
249
- sleep 4
250
-
251
- # Test 3: Analytics tasks distributed among 4 workers
252
- puts "\n๐Ÿ”ธ Test 3: Analytics tasks (distributed among 4 workers)"
253
- 8.times do |i|
254
- DataAnalysisTask.new(
255
- analysis_id: "ANALYSIS-#{sprintf('%03d', i + 1)}",
256
- dataset: "dataset_#{i + 1}",
257
- analysis_type: ['regression', 'classification', 'clustering', 'time_series', 'correlation', 'anomaly_detection', 'forecasting', 'segmentation'][i],
258
- rows: rand(1000..10000),
259
- columns: rand(5..50),
260
- _sm_header: {
261
- from: 'analytics_service',
262
- to: 'analytics_queue'
263
- }
264
- ).publish
265
- end
266
-
267
- sleep 5
268
-
269
- #==============================================================================
270
- # High-Volume Load Test
271
- #==============================================================================
272
-
273
- puts "\n๐Ÿš€ High-volume load balancing test:"
274
-
275
- # Publish many tasks rapidly to see load distribution
276
- puts "Publishing 20 processing tasks rapidly..."
277
- start_time = Time.now
278
-
279
- 20.times do |i|
280
- ProcessingTask.new(
281
- task_id: "LOAD-#{sprintf('%03d', i + 1)}",
282
- task_type: 'load_test',
283
- complexity: ['low', 'medium', 'high'].sample,
284
- estimated_seconds: rand(1..3),
285
- _sm_header: {
286
- from: 'load_tester',
287
- to: 'worker_pool'
288
- }
289
- ).publish
290
- end
291
-
292
- end_time = Time.now
293
- puts "โœ… Published 20 tasks in #{(end_time - start_time).round(3)} seconds"
294
-
295
- # Wait for processing
296
- puts "\nโณ Waiting for load test completion..."
297
- sleep 8
298
-
299
- #==============================================================================
300
- # Priority-Based Load Balancing
301
- #==============================================================================
302
-
303
- puts "\nโญ Priority-based load balancing:"
304
-
305
- # Set up priority workers
306
- puts "Setting up high-priority worker group..."
307
- priority_transport = SmartMessage::Transport::RedisQueueTransport.new(
308
- url: 'redis://localhost:6379',
309
- db: 4,
310
- queue_prefix: 'load_balance_demo',
311
- consumer_group: 'priority_workers',
312
- block_time: 500
313
- )
314
-
315
- # Priority worker subscription
316
- priority_worker = Thread.new do
317
- priority_transport.where
318
- .to('priority_queue')
319
- .consumer_group('priority_workers')
320
- .subscribe do |message_class, message_data|
321
- data = JSON.parse(message_data)
322
- puts "๐ŸŒŸ PRIORITY Worker handling: #{data['task_id'] || data['email_id']}"
323
- end
324
- end
325
-
326
- sleep 1
327
-
328
- # Publish priority tasks
329
- puts "Publishing high-priority tasks..."
330
- 3.times do |i|
331
- ProcessingTask.new(
332
- task_id: "PRIORITY-#{sprintf('%03d', i + 1)}",
333
- task_type: 'critical_task',
334
- complexity: 'high',
335
- estimated_seconds: 1,
336
- _sm_header: {
337
- from: 'urgent_scheduler',
338
- to: 'priority_queue'
339
- }
340
- ).publish
341
- end
342
-
343
- # Publish priority emails
344
- 2.times do |i|
345
- EmailTask.new(
346
- email_id: "URGENT-EMAIL-#{sprintf('%03d', i + 1)}",
347
- recipient: "admin#{i + 1}@company.com",
348
- subject: 'URGENT: System Alert',
349
- priority: 'urgent',
350
- _sm_header: {
351
- from: 'alert_system',
352
- to: 'priority_queue'
353
- }
354
- ).publish
355
- end
356
-
357
- sleep 3
358
-
359
- #==============================================================================
360
- # Load Balancing Statistics
361
- #==============================================================================
362
-
363
- puts "\n๐Ÿ“Š Load Balancing Statistics:"
364
-
365
- # Show queue statistics
366
- stats = shared_transport.queue_stats
367
- puts "\nQueue lengths after load balancing:"
368
- total_queued = 0
369
- stats.each do |queue_name, info|
370
- total_queued += info[:length]
371
- puts " #{queue_name}: #{info[:length]} messages (#{info[:consumers]} consumers)"
372
- end
373
-
374
- puts "\nTotal messages remaining in queues: #{total_queued}"
375
-
376
- # Show routing table for consumer groups
377
- routing_table = shared_transport.routing_table
378
- puts "\nActive consumer group patterns:"
379
- routing_table.each do |pattern, queues|
380
- puts " Pattern: '#{pattern}'"
381
- puts " Queues: #{queues.join(', ')}"
382
- end
383
-
384
- #==============================================================================
385
- # Worker Performance Comparison
386
- #==============================================================================
387
-
388
- puts "\nโšก Worker Performance Demonstration:"
389
-
390
- # Create workers with different processing speeds
391
- puts "Creating workers with different performance characteristics..."
392
-
393
- # Fast worker
394
- fast_worker_transport = SmartMessage::Transport::RedisQueueTransport.new(
395
- url: 'redis://localhost:6379',
396
- db: 4,
397
- queue_prefix: 'load_balance_demo',
398
- consumer_group: 'performance_test_workers'
399
- )
400
-
401
- fast_worker = Thread.new do
402
- fast_worker_transport.where
403
- .to('performance_test')
404
- .consumer_group('performance_test_workers')
405
- .subscribe do |message_class, message_data|
406
- data = JSON.parse(message_data)
407
- puts "๐Ÿš€ FAST Worker: #{data['task_id']} (processed quickly)"
408
- sleep(0.1) # Fast processing
409
- end
410
- end
411
-
412
- # Slow worker
413
- slow_worker_transport = SmartMessage::Transport::RedisQueueTransport.new(
414
- url: 'redis://localhost:6379',
415
- db: 4,
416
- queue_prefix: 'load_balance_demo',
417
- consumer_group: 'performance_test_workers'
418
- )
419
-
420
- slow_worker = Thread.new do
421
- slow_worker_transport.where
422
- .to('performance_test')
423
- .consumer_group('performance_test_workers')
424
- .subscribe do |message_class, message_data|
425
- data = JSON.parse(message_data)
426
- puts "๐ŸŒ SLOW Worker: #{data['task_id']} (processing slowly...)"
427
- sleep(2.0) # Slow processing
428
- end
429
- end
430
-
431
- sleep 1
432
-
433
- # Send tasks to both workers
434
- puts "Sending 10 tasks to mixed-speed worker group..."
435
- 10.times do |i|
436
- ProcessingTask.new(
437
- task_id: "PERF-#{sprintf('%03d', i + 1)}",
438
- task_type: 'performance_test',
439
- complexity: 'medium',
440
- _sm_header: {
441
- from: 'performance_tester',
442
- to: 'performance_test'
443
- }
444
- ).publish
445
- end
446
-
447
- puts "โณ Observing how Redis Queue balances load between fast and slow workers..."
448
- sleep 8
449
-
450
- #==============================================================================
451
- # Cleanup
452
- #==============================================================================
453
-
454
- puts "\n๐Ÿงน Cleaning up workers and connections..."
455
-
456
- # Stop all worker threads
457
- [processing_workers, email_workers, analytics_workers, priority_worker, fast_worker, slow_worker].flatten.each do |thread|
458
- thread.kill if thread.alive?
459
- end
460
-
461
- # Disconnect transports
462
- shared_transport.disconnect
463
- priority_transport.disconnect
464
- fast_worker_transport.disconnect
465
- slow_worker_transport.disconnect
466
-
467
- puts "\nโš–๏ธ Load balancing demonstration completed!"
468
-
469
- puts "\n๐Ÿ’ก Load Balancing Features Demonstrated:"
470
- puts " โœ“ Consumer groups for work distribution"
471
- puts " โœ“ Multiple workers sharing same queue"
472
- puts " โœ“ Round-robin task distribution"
473
- puts " โœ“ Different worker group configurations"
474
- puts " โœ“ High-volume load testing"
475
- puts " โœ“ Priority-based routing"
476
- puts " โœ“ Mixed-performance worker handling"
477
- puts " โœ“ Real-time queue monitoring"
478
-
479
- puts "\n๐Ÿš€ Key Benefits:"
480
- puts " โ€ข Automatic load distribution via Redis BRPOP"
481
- puts " โ€ข Scalable worker pool management"
482
- puts " โ€ข Fair work distribution among workers"
483
- puts " โ€ข Consumer group isolation"
484
- puts " โ€ข High-throughput task processing"
485
- puts " โ€ข Fault-tolerant worker coordination"
486
- puts " โ€ข Zero-configuration load balancing"