Skip to content

Notification Service

Overview

The Notification Service is responsible for sending alerts, reminders, and messages to patients, healthcare providers, and pharmacies across multiple channels (SMS, Email, Push Notifications).

Service Information

PropertyValue
Service Namenotification-service
Namespaceapp-stack
Port8080
ProtocolHTTP/REST
Health Check/health
Metrics/metrics (Prometheus)

Architecture

Key Features

Multi-Channel Support

  • SMS: Via local Egyptian providers (Vodafone, Etisalat) or Twilio
  • Email: SMTP with template support
  • Push Notifications: iOS (APNS) and Android (FCM)
  • WhatsApp: WhatsApp Business API for rich messaging

Message Types

1. Patient Notifications

  • ✅ Prescription ready for pickup
  • ✅ Medication refill reminders
  • ✅ Appointment reminders
  • ✅ Drug recall alerts
  • ✅ Insurance coverage updates

2. Provider Notifications

  • ✅ High-risk drug interaction alerts (URGENT)
  • ✅ Patient allergy warnings
  • ✅ Prescription status updates
  • ✅ Regulatory compliance alerts

3. Pharmacy Notifications

  • ✅ New prescription available
  • ✅ Stock alerts (low inventory)
  • ✅ Insurance authorization approved/rejected
  • ✅ Patient waiting for medication

4. Administrative Notifications

  • ✅ System health alerts
  • ✅ Audit trail reports
  • ✅ Compliance reports
  • ✅ Public health announcements

API Endpoints

Send Notification

http
POST /api/v1/notifications
Content-Type: application/json
Authorization: Bearer <token>

{
  "type": "sms",
  "recipient": "+201234567890",
  "template": "prescription_ready",
  "variables": {
    "patientName": "أحمد محمد",
    "pharmacyName": "صيدلية النور",
    "prescriptionId": "RX-2024-001234"
  },
  "priority": "normal",
  "metadata": {
    "prescriptionId": "RX-2024-001234",
    "source": "prescription-service"
  }
}

Response:

json
{
  "notificationId": "not-uuid-here",
  "status": "queued",
  "estimatedDelivery": "2024-01-15T10:30:00Z",
  "queuePosition": 5
}

Get Notification Status

http
GET /api/v1/notifications/{notificationId}
Authorization: Bearer <token>

Response:

json
{
  "notificationId": "not-uuid-here",
  "type": "sms",
  "status": "delivered",
  "sentAt": "2024-01-15T10:30:45Z",
  "deliveredAt": "2024-01-15T10:30:47Z",
  "recipient": "+201234567890",
  "provider": "vodafone-egypt",
  "cost": 0.05,
  "metadata": {
    "prescriptionId": "RX-2024-001234"
  }
}

Get Notification History

http
GET /api/v1/notifications/history?userId=patient-123&limit=50
Authorization: Bearer <token>

Message Templates

Templates support multiple languages (Arabic, English) with RTL support.

Template: Prescription Ready (SMS)

Arabic:

مرحبا {{patientName}}،
روشتتك رقم {{prescriptionId}} جاهزة للصرف من {{pharmacyName}}.
الرجاء إحضار بطاقة الهوية والتأمين.

English:

Hello {{patientName}},
Your prescription {{prescriptionId}} is ready for pickup at {{pharmacyName}}.
Please bring your ID and insurance card.

Template: Drug Interaction Alert (Email)

html
<div dir="rtl">
  <h2 style="color: #d32f2f;">⚠️ تنبيه تفاعل دوائي خطير</h2>
  <p>دكتور {{doctorName}}،</p>
  <p>تم اكتشاف تفاعل دوائي محتمل الخطورة:</p>
  <ul>
    <li><strong>الدواء الأول:</strong> {{drug1}}</li>
    <li><strong>الدواء الثاني:</strong> {{drug2}}</li>
    <li><strong>مستوى الخطورة:</strong> {{severity}}</li>
  </ul>
  <p><strong>التوصية:</strong> {{recommendation}}</p>
  <p>الرجاء مراجعة الروشتة رقم: {{prescriptionId}}</p>
</div>

Message Queue System

Uses Redis for high-performance queueing with priority lanes:

Rate Limiting & Cost Control

Per-Channel Limits

ChannelRate LimitCost per MessageDaily Budget
SMS100/sec1.50 EGP150,000 EGP
Email1000/sec0.03 EGP15,000 EGP
Push10,000/secFreeN/A
WhatsApp50/sec0.60 EGP60,000 EGP

Provider Failover

Environment Variables

bash
# Service Configuration
NOTIFICATION_SERVICE_PORT=8080
NOTIFICATION_LOG_LEVEL=info

# Redis Configuration
REDIS_HOST=redis.data-stack.svc.cluster.local
REDIS_PORT=6379
REDIS_PASSWORD=${REDIS_PASSWORD} # from Vault

# PostgreSQL
DB_HOST=postgresql.data-stack.svc.cluster.local
DB_PORT=5432
DB_NAME=notification_db
DB_USER=notification_service
DB_PASSWORD=${DB_PASSWORD} # from Vault

# SMS Providers
SMS_PRIMARY_PROVIDER=vodafone-egypt
SMS_VODAFONE_API_KEY=${SMS_VODAFONE_API_KEY} # from Vault
SMS_VODAFONE_SENDER_ID=HealthFlow

SMS_SECONDARY_PROVIDER=etisalat-egypt
SMS_ETISALAT_API_KEY=${SMS_ETISALAT_API_KEY} # from Vault

# Email Configuration
EMAIL_SMTP_HOST=smtp.gmail.com
EMAIL_SMTP_PORT=587
EMAIL_FROM=noreply@healthflow.eg
EMAIL_USERNAME=${EMAIL_USERNAME} # from Vault
EMAIL_PASSWORD=${EMAIL_PASSWORD} # from Vault

