Modifica il numero di editori / sottoscrittori in fase di runtime

0

Ho bisogno di ridisegnare la soluzione Publish-Subscribe distribuita nel nostro prodotto.

Descrizione del problema

Abbiamo diversi produttori (servizio NT), code (MSMQ) e utenti (server IIS). La gestione delle attività richiede l'accesso al DB MSSQL.

Ci sono due tipi di compiti nel sistema:

  • attività ad-hoc, inviate alla coda dai flussi in corso.
  • attività batch, ogni notte ogni produttore crea tonnellate di attività, principalmente per la manutenzione e l'elaborazione non in tempo reale.

Il requisito è di supportare decine di migliaia di attività al giorno e di essere in grado di crescere. La soluzione al problema dovrebbe essere in grado di orchestrare il tasso di esecuzione dell'attività in base a diverse condizioni:

  • Ore di punta - esegue una piccola quantità di attività, non infastidisce gli abbonati
  • Off-hours - full gas
  • Caricamento DB: supponiamo di avere delle metriche che mostrano quante attività possiamo eseguire

Ulteriori informazioni:

  • Pensiamo di sostituire MSMQ con la coda distribuita (forse KAFKA).
  • MSSQL è un collo di bottiglia, gli abbonati cercano di accedere alle stesse tabelle, causano timeout / deadlock, ma la sostituzione non è un'opzione.

Si prega di chiedere come implementare l'orchestrazione delle attività.

Dovrebbe essere su editori, consumatori o componenti separati?

    
posta Arkadiy Verman 19.10.2015 - 22:44
fonte

2 risposte

1

Avrei il throttling in diretta sul consumatore, dal momento che le tue informazioni finora indicano che tutti i consumatori dovrebbero eseguire allo stesso modo, allo stesso orario. Qualsiasi orchestrazione centralizzata dovrebbe chiedere al nodo qual è il suo utilizzo, effettuare un controllo di soglia di base e poi tornare indietro per dire al consumatore di cambiarsi. Non è necessario il viaggio di andata e ritorno (e il codice commensurato delle comunicazioni) in quanto questa decisione è facilmente realizzabile sul consumatore. Il consumatore può leggere un programma condiviso per sapere quale dovrebbe essere il profilo delle prestazioni in un dato momento. Un'orchestrazione centralizzata potrebbe essere utile se i profili delle prestazioni dovessero cambiare frequentemente e dinamicamente solo per alcuni nodi. Nulla dice che i nodi non possono rileggere periodicamente la configurazione.

È una scelta interessante per eseguire i tuoi utenti su IIS. Non hai problemi di ripristino dell'attività quando il processo di lavoro ricicla inaspettatamente ? Non ho avuto molto successo nell'esecuzione di carichi a lungo termine su IIS. Tuttavia, presumo che sia più conveniente distribuire in questo modo.

MSMQ è lento, ma come dici tu non è il collo di bottiglia. Se fosse possibile, potrei suggerire di mettere un'API di servizio di fronte all'accesso al tuo database in modo da poter controllare un accesso concorrente un po 'di più (magari anche serializzare l'accesso per evitare problemi di blocco). Tuttavia, essendo un'app legacy, presumo che le query vengano eseguite direttamente dai consumatori. Anche allora non sono sicuro che sarebbe sufficiente se hai sproc di lunga data. Ovviamente puoi prendere misure standard come analizzare se gli indici sarebbero utili da aggiungere (o rimuovere).

    
risposta data 20.10.2015 - 00:13
fonte
0

OK, la mia lettura della tua domanda è che hai dei messaggi su MSMQ che dicono 'fai questa cosa', quando il lavoratore lo prende è praticamente tutto ciò che dice e il lavoratore deve andare al DB per prendere informazioni e aggiornare roba .

Dal mio punto di vista si tratta di un'interpretazione errata del modello di coda, non si sta davvero beneficiando di avere più lavoratori e una coda, perché alla fine della giornata il lavoro è fatto su una singola macchina.

Per renderlo davvero scalabile, devi inserire tutte le informazioni necessarie per eseguire il lavoro nel messaggio e capire come si comporta il lavoro quando altri lavori simili vengono eseguiti contemporaneamente, rendendolo il più possibile atomico.

Dire che il tuo lavoro è prendere alcuni dati di vendita da un DB transazionale e compilare un rapporto, il che significa aggiornare un'altra tabella con alcuni dati aggregati. Il messaggio dovrebbe contenere tutti i "dati di vendita" inseriti e l'output deve essere in grado di aggiornare quella tabella aggregata e contenere il risultato corretto anche se viene eseguito due volte o nell'ordine sbagliato ecc.

In termini pratici, questo potrebbe significare che devi abbattere e ridimensionare il tuo lavoro. Potresti avere:

  • Processo A, copia le vendite dei giorni in un file temporaneo
  • Processo B, leggi il file temporaneo e invia un altro file di risultati calcolati
  • Processo C, leggi i risultati aggregati e calcola se possono essere applicati correttamente alle tabelle del rapporto

I DB sono (quasi) sempre il collo di bottiglia, devi spostare tutta la logica fuori dal DB, senza grossi sproc o pacchetti SSIS. Solo semplici transazioni crude su blocchi di dati di dimensioni note.

Un sistema di Accodamento più complicato ti aiuterà ad orchestrare i tuoi lavori fino a un certo punto, ma in realtà non dovrebbe essere necessario. Le tue macchine worker possono funzionare al 100% 24 ore su 24, 7 giorni su 7, perché è tutto ciò che fanno e, per quanto impegnative, non influiscono sulle prestazioni del resto del sistema

    
risposta data 19.10.2015 - 23:34
fonte

Leggi altre domande sui tag