Create dedicated queue for time-sensitive notifications
## Problem
Currently, notification jobs are scattered across multiple queues with varying priorities:
**Existing notification queues**:
- `monthly_notification` (weight 2): Monthly seat usage digests
- `mailers` (weight 2): General email delivery
- Various queues contain notification jobs mixed with other operations
**Issues with current setup**:
1. Time-sensitive notifications (trial expiration, payment failures) compete with scheduled digests
2. No clear distinction between urgent vs. routine notifications
3. Difficult to monitor and optimize notification delivery separately
**Examples of time-sensitive notifications**:
- Trial expiration warnings (should be immediate)
- Payment failure alerts (revenue-impacting)
- License delivery notifications (customer-blocking)
- Reconciliation alerts (time-bound)
## Proposal
Create a dedicated high-priority queue for urgent, time-sensitive notifications.
### New Queue Structure
**`notifications_urgent` (weight 7-8)**
Purpose: Time-sensitive, customer-impacting notifications that should be delivered immediately
Jobs to move here:
- License delivery notifications (from `gitlab` queue)
- Trial expiration warnings (from `expiration` queue)
- Payment failure alerts
- Reconciliation deadline notifications
- Any notification where delay impacts customer experience
**Keep `monthly_notification` (weight 3)**
Purpose: Scheduled digest emails that can tolerate some delay
Jobs that stay here:
- `SeatsUsageMonthlyNotificationJob`
- Monthly usage reports
- Periodic summary emails
**Keep `mailers` (weight 3)**
Purpose: General transactional emails
Jobs that stay here:
- Order confirmations
- Account updates
- General customer communications
### Benefits
1. **Better customer experience**: Urgent notifications delivered promptly
2. **Clear prioritization**: Explicit distinction between urgent and routine
3. **Improved monitoring**: Can track urgent notification delivery separately
4. **Reduced risk**: Payment and expiration alerts won't be delayed by digest emails
## Implementation Steps
1. **Identify all notification jobs**:
- Audit codebase for mailer jobs
- Categorize by urgency and customer impact
- Document current queue assignments
2. **Create new queue**:
```ruby
# app/jobs/notifications/urgent_base_job.rb
module Notifications
class UrgentBaseJob < ApplicationJob
queue_as :notifications_urgent
# Common configuration for urgent notifications
end
end
```
3. **Update job classes**:
```ruby
# Example: License notification
class LicenseNotificationJob < Notifications::UrgentBaseJob
def perform(subscription_id)
# Send license email
end
end
```
4. **Update `config/sidekiq.yml`**:
```yaml
:queues:
# ... other queues ...
- [notifications_urgent, 8]
# ... other queues ...
- [monthly_notification, 3]
- [mailers, 3]
```
5. **Add monitoring**:
- Alert on queue depth for `notifications_urgent`
- Track delivery latency for urgent notifications
- Monitor failure rates
6. **Document guidelines**:
- When to use `notifications_urgent` vs. `mailers`
- SLA expectations for each notification queue
- Examples of urgent vs. routine notifications
## Examples of Queue Assignment
**Use `notifications_urgent`**:
- ✅ Trial expires in 24 hours
- ✅ Payment method failed
- ✅ License ready for download
- ✅ Reconciliation due in 7 days
- ✅ Subscription cancelled (immediate impact)
**Use `monthly_notification`**:
- ✅ Monthly seat usage digest
- ✅ Quarterly usage summary
- ✅ Monthly invoice available
**Use `mailers`**:
- ✅ Order confirmation
- ✅ Account settings changed
- ✅ Password reset
- ✅ General announcements
## Success Criteria
- All time-sensitive notifications identified and moved to new queue
- Urgent notifications delivered within 1 minute of enqueue (P95)
- No customer complaints about delayed critical notifications
- Clear documentation for future notification jobs
## Related
- Parent epic: gitlab-org&19587
- Related: #14270 (user-facing operations)
issue