Come tenere traccia del cambiamento dei dati JSON nel tempo per un numero elevato di entità?

0

Ho un sistema che controlla lo stato di un gran numero di entità in orario ogni minuto. Per ogni entità, ci sarebbe un file JSON che ha campi che indicano gli stati per diversi attributi. Il sistema scarica questi file JSON su una condivisione di rete.

Ogni esecuzione del programma che viene eseguito ogni minuto genera un JSON con 20k entità dispari come queste che hanno decine di attributi.

[
    {
        "entityid": 12345,
        "attribute1": "queued",
        "attribute2": "pending"
    },
    {
        "entityid": 34563,
        "attribute1": "running",
        "attribute2": "successful"
    }
]

Devo essere in grado di monitorare la modifica dello stato degli attributi delle entità nel tempo, ad esempio rispondere a domande come quando lo stato di entity x è diventato "in sospeso". Qual è il modo migliore per archiviare questi dati e generare le statistiche?

    
posta iJeeves 30.11.2018 - 21:47
fonte

1 risposta

0

Panoramica

Penso che tu possa risolvere il tuo problema in un processo in 3 fasi relativamente semplice:

  1. Dato due istantanee (consecutive) dello stato delle tue entità, determina le modifiche tra loro.

  2. Ripeti questo passaggio fino a quando tutte le istantanee (disponibili) vengono elaborate e memorizza le modifiche da qualche parte.

  3. Interroga le modifiche memorizzate per qualcosa che ti interessa.

Ricerca delle modifiche

Molto probabilmente creerò una tabella hash per la prima istantanea. Ci sono alcune opzioni qui:

  • Utilizza Id per mappare una struttura dati che contiene i valori della tua entità

  • Utilizza una tupla (Id, AttributeName) come chiave per mappare direttamente i valori. A seconda della lingua, potrebbe avere senso solo se tutti i valori sono dello stesso tipo.

  • Fai lo stesso di sopra, ma usa una tabella hash per ogni tipo di attributo.

Ora trasformi la seconda istantanea in una tabella hash e la confronta con la prima. Quando hai trovato e memorizzato tutte le modifiche, scarti la prima tabella di hash (ma mantieni la seconda) e ripeti questa procedura con le istantanee due e tre - e così via ...

Memorizzazione delle modifiche

Ogni modifica che trovi può essere rappresentata da una tupla come (Time, EntityId, AttributeName, OldValue, NewValue) . A seconda di cosa desideri eseguire la query, potresti non aver bisogno di tutti questi campi.

Una volta trovata una modifica, la domanda diventa dove archiviarli. Un database sembra la soluzione ideale. Se si dispone di memoria sufficiente e non si desidera mantenere le modifiche, è possibile utilizzare un DB in memoria.

Il database fornirà tutte le funzionalità per rendere le query facili ed efficienti. In particolare, avrai un linguaggio di query consolidato e puoi creare gli indici pertinenti.

Entità aggiunte e rimosse

Se l'insieme delle entità monitorate rimane costante, puoi trovare tutte le differenze semplicemente ripetendo le chiavi di una tabella hash e confrontando i valori della chiave in entrambe le tabelle.

Tuttavia, quando le entità possono essere aggiunte e rimosse, può essere utile trattare ogni caso (aggiunto, modificato, rimosso) separatamente.

  • È possibile trovare facilmente entità aggiunte durante la creazione della nuova tabella hash. Controlla semplicemente se l'entità esisteva già in quella precedente.

  • Le entità rimosse possono essere trovate insieme alle entità modificate mentre si scorre sulle entità nella vecchia tabella.

In alternativa, puoi ovviamente utilizzare le operazioni intersect / complement nei tuoi set di chiavi.

    
risposta data 02.12.2018 - 19:58
fonte

Leggi altre domande sui tag