Come posso inviare in modo efficiente notifiche per eventi diversi a utenti diversi in base alle loro preferenze?

4

Sto creando un sistema di notifica per eventi particolari.

Un utente può impostare i criteri che corrispondono a particolari eventi (ad es. Nuovo elemento, elemento modificato, oggetto chiuso, ecc.) Gli elementi hanno caratteristiche diverse (ad esempio Minore, Maggiore, Critico). Quindi un utente può impostare una ricerca per Tutti i nuovi elementi critici.

Qual è il modo più efficiente per identificare quelli che corrispondono alle ricerche salvate degli utenti e inviare notifiche a loro ogni volta che si verifica un evento?

Un modo sarebbe quello di eseguire TUTTE le ricerche salvate per tutti gli utenti, ogni volta che si verifica un evento e vedere quali elementi si trovano in quei risultati di ricerca e inviare notifiche.

Il problema con questo metodo che vedo è che è inefficiente (le ricerche salvate potrebbero diventare diverse) e la complessità di questo algoritmo è direttamente proporzionale al numero di ricerche.

Qualcuno sa come fanno i siti web, come i siti web delle proprietà? Invia email per nuove proprietà che corrispondono alle ricerche degli utenti.

Sto pensando ad un modo per mappare nuovi eventi agli utenti, data la loro ricerca in qualche modo senza eseguire tutte le ricerche.

    
posta Tom K 02.12.2014 - 12:51
fonte

2 risposte

1

Al momento stiamo creando un servizio web per risolvere problemi come questo (con regole molto complesse, comprese le regole negative - cose che non stanno accadendo). Sfortunatamente è in versione beta privata al momento e siamo limitati agli utenti. Tuttavia, spero di poter condividere i dettagli su come costruire una versione molto più semplice (meno la negazione).

Come hai delineato man mano che i tuoi dati crescono, sarà molto lento scorrere tutte le ricerche salvate in un database relazionale tradizionale. Se ho letto correttamente la tua domanda, i tuoi eventi dovrebbero contenere tutti i dati sull'eventuale licenziamento di una notifica. Creerei un namespace come convenzione di denominazione per eventi come "new-item: minor", "new-item: critical", "closed-item: major". Utilizza questi eventi con nomi personalizzati come le chiavi in un archivio di valori chiave come redis con il valore che dovrebbe essere quello che dovrebbe accadere se quell'evento arriva.

Quando un elemento viene salvato, aggiornato, distrutto ecc. usa un aggregatore come statsd per spingere la chiave dell'evento con nomi assegnati a log.

Quindi avrai un raccoglitore di dati come fluentd che sta guardando quel file di registro e sta eseguendo un lavoro in background ogni volta che viene inserita una chiave evento . L'operatore cerca la chiave redis e non trova nulla e non fa nulla o invia l'evento appropriato.

Questo è tutto, se cambi il file di configurazione di fluentd per controllare ogni secondo (penso che l'impostazione predefinita sia un minuto) puoi avere notifiche di eventi quasi in tempo reale.

    
risposta data 02.12.2014 - 19:25
fonte
0

In primo luogo, classifica i tuoi ascoltatori. Secondo, classifica i tuoi eventi. Quindi, abbina gli eventi agli ascoltatori.

Suppongo che tu non abbia una capacità come seguire un particolare argomento, dato che non ne hai parlato.

Classifica i tuoi ascoltatori raggruppandoli in gruppi di criteri. Tutti gli ascoltatori che cercano gli eventi "Nuovo" x "Maggiore" si trovano in un gruppo. Tutti gli ascoltatori che cercano "Nuovi" x eventi "Critici" si trovano in un altro gruppo, con gli ascoltatori sovrapposti, se necessario. Finirai con 9 gruppi, il prodotto incrociato di azione e gravità.

Quando si verifica un evento, si utilizza il prodotto incrociato di azione e gravità per selezionare uno dei gruppi. Tutti gli ascoltatori del gruppo dovrebbero ricevere una notifica.

Questo avrà il numero minimo di ricerche e confronti, dal momento che l'utente che modifica le sue preferenze è molto più raro di quanto accadano nuovi eventi.

    
risposta data 21.10.2015 - 02:48
fonte

Leggi altre domande sui tag