Architecture Overview - Lumina-Enterprise-Solutions/prism-notification-service GitHub Wiki
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.
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
-
Penerimaan Job (Enqueue):
- Layanan lain (misalnya,
auth-service
saat ada pendaftaran baru) mengirimkan permintaanPOST
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.
- Layanan lain (misalnya,
-
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.
- Sebuah
-
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.
-
-
WebSocket: Worker pertama-tama memeriksa
-
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.
- Klien frontend yang sudah login (memiliki JWT) dapat membuka koneksi WebSocket ke endpoint