Sto lavorando su Apache Storm (ma anche chiunque conosca bene MySQL può aiutare). La topologia è così:
Beccuccio singolo ---- emit --- > Istanze multiple di un bullone
Ogni istanza del Bullone inserisce una serie di righe nella tabella ABC. La tabella del database si trova su un singolo server. Le istanze di Bolt potrebbero essere distribuite su più server.
Obiettivo: essere in grado di speed su e ridimensiona il programma aumentando il numero di istanze di Bolt (es .: se l'elaborazione di x quantità di dati e la scrittura su MySQL richiede 1 ora con 5 Bolts, dovrebbero impiegare forse 35 minuti se uso 10 bulloni).
Problema:
1. Non importa quanti bulloni io uso, il tempo di elaborazione si ridurrà, ma ogni Bolt dovrà aspettare che gli altri bulloni n-1 finiscano di inserire , prima che possa essere inserito (non perché il programma la logica lo fa aspettare, ma poiché SQL non consente a un processo / bullone di scrivere su SQL mentre un altro processo / bullone scrive sulla stessa tabella ). Questo tempo di attesa non consente la scalabilità del programma.
2. Un lungo tempo di attesa causerà Zookeeper al timeout .
3. Prima che questa topologia inizi, la tabella ABC ha già dati esistenti e qualsiasi nuovo inserimento verrà eventualmente aggiunto alla tabella ABC.
Una soluzione a cui ho pensato:
Per consentire a ogni Bolt di scrivere sulla propria tabella temporanea
ABC_TempBolt1
ABC_TempBolt2
ABC_TempBolt3
ABC_TempBolt4
ABC_TempBolt5
e quando lo Spout è finito, usa il comando INSERT INTO
di SQL per prendere il contenuto delle tabelle Temp e inserirlo in ABC.
È questo il più efficiente & & veloce & & modo scalabile per realizzare questo o c'è un design migliore || tecnica?
ps: Se ci sono altri database (anche i DB noSQL) che possono aiutare ad accelerare l'applicazione consentendo inserimenti concomitanti, sono aperto all'idea.