Skip to content

Latest commit

 

History

History
124 lines (105 loc) · 5.35 KB

File metadata and controls

124 lines (105 loc) · 5.35 KB

Pipeline Parallele del Mailculator Processor

Panoramica

Il sistema esegue otto pipeline parallele che elaborano gli email attraverso diversi stati del ciclo di vita, utilizzando MySQL come storage e un client SMTP per l'invio diretto.

Stati degli Email

  • ACCEPTED: Email accettato, in attesa di intake
  • INTAKING: Email in fase di elaborazione intake
  • READY: Email pronto per l'invio
  • PROCESSING: Email in fase di elaborazione per l'invio
  • SENT: Email inviato con successo
  • FAILED: Invio email fallito
  • INVALID: Intake email fallito
  • CALLING-SENT-CALLBACK: In corso chiamata callback per email inviato
  • CALLING-FAILED-CALLBACK: In corso chiamata callback per email fallito
  • SENT-ACKNOWLEDGED: Callback per email inviato completato
  • FAILED-ACKNOWLEDGED: Callback per email fallito completato

Pipeline 1: IntakePipeline (Intake Email)

Questa pipeline elabora gli email dallo stato ACCEPTED.

  1. Query: Recupera fino a 25 email con stato "ACCEPTED"
  2. Elaborazione parallela: Per ogni email trovato:
    • Aggiorna lo stato a "INTAKING" (lock di elaborazione)
    • Legge il file JSON dal percorso specificato in PayloadFilePath
    • Valida il payload JSON (verifica campi richiesti e formati)
    • In caso di successo: aggiorna stato a "READY"
    • In caso di fallimento: aggiorna stato a "INVALID" con motivo errore
  3. Ciclo: Si ripete ogni intervallo configurato

Formato Payload JSON

{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "from": "sender@example.com",
  "reply_to": "reply@example.com",
  "to": "recipient@example.com",
  "subject": "Oggetto Email",
  "body_html": "<html><body>Contenuto HTML</body></html>",
  "body_text": "Contenuto testo",
  "attachments": ["file:///path/to/attachment1.pdf"],
  "custom_headers": {
    "X-Custom-Header": "Value"
  }
}

Pipeline 2: MainSenderPipeline (Invio Email)

Questa pipeline elabora gli email dallo stato READY.

Pipeline Main Sender

  1. Query: Recupera fino a 25 email con stato "READY"
  2. Elaborazione parallela: Per ogni email trovato:
    • Aggiorna lo stato a "PROCESSING" (lock di elaborazione)
    • Legge il payload JSON e costruisce il messaggio MIME in memoria
    • Tenta l'invio tramite client SMTP (net/smtp)
    • In caso di successo: aggiorna stato a "SENT"
    • In caso di fallimento: aggiorna stato a "FAILED" con motivo errore
  3. Ciclo: Si ripete ogni intervallo configurato

Pipeline 3: SentCallbackPipeline (Callback Email Inviati)

Questa pipeline elabora gli email dallo stato SENT.

Pipeline Sent Callback

  1. Query: Recupera fino a 25 email con stato "SENT"
  2. Elaborazione parallela: Per ogni email trovato:
    • Aggiorna lo stato a "CALLING-SENT-CALLBACK" (lock di elaborazione)
    • Prepara payload JSON con:
      • code: "TRAVELING"
      • reached_at: timestamp di aggiornamento
      • message_ids: array con ID email
      • reason: "Consegnato al server di posta"
    • Invia richiesta HTTP POST all'URL configurato
    • La richiesta HTTP usa un timeout di 10 secondi
    • Gestisce retry in caso di status 409 (CONFLICT) fino a MaxRetries
    • In caso di successo HTTP 200: aggiorna stato a "SENT-ACKNOWLEDGED"
  3. Ciclo: Si ripete ogni intervallo configurato

Pipeline 4: FailedCallbackPipeline (Callback Email Falliti)

Questa pipeline elabora gli email dallo stato FAILED.

Pipeline Failed Callback

  1. Query: Recupera fino a 25 email con stato "FAILED"
  2. Elaborazione parallela: Per ogni email trovato:
    • Aggiorna lo stato a "CALLING-FAILED-CALLBACK" (lock di elaborazione)
    • Prepara payload JSON con:
      • code: "DISPATCH-ERROR"
      • reached_at: timestamp di aggiornamento
      • message_ids: array con ID email
      • reason: motivo dell'errore originale
    • Invia richiesta HTTP POST all'URL configurato
    • La richiesta HTTP usa un timeout di 10 secondi
    • Gestisce retry in caso di status 409 (CONFLICT) fino a MaxRetries
    • In caso di successo HTTP 200: aggiorna stato a "FAILED-ACKNOWLEDGED"
  3. Ciclo: Si ripete ogni intervallo configurato

Pipeline 5-8: RestorePipeline (Ripristino Email Bloccate)

Quattro pipeline di restore riportano gli email in uno stato precedente quando restano bloccati troppo a lungo nello stato di lavorazione:

  1. INTAKING → ACCEPTED: se l’email è in INTAKING da più di timeout_minutes
  2. PROCESSING → READY: se l’email è in PROCESSING da più di timeout_minutes
  3. CALLING-SENT-CALLBACK → SENT: se la callback sent è in corso da più di timeout_minutes
  4. CALLING-FAILED-CALLBACK → FAILED: se la callback failed è in corso da più di timeout_minutes

Per ogni pipeline:

  • Query: Recupera tutte le email con stato specifico e updated_at più vecchio della soglia
  • Elaborazione parallela: Aggiorna lo stato allo step precedente
  • Ciclo: Si ripete ogni intervallo configurato

Esecuzione Parallela

Le pipeline vengono eseguite contemporaneamente in goroutine separate, ciascuna con il proprio ciclo di polling che si attiva ogni N secondi (configurabile). Un health check server rimane attivo per monitorare lo stato del sistema.

Configurazione Restore

Nel file di configurazione:

pipeline:
  interval: 3
  restore:
    interval: 10
    timeout_minutes: 30