Pergunta

Enquanto evaulating fila de mecanismos, em geral, e Rebus em particular, veio-me a seguinte dúvida sobre Ônibus Instâncias do Ciclo de vida:

  1. Quando precisamos de acesso para o Ônibus instância (one-way client mode (modo cliente) a partir de vários serviços WCF hospedados em um serviço do windows, a única opção para a instanciação é sobre Singleton modo?

  2. Há uma maneira de fazer uma Pausa de um Ônibus expedição de mensagem para os manipuladores de mensagem?) e, em seguida, iniciá-lo novamente.Ou a única opção é dispor-lo e criar um novo.

    • Um Caso de uso para isto é quando você se conectar a sistemas que têm limitação de rendimento, ou de transações por hora limites.
  3. Pode sagas têm vários trabalhadores, se assim do pressuposto de que os eventos foram enviados na ordem correta (iniciador primeiro), não há caminho para a garantia de que o iniciador vai ser tratados em primeiro lugar, para criar a saga, antes de os seguintes eventos são tratados com vários trabalhadores?

  4. Se no mesmo host, vários Ônibus instâncias são usadas, e dentro de um manipulador de mensagem chamamos de enviar outro ônibus exemplo, com base na mesma configuração.A correlação de identificação vai ser transmitido, E coisas como a resposta vai funcionar corretamente, certo?

Eu prefiro respostas concretas sobre como Rebus poderia apoiar-se ou não este, com referências de código/exemplos.

Foi útil?

Solução

1:É realmente simples:O ônibus instância (por exemplo,a implementação de IBus que é colocada dentro do recipiente e é entregue a você quando você faz o Configure.With(...) configuração de feitiços) é suposto para ser uma instância singleton que você mantenha em torno de toda a duração de seu aplicativo de tempo de vida.

Você pode facilmente criar várias instâncias embora, mas que seria útil apenas para a hospedagem de vários Rebus pontos de extremidade no mesmo processo.

IOW o ônibus é totalmente reentrante e segurança pode ser compartilhadas entre threads no seu aplicativo da web.

2:Não tão prontamente, não - pelo menos não de uma forma que não é suportada pela API pública.Você pode fazer isso, porém: ((RebusBus)bus).SetNumberOfWorkers(0) (i.é.elenco IBus instância RebusBus e alterar o número de threads de trabalho), o qual será bloqueado até que o número de trabalhadores foi ajustado para o número desejado.

Desta forma, você pode realmente alcançar o que você está depois.Ele é apenas um recurso oficial do Rebus (ainda), mas ele pode ser no futuro.Posso garantir, no entanto, que a capacidade para ajustar o número de trabalhadores em tempo de execução, não vai embora.

3:Sim, sagas são protegidos por um regime de simultaneidade otimista, não importa qual a camada de persistência que você escolher.Se você não tiver certeza de qual o tipo de mensagem vai chegar primeiro na sua saga, você deve fazer a sua saga tolerante a este - por exemplo,basta implementar IAmInitiatedBy<> para cada potencialmente iniciando tipo de mensagem e fazer a saga manipular corretamente.

Sendo (bastante) tolerante a ordem de mensagens é uma boa robustez princípio de que irá atendê-lo bem também quando as mensagens são reentregue depois de ter ficado um tempo em uma fila de erro.

4:Rebus vai pegar o atual contexto da mensagem, mesmo que você esteja usando ônibus múltiplas instâncias, pois ele usa um "ambiente de contexto" (i.é.um MessageContext instância montado no thread de trabalho) para pegar o fato de que você está enviando uma mensagem a partir de um manipulador, que por sua vez fará com que o ID de correlação dos tratados mensagem para ser copiado para qualquer mensagens de saída.

Assim, bus.Reply vai trabalhar, também.

Mas como eu disse em (1) o ônibus instância é totalmente reentrante e não há necessidade de se ter várias instâncias em volta, a menos que eles, de fato, logicamente diferença de pontos de extremidade.

Espero que isso responde a suas perguntas :)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top