Na apresentação de BizTalk 2006 no Evento PontoNetPt referi a grande fiabilidade de um produto como o BizTalk, e descrevi muito brevemente a forma como isto era garantido, pelo menos em termos de orquestrações, mesmo em cenários de “subitamente, faltou a luz“.
O princípio essencial que suporta esta potencialidade é o facto de tudo aquilo que é usado nos desenhos das orquestrações ser serializável. Isto aplica-se não só às mensagens, mas também a todas as variáveis: todos os tipos utilizados têm de ser serializáveis. [Nota: há duas excepções: a classe XmlDocument, que não é serializável mas com que o BizTalk consegue lidar, e objectos declarados dentro de transacções atómicas, que não necessitam de ser serializáveis porque o BizTalk não faz serializações dentro dessas transacções].
Tendo isto como base, o BizTalk tem durante a sua execução um conjunto de chamados “Pontos de Persistência”, locais em que decide serializar tudo o que tem em memória (todas as mensagens, objectos, contexto de execução, etc.) para uma das base de dados em que está suportado. Estes pontos de persistência ocorrem em locais conhecidos e documentados da execução dos processos:
– quando termina uma transacção;
– quando se chega a um breakpoint;
– sempre que se envia uma mensagem;
(etc.)
A principal vantagem deste mecanismo é possivelmente o sustentar a grande fiabilidade do produto, mas outra de referir é que se todo o estado de um processo pode ser guardado em base de dados para ser restaurando mais tarde, isto quer dizer que a execução até pode ser retomada por um servidor diferente daquele em que foi efectuada a serialização… Por outro lado, no entanto, quando mais pontos de persistência, maior o impacto no desempenho, especialmente se existirem muitos ou objectos muito grandes num processo BizTalk.
Para controlar esta situação, além de algumas optimizações que se podem fazer, a minha recomendação pessoal é utilizarem-se os Performance Counters do produto durante os testes à solução. Note-se que o BizTalk é para ser utilizado principalmente em cenário assíncronos, pelo que ter uma resposta ultra-rápida geralmente não será algo de crítico, mas ainda assim um elevado “throughput” pode ser necessário. De entre os vários PerfCounters, alguns a que presto especial atenção são, na categoria “XLANG/s Orchestations”, os seguintes:
– Persistence Points (total acumulado)
– Persistence Points/sec
– Running Orchestrations
Olhar para estes indicadores ao mesmo tempo que se fazem testes, por exemplo usando tools como o LoadGen ou o BizUnit, pode ajudar bastante a fazer “tunning” dos nossos processos.
jota
Ps: conhecer como funciona a serialização é, na minha opinião, essencial para quem programa em .Net, mesmo sem usar BizTalk. Para quem quiser aprender, recomendo por exemplo este tutorial do TopXml (PDF).