Práticas recomendadas para comunicação em fila

Este tópico fornece práticas recomendadas para comunicação em fila no Windows Communication Foundation (WCF). As seções a seguir discutem as práticas recomendadas de uma perspetiva de cenário.

Mensagens em fila rápidas e com o melhor esforço

Para cenários que exigem separação que as mensagens em fila fornecem e mensagens rápidas e de alto desempenho com garantias de melhor esforço, use uma fila não transacional e defina a ExactlyOnce propriedade como false.

Além disso, você pode optar por não incorrer no custo das gravações em disco definindo a Durable propriedade como false.

A segurança tem implicações no desempenho. Para obter mais informações, consulte Considerações sobre desempenho.

Mensagens confiáveis em fila de ponta a ponta

As seções a seguir descrevem práticas recomendadas para cenários que exigem mensagens confiáveis de ponta a ponta.

Transferência Básica Confiável

Para confiabilidade de ponta a ponta, defina a propriedade para true garantir a ExactlyOnce transferência. A Durable propriedade pode ser definida como true ou false dependendo dos seus requisitos (o padrão é true). Geralmente, a propriedade é definida como true parte da confiabilidade de ponta a Durable ponta. O comprometimento é um custo de desempenho, mas torna a mensagem durável para que a mensagem não seja perdida se um gerenciador de filas falhar.

Utilização de Transações

Você deve usar transações para garantir a confiabilidade de ponta a ponta. ExactlyOnce As garantias garantem apenas que as mensagens sejam entregues na fila de destino. Para garantir que a mensagem seja recebida, use transações. Sem transações, se o serviço falhar, você perderá a mensagem que está sendo entregue, mas na verdade é entregue ao aplicativo.

Uso de filas de mensagens mortas

As filas de mensagens mortas garantem que você seja notificado se uma mensagem não for entregue à fila de destino. Você pode usar a fila de cartas mortas fornecida pelo sistema ou uma fila de cartas mortas personalizada. Em geral, usar uma fila de mensagens mortas personalizada é melhor porque permite enviar mensagens de cartas mortas de um aplicativo para uma única fila de cartas mortas. Caso contrário, todas as mensagens de letra morta que ocorrem para todos os aplicativos em execução no sistema são entregues a uma única fila. Cada aplicativo deve então pesquisar através da fila de letras mortas para encontrar as mensagens de letra morta que são relevantes para esse aplicativo. Às vezes, usar uma fila de mensagens mortas personalizada não é viável, como ao usar o MSMQ 3.0.

Desativar filas de mensagens mortas para comunicação confiável de ponta a ponta não é recomendado.

Para obter mais informações, consulte Usando filas de mensagens mortas para lidar com falhas de transferência de mensagens.

Uso do Tratamento de Mensagens Venenosas

O tratamento de mensagens suspeitas fornece a capacidade de recuperação da falha no processamento de mensagens.

Ao usar o recurso de manipulação de mensagens suspeitas, verifique se a ReceiveErrorHandling propriedade está definida com o valor apropriado. Defini-lo significa Drop que os dados são perdidos. Por outro lado, defini-lo para Fault falhas no host de serviço quando ele deteta uma mensagem suspeita. Usando o MSMQ 3.0, Fault é a melhor opção para evitar a perda de dados e mover a mensagem venenosa para fora do caminho. Usar o MSMQ 4.0 Move é a abordagem recomendada. Move Move uma mensagem envenenada para fora da fila para que o serviço possa continuar a processar novas mensagens. O serviço de mensagens suspeitas pode então processar a mensagem suspeita separadamente.

Para obter mais informações, consulte Tratamento de mensagens suspeitas.

Alcançando alta taxa de transferência

