Ci sono alcune cose che sembrano confuse con la tua domanda.
Ma immagino che la tua domanda fondamentale sia come essere sicuri che ogni messaggio venga elaborato una sola volta da ciascun abbonato.
La risposta è abbastanza semplice:avere un endpoint separato per ogni abbonato:ciò significa che ogni abbonato avrà la propria coda di input da cui vengono elaborati i messaggi e a cui verrà restituito un messaggio non riuscito.
Puoi quindi avere tutti o pochi gestori in ogni abbonato che desideri. Tutti i gestori compatibili verranno eseguiti per ogni messaggio in arrivo.
Con Rebus, ogni chiamata a Configure.With(...).(...).Start()
ti darà un endpoint separato, quindi nel tuo caso, ti suggerisco di avvolgere la creazione dell'endpoint dell'abbonato in un metodo, che puoi quindi invocare in questo modo:
var event1Subscriber = CreateSubscriber("subscriber_event1");
event1Subscriber.Subscribe<Event1>().Wait();
var event2Subscriber = CreateSubscriber("subscriber_event2");
event2Subscriber.Subscribe<Event2>().Wait();
var event3Subscriber = CreateSubscriber("subscriber_event3");
event3Subscriber.Subscribe<Event3>().Wait();
// ...
dove CreateSubscriber
sarebbe quindi qualcosa del genere:
public IBus CreateSubscriber(string queueName)
{
return Configure.With(GetContainerAdapter())
.Transport(t => t.UseMsmq(queueName))
.Start();
}