Sistema di notifica complesso

1

Stiamo costruendo un'applicazione web per monitorare le strutture industriali e abbiamo bisogno di aggiungere un modulo per avvisare gli utenti quando accadono certe cose nel sistema.

Otteniamo dati (molti dati) dalle macchine dell'impianto come serie di dati di 10 minuti (un valore ogni 10 minuti, come temperature dei componenti della macchina, prestazioni di uscita, consumo di energia, ecc.) e memorizziamo i dati in un DB cassandra . Il framework utilizzato è Django.

Questi sono il tipo di cose che dobbiamo notificare (e dobbiamo emettere la notifica quando si verifica l'evento, quindi nessuna elaborazione in batch):

  • Quando una macchina è stata inferiore al 90% delle sue prestazioni teoriche per 60 minuti consecutivi (ovvero 6 righe di dati di 10 minuti), ma non se la macchina è stata arrestata manualmente.

  • Quando l'intera struttura è stata inferiore al 95% della sua prestazione teorica per due ore consecutive.

  • Quando una macchina viene arrestata manualmente.

  • Quando la produzione mensile raggiunge il 50% del previsto.

  • Etc, ecc.

I dettagli della notifica (percentuali, intervalli temporali, ecc.) dovrebbero essere configurabili per utente.

Stiamo cercando un design tanto generico quanto posible, perché l'elenco delle notifiche disponibili crescerà in futuro. Qualcuno ha affrontato un problema simile? Come ti sei comportato?

Sto solo cercando suggerimenti generali su come progettarlo, ecco perché non sto dando troppe informazioni specifiche.

Aggiorna

Sto chiedendo aiuto su come progettare il sistema generale. Il problema è come definire le regole per ogni notifica, dato che devo tenere d'occhio l'evoluzione dei dati (la notifica non è definita come "qualcosa è successo", ma come "qualcosa è successo e ha continuato a succedere per X volta in una riga ".

Le domande principali sono:

  • Come dovrei memorizzare le regole delle notifiche?

  • Come dovrei controllare se una nuova notifica deve essere inviata all'utente? Interrogare il database ogni volta che inserisco i dati o esiste un modo più elegante? Devo mantenere lo stato di ogni possibile positivo fino a quando non diventa una notifica effettiva, o è eccessivo?

Non concentrarti sulle impostazioni utente o se gli eventi devono essere notificati via email o inviati a un'app mobile, ciò non è importante: -)

    
posta César García Tapia 29.09.2017 - 20:21
fonte

2 risposte

1

Quindi, ti dirò in anticipo sembra che tu possa aver seguito il percorso "Costruiamolo da zero" senza fare ricerche sufficienti. Il tipo di sistema che desideri esiste in molti posti, molti dei quali non richiedono nemmeno che tu paghi.

Il mio strumento preferito per questo tipo di problema è lo stack elastico . È altamente flessibile e altamente scalabile per contenere un sacco di eventi con bassa latenza, analizzandoli e indicizzandoli. Esistono tutti i tipi di output che è possibile configurare per includere le notifiche.

C'è persino un articolo specifico pubblicato su avvisi e notifiche basati su eventi complessi. .

    
risposta data 29.09.2017 - 23:00
fonte
0

Vorrei fare quanto segue:

  • Crea una lingua per le regole. Questo non significa che devi creare un linguaggio basato sul testo, con un parser. Significa che pensi agli operatori necessari per comporre le regole (sono oggetti compositi), così come i terminali (nodi foglia delle espressioni) e crea una libreria che contiene un oggetto per ogni componente della lingua. Ora puoi comporre le regole.
  • Le regole richiedono un metodo di valutazione o esecuzione che attraversi l'albero degli oggetti e determina se una notifica è in ordine. Il più semplice è un metodo che restituisce un valore booleano.
  • Le regole devono essere mantenute usando la tua tecnica preferita. Userei la persistenza binaria, ma puoi usare qualsiasi cosa tu voglia.
  • manterrò le regole in memoria in un processo del server. Manterrò anche i bit più piccoli dei dati di input (dati forniti al valutatore di regole tramite un oggetto di contesto) nella memoria possibile.
  • Se hai molti dati in tempo reale, presumo tu abbia già pensato alle prestazioni. Altrimenti, considera semplici flussi binari in un file system; qualunque cosa tu faccia, non fare l'equivalente di una riga in un database per bit di dati incrementali in arrivo.
  • I dati in arrivo sono probabilmente di sola lettura, quindi puoi fare a meno di creare nuovi file per blocco di dati e pulirli periodicamente con un garbage collector.
  • Se si è preoccupati del sovraccarico di valutare tutte le regole ogni volta che si ricevono nuovi dati, è possibile mantenere un elenco di dati di input utilizzati da ciascuna regola nel nodo radice della regola, calcolati una volta dopo la creazione della regola. Usalo per determinare quali regole sono interessate.

Naturalmente ci sono molte strategie di ottimizzazione; misura prima di ottimizzare qualsiasi cosa.

    
risposta data 29.09.2017 - 23:53
fonte

Leggi altre domande sui tag