Noi facciamo uso di un sacco di aggregazione, Singleton e orchestrazioni multiton, simile a Seroter's Round Robin tecnica qui descritta (BizTalk 2009) .
Tutti questi tipi di orchestrazione dispongono di punti di continuazione o di continuazione arbitrari (per le aggregazioni), generalmente definiti da un timer, ad esempio se un'Orch non ha ricevuto altri messaggi entro X minuti, quindi procedere con il batch e se dopo Y sono trascorsi altri minuti e quindi non ci sono più messaggi. (Escludiamo anche i nostri Single/N-Tons a causa di timori su degraded performance after large numbers of messages sono abbonati al singleton per un periodo).
Tanto quanto abbiamo cercato di mitigare contro gli zombi, ad es. Avviando un'elaborazione di continuazione in un'orchestrazione asincrona con refactoring, c'è sempre un punto di debolezza in cui un messaggio a tempo "buono" potrebbe causare uno zombi. (ovvero ricevere più messaggi in arrivo correlati alle forme "già completate" di un'orchestrazione),
Se un messaggio causa uno zombie su uno degli abbonamenti, il messaggio non sembra essere stato propagato a ALTRI abbonati (es. totalmente disaccoppiato dall'orchestrazione 'zombie che causa'), cioè il messaggio che causa zombi non viene elaborato.
Domanda
Quindi sarei molto interessato a vedere se qualcuno ha un altro modo, a livello di codice o in altro modo, per rimuovere in modo esplicito un abbonamento correlato da un'orchestrazione in esecuzione una volta che l'orchestrazione è 'progredito' oltre il punto in cui è interessato a questo messaggio correlato. (Questo nuovo messaggio sarebbe quindi tipicamente iniziare una nuova orchestrazione con le sue correlazioni, ecc)
A questo punto vorremmo prendere in considerazione anche una soluzione mod quale una chiamata API riflessa BizTalk o SQL diretta eliminare contro il MsgBoxDB.
Poiché quel perf. problema era con il 2006, hai bisogno di chiudere le orchestrazioni? Ho usato questo modello con grandi quantità di messaggi con successo in bt2009. L'orchestrazione funzionava continuamente. Per chiuderli in sicurezza ho fermato la fonte, poi le orchestrazioni. –
Sfortunatamente, la maggior parte del nostro traffico in entrata proviene da una coda Single MQ, quindi l'interruzione della porta di ricezione influirebbe su tutte le nostre app. Ma hai ragione - è un caso di "preoccupazioni" sulle perdite rispetto a prove in buona fede (ad esempio vedere 50k + messaggi allegati al singleton è scoraggiante). Sotto carico eccezionale, la sospensione di alcune delle singleton orchs funziona correttamente e quindi riprende una volta che il server ha recuperato/completato con un lavoro più urgente (dal momento che con 'progettazione' solo i messaggi critici non latenti verrebbero assegnati a Singletons/Round-Robins). – StuartLC
È possibile aggiungere un'altra coda tra la coda esistente e il ricevitore corrente? In questo modo puoi fermare il nuovo ricevitore e chiudere con grazia le orchestrazioni. –