nats_wave 1.1.5 → 1.1.7
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 +4 -4
- data/.idea/nats_wave.iml +5 -5
- data/Gemfile.lock +1 -1
- data/README.md +1153 -401
- data/lib/generators/nats_wave/templates/initializer.rb +76 -19
- data/lib/nats_wave/adapters/datadog_metrics.rb +1 -1
- data/lib/nats_wave/client.rb +637 -28
- data/lib/nats_wave/concerns/mappable.rb +9 -3
- data/lib/nats_wave/configuration.rb +2 -2
- data/lib/nats_wave/dead_letter_queue.rb +4 -4
- data/lib/nats_wave/model_mapper.rb +1 -1
- data/lib/nats_wave/model_registry.rb +39 -15
- data/lib/nats_wave/publisher.rb +50 -47
- data/lib/nats_wave/subscriber.rb +118 -20
- data/lib/nats_wave/version.rb +1 -1
- metadata +2 -2
@@ -4,53 +4,110 @@ begin
|
|
4
4
|
Rails.logger.info "Initializing NATS Wave with URL: #{ENV['NATS_URL']}"
|
5
5
|
|
6
6
|
NatsWave.configure do |config|
|
7
|
+
# === CORE CONNECTION SETTINGS ===
|
7
8
|
config.nats_url = ENV.fetch('NATS_URL', 'nats://localhost:4222')
|
8
9
|
config.service_name = ENV.fetch('NATS_SERVICE_NAME',
|
9
|
-
|
10
|
+
Rails.application.class.name.deconstantize.underscore)
|
10
11
|
config.connection_pool_size = 10
|
11
12
|
config.reconnect_attempts = 3
|
12
13
|
|
13
14
|
Rails.logger.info "NATS URL: #{config.nats_url}"
|
14
15
|
Rails.logger.info "Service Name: #{config.service_name}"
|
15
16
|
|
16
|
-
#
|
17
|
-
config.publishing_enabled = !Rails.env.test?
|
18
|
-
config.async_publishing = Rails.env.production?
|
19
|
-
config.default_subject_prefix = config.service_name
|
17
|
+
# === PUBLISHING CONFIGURATION ===
|
18
|
+
config.publishing_enabled = !Rails.env.test? # Disable in test environment
|
19
|
+
config.async_publishing = Rails.env.production? # Async only in production
|
20
|
+
config.default_subject_prefix = config.service_name # Use service name as prefix
|
20
21
|
|
21
|
-
#
|
22
|
-
config.subscription_enabled = !Rails.env.test?
|
23
|
-
config.queue_group = "#{config.service_name}_consumers"
|
22
|
+
# === SUBSCRIPTION CONFIGURATION ===
|
23
|
+
config.subscription_enabled = !Rails.env.test? # Disable in test environment
|
24
|
+
config.queue_group = "#{config.service_name}_consumers" # Queue group for load balancing
|
24
25
|
|
25
|
-
#
|
26
|
-
config.max_retries = 3
|
27
|
-
config.retry_delay = 5
|
28
|
-
config.dead_letter_queue = "failed_messages"
|
26
|
+
# === ERROR HANDLING ===
|
27
|
+
config.max_retries = 3 # Max retry attempts
|
28
|
+
config.retry_delay = 5 # Base retry delay in seconds
|
29
|
+
config.dead_letter_queue = "failed_messages" # Failed message storage
|
29
30
|
|
30
|
-
#
|
31
|
-
|
32
|
-
|
31
|
+
# === AUTHENTICATION (Optional) ===
|
32
|
+
if ENV['NATS_AUTH_SECRET'].present?
|
33
|
+
config.middleware_authentication_enabled = true
|
34
|
+
config.auth_secret_key = ENV['NATS_AUTH_SECRET']
|
35
|
+
end
|
36
|
+
|
37
|
+
# === VALIDATION (Optional) ===
|
38
|
+
if ENV['SCHEMA_REGISTRY_URL'].present?
|
39
|
+
config.middleware_validation_enabled = true
|
40
|
+
config.schema_registry_url = ENV['SCHEMA_REGISTRY_URL']
|
41
|
+
end
|
33
42
|
|
34
|
-
#
|
35
|
-
|
36
|
-
|
43
|
+
# === LOGGING ===
|
44
|
+
config.middleware_logging_enabled = true
|
45
|
+
config.log_level = Rails.env.production? ? 'info' : 'debug'
|
37
46
|
end
|
38
47
|
|
39
48
|
Rails.logger.info "NATS Wave configuration completed successfully"
|
40
49
|
rescue => e
|
41
50
|
Rails.logger.error "Failed to configure NATS Wave: #{e.message}"
|
42
51
|
Rails.logger.error e.backtrace.join("\n")
|
52
|
+
|
53
|
+
# Optional: Re-raise in development to catch configuration issues early
|
54
|
+
raise e if Rails.env.development?
|
43
55
|
end
|
44
56
|
|
57
|
+
# === AUTOMATIC SUBSCRIBER STARTUP ===
|
45
58
|
Rails.application.config.after_initialize do
|
46
59
|
Thread.new do
|
47
|
-
sleep 2 # Give Rails time to boot
|
60
|
+
sleep 2 # Give Rails time to boot and load all models
|
48
61
|
begin
|
62
|
+
# Start subscriber - this will automatically process all registered model subscriptions
|
49
63
|
NatsWave.start_subscriber
|
50
64
|
Rails.logger.info "✅ NatsWave subscriber started successfully"
|
65
|
+
|
66
|
+
# Optional: Log subscription statistics
|
67
|
+
stats = NatsWave::ModelRegistry.subscription_stats
|
68
|
+
Rails.logger.info "📊 Active subscriptions: #{stats[:total_subscriptions]} across #{stats[:models_with_subscriptions]} models"
|
69
|
+
|
51
70
|
rescue StandardError => e
|
52
71
|
Rails.logger.error "Failed to start NatsWave subscriber: #{e.message}"
|
53
72
|
Rails.logger.error e.backtrace.join("\n")
|
73
|
+
|
74
|
+
# Optional: Alert monitoring systems
|
75
|
+
if defined?(Sentry)
|
76
|
+
Sentry.capture_exception(e, tags: { component: 'nats_wave_startup' })
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
# === DATADOG METRICS INTEGRATION (Optional) ===
|
83
|
+
if defined?(Datadog::Statsd) && !Rails.env.test?
|
84
|
+
# Get application version safely
|
85
|
+
app_version = begin
|
86
|
+
Rails.application.config.version
|
87
|
+
rescue
|
88
|
+
'unknown'
|
89
|
+
end
|
90
|
+
|
91
|
+
NatsWave::Metrics.configure_datadog(
|
92
|
+
namespace: "#{Rails.application.class.name.deconstantize.underscore}.nats_wave",
|
93
|
+
tags: {
|
94
|
+
service: NatsWave.configuration.service_name,
|
95
|
+
environment: Rails.env,
|
96
|
+
version: app_version
|
97
|
+
}
|
98
|
+
)
|
99
|
+
Rails.logger.info "📈 Datadog metrics integration enabled"
|
100
|
+
end
|
101
|
+
|
102
|
+
# === GRACEFUL SHUTDOWN (Optional) ===
|
103
|
+
at_exit do
|
104
|
+
begin
|
105
|
+
if defined?(NatsWave) && NatsWave.client
|
106
|
+
Rails.logger.info "🛑 Shutting down NatsWave connections..."
|
107
|
+
NatsWave.client.disconnect!
|
108
|
+
Rails.logger.info "✅ NatsWave shutdown complete"
|
54
109
|
end
|
110
|
+
rescue => e
|
111
|
+
Rails.logger.error "Error during NatsWave shutdown: #{e.message}"
|
55
112
|
end
|
56
113
|
end
|