Design pattern per lo streaming di dati?

0

Ho un caso d'uso in cui mi viene chiesto di leggere un documento XML che è un elenco di dati, suddividerlo in sotto-elementi di dati e trasformare tali sottoelementi (in ordine) in un altro formato di documento (come un file flat o un array JSON).

Potrei risolvere il problema utilizzando un tipico flusso sincrono, elaborando dapprima l'intero documento XML in oggetti (Java) pertinenti e quindi elaborando tutti gli oggetti. Ciò garantirebbe che l'ordine dell'output sia uguale all'ordine dell'input.

Tuttavia, mi è stato detto che esiste un modello di progettazione che si adatta a questo caso d'uso. La mia ipotesi è che sia uno dei pattern di concorrenza, e quindi la mia impressione è che possa essere implementata con una coda invece che con una raccolta. Il parser XML prende ogni set di dati, lo analizza e lo invia alla coda, mentre un altro thread (o un pool di thread) popoli gli elementi fuori dalla coda e li elabora nel file di output.

Non l'ho implementato prima quindi ho una serie di domande, ma prima vorrei sapere se sono sulla strada giusta?

Un altro caso d'uso è che il design dovrebbe essere in grado di gestire più XML (più brevi) come input da un servizio web. Ogni XML conterrà un set di dati e non vi è alcun obbligo riguardo all'ordine in cui i documenti devono essere presenti nell'output, a condizione che i sotto-elementi di ciascun set di dati siano nell'ordine corretto.

(Modifica) Non sto chiedendo come scegliere un modello di progettazione in generale . Mi sto chiedendo quale modello di design si applica a questo caso d'uso molto specifico .

    
posta Andrew 23.05.2017 - 19:49
fonte

1 risposta

2

Ciò che hai descritto è chiamato è coda fork-join o modello fork-join .

Da wikipedia:

The fork–join model is a way of setting up and executing parallel programs, such that execution branches off in parallel at designated points in the program, to "join" (merge) at a subsequent point and resume sequential execution.

Puoi implementarlo sia con la coda esplicita che senza. Una coda esplicita ha il vantaggio che è possibile utilizzare una coda persistente ed è possibile distribuire il carico su macchine diverse.

In java (su una jvm senza coda esplicita) puoi usare Java Fork-Join framework o poiché Java8 (parallelo) Stream per quello.

    
risposta data 24.05.2017 - 05:44
fonte

Leggi altre domande sui tag