Architecture Overview - Lumina-Enterprise-Solutions/prism-notification-service GitHub Wiki

🏗️ Architecture Overview

prism-notification-service menggunakan arsitektur asinkron berbasis antrian (queue) untuk memastikan performa tinggi dan keandalan. Permintaan notifikasi tidak langsung diproses, melainkan dimasukkan ke dalam antrian untuk dikerjakan oleh worker di background.

Diagram Arsitektur

graph TD
    %% Styling definitions
    classDef external fill:#e1f5fe,stroke:#0277bd,stroke-width:2px,color:#000
    classDef api fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px,color:#000
    classDef queue fill:#ffebee,stroke:#d32f2f,stroke-width:2px,color:#000
    classDef worker fill:#e8f5e8,stroke:#388e3c,stroke-width:2px,color:#000
    classDef realtime fill:#fff3e0,stroke:#f57c00,stroke-width:2px,color:#000
    classDef email fill:#fce4ec,stroke:#c2185b,stroke-width:2px,color:#000
    classDef websocket fill:#f1f8e9,stroke:#689f38,stroke-width:2px,color:#000
    classDef vault fill:#f9fbe7,stroke:#827717,stroke-width:2px,color:#000
    classDef smtp fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px,color:#000

    %% External Services
    ServiceLain["🔗 Service Lain<br/>(e.g., Auth, User)<br/>• HTTP client<br/>• Async notifications<br/>• Event triggers"]
    
    %% Main flow
    ServiceLain -- "📤 HTTP POST<br/>Notification request<br/>JSON payload" --> NotifAPI
    
    subgraph NOTIF ["📢 prism-notification-service"]
        direction TB
        
        %% API Endpoint
        NotifAPI["🌐 API: /notifications/send<br/>• Request validation<br/>• Authentication check<br/>• Queue job creation<br/>• Response handling"]
        
        %% Queue System
        RedisQueue["📦 Redis Queue<br/>• Job persistence<br/>• FIFO processing<br/>• Retry mechanism<br/>• Dead letter queue"]
        
        %% Worker System
        Worker["⚡ Worker Goroutine<br/>• Background processing<br/>• Concurrent execution<br/>• Error handling<br/>• Job completion tracking"]
        
        %% Real-time Communication
        WebSocketHub["🔄 WebSocket Hub<br/>• Connection management<br/>• Message broadcasting<br/>• Client tracking<br/>• Room/channel support"]
        
        %% Email System
        EmailService["📧 Email Service<br/>• Template rendering<br/>• SMTP connection<br/>• Delivery tracking<br/>• Bounce handling"]
        
        %% WebSocket API
        WebSocketAPI["🔌 API: /ws<br/>• WebSocket upgrade<br/>• Connection handling<br/>• Message routing<br/>• Heartbeat monitoring"]
        
        %% Frontend Connection
        Frontend["💻 Frontend Client<br/>• Real-time updates<br/>• Connection management<br/>• Message handling<br/>• Reconnection logic"]
        
        %% Internal Flow
        NotifAPI -- "📋 Enqueue Job<br/>LPUSH operation<br/>Job metadata" --> RedisQueue
        Worker -- "📥 Dequeue Job<br/>BRPOP operation<br/>Blocking wait" --> RedisQueue
        Worker -- "⚡ Send Real-time<br/>WebSocket message<br/>Instant delivery" --> WebSocketHub
        Worker -- "📮 Send Email<br/>SMTP delivery<br/>Template processing" --> EmailService
        Frontend <--> |"🔄 WebSocket Connection<br/>Bidirectional<br/>Real-time messages"| WebSocketAPI
        WebSocketAPI <--> WebSocketHub
    end

    subgraph DEPS ["🔧 Dependencies"]
        direction TB
        SMTPServer["📬 SMTP Server<br/>(e.g., Mailtrap)<br/>• Email delivery<br/>• Testing environment<br/>• Delivery reports"]
        VaultService["🔐 HashiCorp Vault<br/>• Secret management<br/>• Configuration storage<br/>• Secure access"]
    end

    %% External Dependencies
    EmailService -- "📨 SMTP Protocol<br/>Email transmission<br/>Delivery confirmation" --> SMTPServer
    NotifAPI -- "🔑 Read JWT Secret<br/>Token validation<br/>Authentication" --> VaultService
    EmailService -- "📋 Read SMTP Credentials<br/>Server configuration<br/>Authentication tokens" --> VaultService

    %% Apply styles
    class ServiceLain external
    class NotifAPI api
    class RedisQueue queue
    class Worker worker
    class WebSocketHub realtime
    class EmailService email
    class WebSocketAPI websocket
    class Frontend external
    class VaultService vault
    class SMTPServer smtp
Loading

Penjelasan Alur Kerja

  1. Penerimaan Job (Enqueue):

    • Layanan lain (misalnya, auth-service saat ada pendaftaran baru) mengirimkan permintaan POST ke endpoint /notifications/send.
    • Handler API hanya melakukan validasi dasar pada request body dan langsung membuat NotificationJob.
    • Job ini di-serialisasi ke JSON dan dimasukkan (LPUSH) ke dalam antrian di Redis.
    • Handler segera merespons dengan 202 Accepted, memberitahu klien bahwa permintaan telah diterima tetapi belum diproses. Ini membuat layanan pengirim tidak perlu menunggu proses pengiriman notifikasi selesai.
  2. Pemrosesan oleh Worker (Dequeue):

    • Sebuah worker goroutine berjalan di background secara terus-menerus.
    • Worker ini melakukan operasi BRPop (blocking pop) pada antrian Redis. Ia akan menunggu hingga ada job baru yang masuk.
    • Saat sebuah job diterima, worker akan memprosesnya.
  3. Pengiriman Multi-Channel:

    • WebSocket: Worker pertama-tama memeriksa WebSocket Hub untuk melihat apakah pengguna tujuan sedang online. Jika ya, notifikasi akan dikirim secara real-time.
    • Email: Selanjutnya, worker memanggil EmailService untuk mengirim email.
      • EmailService memuat template HTML dari direktori /templates, mengisi data dinamis dari job, dan mengirimkannya melalui server SMTP yang konfigurasinya diambil dari Vault.
      • Mekanisme Retry & DLQ: Jika pengiriman email gagal, worker akan mencoba lagi beberapa kali dengan jeda waktu. Jika semua percobaan gagal, job akan dipindahkan ke Dead-Letter Queue (DLQ) di Redis untuk dianalisis secara manual.
  4. Koneksi Real-time:

    • Klien frontend yang sudah login (memiliki JWT) dapat membuka koneksi WebSocket ke endpoint /ws.
    • Endpoint ini akan memvalidasi JWT dan mendaftarkan koneksi klien ke WebSocket Hub berdasarkan User ID.
    • Hub bertugas melacak semua klien yang terhubung dan menyiarkan pesan kepada mereka.

Kembali ke Halaman Utama

⚠️ **GitHub.com Fallback** ⚠️