Compartilhar via


Práticas recomendadas para comunicação em fila

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

Mensagens rápidas e de melhor esforço na fila

Para cenários que exigem separação que as mensagens na 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 propriedade ExactlyOnce como false.

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

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

Mensagens na fila de ponta a ponta confiáveis

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

Transferência confiável básica

Para confiabilidade de ponta a ponta, defina a propriedade ExactlyOnce como true a fim de garantir a transferência. A propriedade Durable pode ser definida como true ou false dependendo de seus requisitos (o padrão é true). Em geral, a propriedade Durable é definida como true como parte da confiabilidade de ponta a 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.

Uso de transações

Você deve usar transações para garantir a confiabilidade de ponta a ponta. As garantias ExactlyOnce 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, ela é entregue ao aplicativo.

Use filas de mensagens de 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 mensagens mortas fornecida pelo sistema ou uma fila de mensagens mortas personalizada. Em geral, usar uma fila de mensagens mortas personalizada é melhor porque permite que você envie mensagens de mensagens mortas de um aplicativo para uma única fila de mensagens mortas. Caso contrário, todas as mensagens de mensagens mortas que ocorrem para todos os aplicativos em execução no sistema são entregues em uma única fila. Cada aplicativo deve pesquisar na fila de mensagens mortas para encontrar as mensagens de mensagens mortas relevantes para esse aplicativo. Às vezes, o uso de uma fila de mensagens mortas personalizada não é viável, como ao usar o MSMQ 3.0.

Não é recomendável desativar filas de mensagens mortas para comunicação confiável de ponta a ponta.

Para obter mais informações, consulte Utilizar filas de mensagens mortas para tratamento de transferência de mensagens com falha.

Uso de tratamento de mensagens suspeitas

O tratamento de mensagens suspeitas oferece a capacidade de recuperação da falha ao processar mensagens.

Ao usar o recurso de tratamento de mensagens suspeitas, verifique se a propriedade ReceiveErrorHandling está definida como o valor apropriado. Defini-la como Drop significa que os dados foram perdidos. Por outro lado, defini-la como Fault causa uma falha no host de serviço quando ele detecta uma mensagem suspeita. Usando o MSMQ 3.0, Fault é a melhor opção para evitar a perda de dados e tirar a mensagem suspeita do caminho. Usando o MSMQ 4.0, Move é a abordagem recomendada. Move tira uma mensagem suspeita da fila para que o serviço possa continuar a processar novas mensagens. O serviço de mensagem suspeita pode processar a mensagem suspeita separadamente.

Para obter mais informações, confira Como tratar mensagens suspeitas.

Obter alta taxa de transferência

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

  • Envio em lote transacionado. O envio em lote transacionado garante que muitas mensagens possam ser lidas em uma única transação. Isso otimiza as confirmações de transação, aumentando o desempenho geral. O custo do envio em lote é que, se ocorrer uma falha em uma única mensagem em um lote, todo o lote será revertido e as mensagens deverão ser processadas uma a uma até que seja seguro fazer o envio em lote novamente. Na maioria dos casos, mensagens suspeitas são raras, portanto, o envio em lote é a maneira preferida de aumentar o desempenho do sistema, especialmente quando você tem outros gerenciadores de recursos que participam da transação. Para obter mais informações, confira Como enviar 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 obter um desempenho ideal, limite o número de mensagens no pipeline do dispatcher. Para obter um exemplo de como fazer isso, consulte Limitação.

Ao usar o envio em lote, lembre-se 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 leiam da fila. Isso exige 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 sejam lidos da mesma fila.

Ao usar farms, lembre-se de que o MSMQ 3.0 não dá suporte a leituras transacionadas remotas. O MSMQ 4.0 dá suporte a leituras transacionadas remotas.

Para obter mais informações, confira Como enviar 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 ordenação dessas mensagens é significativa. Nesses cenários, processe um grupo de mensagens relacionadas como uma única unidade: todas ou nenhuma mensagem é processada com êxito. Para implementar esse comportamento, use sessões com filas.

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

Correlacionar mensagens de solicitação-resposta

Embora as filas normalmente sejam unidirecionais, em alguns cenários, talvez seja aconselhável 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 contenha informações de correlação com a mensagem. Normalmente, o remetente anexa esse cabeçalho com a mensagem e o receptor, ao processar a mensagem e responder novamente com uma nova mensagem em uma fila de resposta, anexa o cabeçalho de 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 do WCF com clientes ou serviços não WCF. O aplicativo não WCF pode ser um aplicativo MSMQ gravado usando System.Messaging, COM+, Visual Basic ou C++.

Ao usar MsmqIntegrationBinding, esteja ciente do seguinte:

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

  • MsmqIntegrationBinding dá suporte a 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 requer MsmqMessage<Stream>.

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

Confira também