Para obter alta taxa de transferência em um único ponto de extremidade, use o seguinte:

  • Lote transacionado. O lote transacionado garante que muitas mensagens possam ser lidas em uma única transação. Isso otimiza os compromissos de transação, aumentando o desempenho geral. O custo do envio em lote é que, se ocorrer uma falha em uma única mensagem dentro de um lote, todo o lote será revertido e as mensagens deverão ser processadas uma de cada vez até que seja seguro fazer o lote novamente. Na maioria dos casos, as mensagens suspeitas são raras, portanto, o envio em lote é a maneira preferida de aumentar o desempenho do sistema, especialmente quando você tem outros gerentes de recursos que participam da transação. Para obter mais informações, consulte Mensagens em lote em uma transação.

  • Simultaneidade. A simultaneidade aumenta a taxa de transferência, mas a simultaneidade também afeta a contenção de recursos compartilhados. Para obter mais informações, consulte Simultaneidade.

  • Limitação. Para um desempenho ideal, acelere o número de mensagens no pipeline do dispatcher. Para obter um exemplo de como fazer isso, consulte Limitação.

Ao usar o processamento em lote, esteja ciente de que a simultaneidade e a limitação se traduzem em lotes simultâneos.

Para obter maior taxa de transferência e disponibilidade, use um farm de serviços WCF que lêem da fila. Isso requer que todos esses serviços exponham o mesmo contrato no mesmo ponto de extremidade. A abordagem de farm funciona melhor para aplicativos que têm altas taxas de produção de mensagens porque permite que vários serviços leiam todos da mesma fila.

Ao usar farms, lembre-se de que o MSMQ 3.0 não oferece suporte a leituras transacionadas remotamente. O MSMQ 4.0 suporta leituras transacionadas remotamente.

Para obter mais informações, consulte Mensagens em lote em uma transação.

Enfileiramento com Unidade de Semântica de Trabalho

Em alguns cenários, um grupo de mensagens em uma fila pode estar relacionado e, portanto, a ordem dessas mensagens é significativa. Nesses cenários, processe um grupo de mensagens relacionadas em conjunto como uma única unidade: todas as mensagens são processadas com êxito ou nenhuma é. Para implementar esse comportamento, use sessões com filas.

Para obter mais informações, consulte Agrupando mensagens em fila em uma sessão.

Correlacionando mensagens de solicitação-resposta

Embora as filas sejam normalmente unidirecionais, em alguns cenários você pode querer correlacionar uma resposta recebida a uma solicitação enviada anteriormente. Se você precisar dessa correlação, é recomendável aplicar seu próprio cabeçalho de mensagem SOAP que contém informações de correlação com a mensagem. Normalmente, o remetente anexa esse cabeçalho com a mensagem e o destinatário, ao processar a mensagem e responder com uma nova mensagem em uma fila de resposta, anexa o cabeçalho da mensagem do remetente que contém as informações de correlação para que o remetente possa identificar a mensagem de resposta com a mensagem de solicitação.

Integração com aplicativos não-WCF

Use MsmqIntegrationBinding ao integrar serviços ou clientes WCF com serviços ou clientes que não sejam WCF. O aplicativo não-WCF pode ser um aplicativo MSMQ escrito usando System.Messaging, COM+, Visual Basic ou C++.

Ao usar MsmqIntegrationBindingo , esteja ciente do seguinte:

  • Um corpo de mensagem WCF não é o mesmo que um corpo de mensagem MSMQ. Ao enviar uma mensagem WCF usando uma associação em fila, o corpo da mensagem WCF é colocado dentro de uma mensagem MSMQ. A infraestrutura MSMQ está alheia a essas informações extras; ele vê apenas a mensagem MSMQ.

  • MsmqIntegrationBinding suporta tipos de serialização populares. Com base no tipo de serialização, o tipo de corpo da mensagem genérica, MsmqMessage<T>, usa parâmetros de tipo diferentes. Por exemplo, ByteArray requer MsmqMessage\<byte[]> e Stream exige MsmqMessage<Stream>.

  • Com a serialização XML, você pode especificar o tipo conhecido usando o KnownTypes atributo no <elemento de comportamento> que é usado para determinar como desserializar a mensagem XML.

Consulte também