# Push Notifications
FCM_SERVER_KEY=${FCM_SERVER_KEY} # from Vault
APNS_CERT_PATH=/secrets/apns-cert.p12
APNS_CERT_PASSWORD=${APNS_CERT_PASSWORD} # from Vault

# WhatsApp Business API
WHATSAPP_BUSINESS_ID=${WHATSAPP_BUSINESS_ID}
WHATSAPP_API_KEY=${WHATSAPP_API_KEY} # from Vault
WHATSAPP_PHONE_NUMBER=+201234567890

# Rate Limiting
RATE_LIMIT_SMS_PER_SECOND=100
RATE_LIMIT_EMAIL_PER_SECOND=1000
RATE_LIMIT_PUSH_PER_SECOND=10000

# Cost Controls
DAILY_BUDGET_SMS=5000
DAILY_BUDGET_EMAIL=500
DAILY_BUDGET_WHATSAPP=2000

# Service Discovery
CONSUL_ADDRESS=consul.discovery-stack.svc.cluster.local:8500
CONSUL_SERVICE_NAME=notification-service
CONSUL_HEALTH_CHECK_INTERVAL=10s

Kubernetes Deployment

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: notification-service
  namespace: app-stack
spec:
  replicas: 3
  selector:
    matchLabels:
      app: notification-service
  template:
    metadata:
      labels:
        app: notification-service
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "8080"
        prometheus.io/path: "/metrics"
    spec:
      serviceAccountName: notification-service
      containers:
      - name: notification-service
        image: healthflow/notification-service:v1.2.0
        ports:
        - containerPort: 8080
          name: http
        env:
        - name: NOTIFICATION_SERVICE_PORT
          value: "8080"
        - name: REDIS_HOST
          value: redis.data-stack.svc.cluster.local
        - name: DB_HOST
          value: postgresql.data-stack.svc.cluster.local
        envFrom:
        - secretRef:
            name: notification-secrets
        volumeMounts:
        - name: apns-cert
          mountPath: /secrets
          readOnly: true
        resources:
          limits:
            cpu: "1"
            memory: 1Gi
          requests:
            cpu: "500m"
            memory: 512Mi
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /ready
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 5
      volumes:
      - name: apns-cert
        secret:
          secretName: apns-certificate

Dependencies

Internal Services

  • Redis - Message queue and caching
  • PostgreSQL - Notification history and templates
  • Consul - Service discovery
  • Vault - Secrets management

External Services

  • Vodafone Egypt API - Primary SMS provider
  • Etisalat Egypt API - Secondary SMS provider
  • SendGrid / Local SMTP - Email delivery
  • Firebase Cloud Messaging - Android push notifications
  • Apple Push Notification Service - iOS push notifications
  • WhatsApp Business API - WhatsApp messaging

Monitoring & Metrics

Key Metrics

promql
# Notification throughput
rate(notifications_sent_total[5m])

# Delivery success rate
rate(notifications_delivered_total[5m]) / rate(notifications_sent_total[5m])

# Average delivery time
histogram_quantile(0.95, rate(notification_delivery_duration_seconds_bucket[5m]))

# Queue depth by priority
notification_queue_depth{priority="critical"}

# Daily cost by channel
sum(increase(notification_cost_total[24h])) by (channel)

Alerts

yaml
groups:
  - name: notification_alerts
    rules:
      - alert: HighNotificationFailureRate
        expr: rate(notifications_failed_total[5m]) > 0.1
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "High notification failure rate"
          description: "{{ $value }}% of notifications are failing"

      - alert: SMSBudgetExceeded
        expr: sum(increase(notification_cost_total{channel="sms"}[24h])) > 5000
        labels:
          severity: critical
        annotations:
          summary: "Daily SMS budget exceeded"

      - alert: NotificationQueueBacklog
        expr: notification_queue_depth > 10000
        for: 10m
        labels:
          severity: warning
        annotations:
          summary: "Notification queue has significant backlog"

Security

Authentication

  • API Key - For service-to-service communication
  • JWT - For user-facing endpoints
  • mTLS - For external provider connections

Data Protection

  • All PII (phone numbers, emails) encrypted at rest
  • Notification content encrypted in transit
  • Message history retention: 90 days
  • Auto-purge of sensitive data after delivery

Compliance

  • GDPR-compliant opt-out management
  • Egypt Data Protection Law compliance
  • Audit logging of all notifications
  • Consent tracking for marketing messages

Troubleshooting

Issue: SMS Not Being Delivered

bash
# Check service status
kubectl logs -n app-stack deployment/notification-service

# Check Redis queue
kubectl exec -n data-stack redis-0 -- redis-cli LLEN notification:queue:high

# Check provider status
curl -H "Authorization: Bearer <token>" \
  https://api.healthflow.eg/notification/v1/providers/status

Issue: High Delivery Latency

bash
# Check worker count
kubectl get pods -n app-stack -l app=notification-service

# Check queue depth
kubectl exec -n data-stack redis-0 -- redis-cli INFO

# Scale up workers
kubectl scale deployment notification-service --replicas=6 -n app-stack

Best Practices

  1. Always set priority correctly

    • Critical: Drug interaction alerts
    • High: Prescription ready
    • Normal: Refill reminders
    • Low: Marketing/surveys
  2. Use templates for consistency

    • Maintain bilingual templates (Arabic/English)
    • Test RTL rendering
    • Include unsubscribe links
  3. Implement retry logic

    • Max 3 retries with exponential backoff
    • Fallback to alternative channels if primary fails
  4. Monitor costs

    • Track daily spend per channel
    • Set budget alerts
    • Optimize message content to reduce SMS segments

Next Steps