Pergunta

arquitetura básica: n caixas físicas cada hospedagem o mesmo serviço WCF, sentados begind um balanceador de carga. Cada caixa de bater uma única infra-estrutura de banco de dados que não transações de apoio - não pergunte: (

Assim, na camada de acesso a dados do meu aplicativo eu preciso de algum método de transações distribuídas. Quais são as minhas opções?

Note que os clientes para o meu sistema será aplicações legadas comunicam usando serviços básicos de Web (BasicHttpBinding) e brilhantes novos clientes WCF (NetTcpBinding ou NetNamedPipeBinding).


Editar 1

por exemplo. haverá uma única chamada para a camada física WCF na caixa 1, por exemplo EditEntity (...). Esta chamada irá desencadear 2 gravações no banco de dados. Após a primeira gravação de outro cliente chama EditEntity (...) para a mesma entidade em uma segunda instância do meu serviço WCF em uma segunda caixa física. Na segunda caixa, como eu sei que uma transação para esta entidade particular, já está em jogo?

Graças.

Foi útil?

Solução

Não tenho certeza que você deu-nos o suficiente para seguir em frente, mas se eu estou lendo corretamente você está tentando se certificar de que você pode suportar uma transação através de seu serviço WCF? Enquanto o seu DB não suporta transações, e seus terminais WCF sentar atrás de um balanceador de carga? Eu tenho este correto? Se assim for ....

Desde a sua DB não tem suporte transacional, que se move para o seu nível WCF. Isto sugere um nível grosseiro de granularidade em seus métodos de modo que você pode garantir uma única chamada para o serviço WCF abrange sua transação suficientemente. Não espalhe uma transação através de múltiplas chamadas WCF, você está pedindo para ter problemas.


UPDATE: Existem estratégias que podem ser empregadas com balanceadores de carga que garantam persistência entre conexões, mas isso não vai ajudá-lo aqui. Se você está chamando EditEntity () consecutivamente, e a primeira entrada é para iniciar uma transação, ea segunda entrada é para concluir uma transação ... então o seu serviço não é suficiente granular.

consolidar estas duas chamadas para um método, isto é EditEntityComplete ().

Existe uma razão que você não pode criar um método, ao contrário de dois?


Atualização # 2: reformular a questão - um único executa método entradas dentro de um banco de dados que não suporta transações. O método em questão executa uma série de etapas que devem ser concluídas em ordem. O método WCF representa oportunidades para contenção de concorrência para violar conclusão da etapa na ordem correta.

Com base nisso, supondo que você não necessita de quaisquer dados de retorno da função, considere uma fila assíncrona que pode registrar solicitações dos endpoints WCF. Em seguida, processar a fila de um único processo de fundo.


revisão final:

reconsiderar a exigência de não alterar o armazenamento de dados.

Tendo em conta os requisitos para vários clientes, necessidade de escala, balanceamento de carga e suporte transacional no armazenamento de dados, uma sugestão final - impulso para alterar o banco de dados. Compreender isto é um requisito estático, mas você vai gastar um monte de esforço a tentar implementar o suporte transacional quando a abundância de plataformas de banco de dados simples irá fornecer para você. Tentando re-criar esta funcionalidade tem pouco de cabeça, mas um monte de desvantagem.

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