Como gerencio o debate técnico entre o WCF e a Web API?

49

Estou gerenciando uma equipe de 15 desenvolvedores agora e estamos em um momento de escolher a tecnologia, onde a equipe é dividida em duas equipes completamente opostas, debatendo sobre o uso do WCF versus da Web API.

A equipe A, que oferece suporte ao uso da API da Web, apresenta os seguintes motivos:

  1. API Web é apenas a maneira moderna de escrever serviços ( Wikipedia )
  2. O WCF é uma sobrecarga para HTTP. É uma solução para TCP, Net Pipes e outros protocolos
  3. Os modelos WCF não são POCO, devido a [DataContract] e [DataMember] e a esses atributos
  4. SOAP não é tão legível e prático quanto JSON
  5. SOAP é uma sobrecarga para a rede em comparação com JSON (transporte sobre HTTP)
  6. Sem sobrecarga de método

A equipe B, que suporta o uso do WCF, diz:

  1. O WCF suporta vários protocolos (via configuração)
  2. O WCF suporta transações distribuídas
  3. Existem muitos bons exemplos e histórias de sucesso para o WCF (enquanto a API da Web ainda é jovem)
  4. Duplex é excelente para comunicação bidirecional

Esse debate continua e não sei o que fazer agora. Pessoalmente, acho que devemos usar uma ferramenta apenas para o local certo de uso . Em outras palavras, é melhor usarmos a API da Web, se quisermos expor um serviço por HTTP, mas usar o WCF quando se trata de TCP e Duplex.

Ao pesquisar na Internet, não conseguimos um resultado sólido. Existem muitos posts para apoiar o WCF, mas, pelo contrário, também encontramos pessoas queixando-se disso. Sei que a natureza dessa pergunta pode parecer discutível, mas precisamos de algumas boas dicas para decidir. Estamos presos em um ponto em que a escolha de uma tecnologia por acaso pode nos fazer lamentar mais tarde. Queremos escolher com os olhos abertos.

Nosso uso seria principalmente para a Web e exporíamos nossos serviços por HTTP. Em alguns casos (digamos 5 a 10%), talvez precisemos de transações distribuídas.

O que eu deveria fazer agora? Como gerencio esse debate de maneira construtiva?

Saeed Neamati
fonte
11
Não se esqueça, a API da Web não facilita para os consumidores gerar um cliente de serviço como um WSDL SOAP. Se você sempre tiver clientes .NET, isso não é muito importante, pois eles podem compartilhar os objetos de contrato que você implementa, mas outros clientes de idiomas precisarão criar manualmente seus objetos de cliente se você não usar SOAP.
Jimmy Hoffa
10
lembre-se também que o WCF pode fazer json muito decentemente na maioria dos casos bem
Bill
3
"3. Os modelos WCF não são POCO" simplesmente incorretos. Você não precisa usar nenhum atributo desde o .NET 3.5 SP1.
Allon Guralnek
4
Esta questão parece estar fora de tópico porque se trata de gerenciar um debate entre colegas de trabalho, não de desenvolvimento de software.
precisa
3
Wikipedia define "a maneira moderna de escrever serviços"? Não tenho certeza de como isso é útil.
93013 Frank Hileman

Respostas:

38

Quando os dois lados têm bons argumentos e as opiniões sobre o assunto são fortes demais para chegar a um consenso, você, como gerente, precisa tomar uma decisão e encerrar o debate. Caso contrário, ele apenas girará em círculos e fortalecerá ainda mais as posições de todos os participantes. Quanto mais você esperar, mais difícil será para o lado "perdedor" admitir a derrota e trabalhar produtivamente com o resultado.

Anote todos os argumentos, avalie a importância deles para o projeto e depois tome sua decisão. Quando não puder, jogue uma moeda. É provável que seu projeto seja concluído com êxito com qualquer uma das tecnologias, e desperdiçar um tempo valioso com debates desnecessários custará apenas dinheiro desnecessário.

Philipp
fonte
3
Caro @ Philipp, obrigado pela sugestão de troca de moedas . Mas como eu disse, não quero me arrepender dessa decisão casual . Embora acredite que a agilidade é importante, também acredito que boas decisões também são importantes.
Saeed Neamati
5
@SaeedNeamati: Se, depois de coletar e pesar todas as informações, nenhuma tecnologia tiver uma vantagem clara, então jogar uma moeda é a maneira mais honesta de decidir. Não importa o resultado do sorteio, é uma boa decisão, porque você pesou todas as informações.
Bart van Ingen Schenau 5/08
9
@SaeedNeamati: Concordo plenamente com "jogar uma moeda". No momento, você está em uma clara paralisia de análise (suas palavras exatas estão nessa página da wiki), cuja IMO é mais perigosa do que escolher uma decisão que pode não ser "a melhor". Se você tem uma decisão tão difícil, isso significa que mesmo a outra decisão menos ideal não é tão ruim assim. E enquanto você arquitetar seu software de maneira modular, você poderá deixar abstração suficiente para remover uma tecnologia e colocar a outra se necessário, o que é muito improvável em ambos os casos.
DXM
2
@SaeedNeamati Em termos de tecnologia, não existe "arrependimento" dessa decisão. Você sempre cometerá erros. O mais importante é ser capaz de detectar erros o mais rápido possível, admiti-los abertamente e mudar de decisão para melhor.
Sleeper Smith
4
Outras opções: luta com articulações; luta de luta livre; pessoa que grita mais alto ganha. Certamente estes são melhores do que jogar uma moeda? :)
Frank Hileman
13

Supondo que ambos os lados estejam 100% corretos em todos os seus argumentos, quais são importantes?

Os modelos WCF não são POCO, devido a [DataContract] e [DataMember] e a esses atributos

Você se importa? Você está planejando fazer algo que exija POCO?

O WCF suporta transações distribuídas

Novamente, isso é algo que você usará e precisará construir se não o tiver porque seguiu o outro caminho?

Basicamente, chegue ao coração de qual deles:

  • Oferece tudo o que você precisa (se nem oferecer tudo o que você precisa, o que faz você ter que fazer a menor quantidade de trabalho).
  • Oferece a menor quantidade de lixo que você não vai usar, mas que tem que suportar de qualquer maneira.

Qualquer argumento apresentado que não esteja no caminho do que você precisa realizar é irrelevante e não deve levar em consideração sua decisão, com algum espaço de manobra para considerar uma expansão futura.

pedregoso
fonte
11
Os modelos de Serviço de Dados WCF são POCO, apenas o requisito é um campo de ID [nome] iirc.
Maslow
11

Coloque meus dois centavos.

Como gerente, você deve pedir a seus colegas de equipe que tenham em mente o princípio Yagni . Isso ajudará a reduzir a lista de razões apresentadas pelas duas equipes.

Nosso uso seria principalmente para a Web e exporíamos nossos serviços por HTTP. Em alguns casos (digamos 5 a 10%), talvez precisemos de transações distribuídas.

Em vez de mergulhar em transações distribuídas, considere trabalhar com compensação .

A última coisa a considerar é a curva de aprendizado. Dependendo do prazo do seu projeto, como gerente, você poderá decidir se está certo começar a aprender uma nova tecnologia ou não.

Se você tiver muito tempo a perder, faça um tipo de Dia da Inovação em que as equipes A e B tenham um dia para produzir provas de conceitos com base nos mesmos requisitos.

A propósito, para quem diz que "os modelos WCF não são POCO, por causa de [DataContract] e [DataMember] e esses atributos ", diga a ele que POCOs geralmente são entidades de domínio e que não é uma prática recomendada expor seu objeto de domínio para qualquer tipo de cliente, é para isso que servem os DTOs.

MaxSC
fonte
+1 por não expor objetos de domínio no contrato fascista / externo. Faça isso pelo menos 10 vezes pelas vitórias baratas e em 9 delas refatoradas devido à dificuldade de ter um contrato de comunicação fixa e gerenciar uma alteração de domínio. +1 para transações distribuídas, é uma coisa muito mal ..
user1496062
5

O que eu deveria fazer agora? Como gerencio esse debate de maneira construtiva?

Primeiro, mantenha a subjetividade afastada. Nos argumentos da sua equipe de WebAPI, acho que "a API da Web é apenas a maneira moderna" *, "os modelos WCF não são POCO, por causa desses atributos" e "SOAP não é tão legível e acessível quanto o JSON", bastante opinativo, se não completamente errado , e não ajudará a tomar uma decisão.

Então, o que fazer: decida o que você quer fazer com o (s) seu (s) serviço (s) , escolha uma técnica que acomode esse objetivo e sua capacidade de manutenção e extensibilidade com o mínimo de dor possível. Você pode fazer isso simplesmente pesquisando se algum aspecto é suportado pela estrutura a ser usada.

Material de leitura interessante:

*: observe que você se refere à Wikipedia para isso, onde a citação é: " Os aplicativos Web 2.0 da Web se afastaram de uma arquitetura orientada a serviços (SOA) com serviços Web baseados em SOAP para coleções mais coesas de recursos da Web RESTful" . Esse é um exemplo de uso para quando seu serviço deve ser consumido em uma página da web. Isso também pode ser feito facilmente com o WCF, usando o WebHttpBinding. Não diz "Use WebAPI para isso" .

Se essa pergunta se estender além do "como gerenciar a discussão" : eu usaria o WCF se os serviços fossem consumidos por clientes que não são da Web, porque seus metadados permitem uma geração de clientes fortemente tipada, surpreendentemente fácil.

CodeCaster
fonte
11
Não apenas isso. " XYZ é apenas a maneira moderna " é um NULL-argumento, que geralmente lê como " eu tenho argumentos não reais, mas é o meu favorito da temporada. "
JensG
4

Gerenciamento de equipe à parte, você não escolhe um sobre o outro. Você precisa examinar o objetivo de cada serviço da Web e usar a tecnologia apropriada para a parte específica do aplicativo. É como proibir procedimentos de armazenamento quando a equipe está usando a estrutura da entidade.

Nosso uso seria principalmente para a Web e exporíamos nossos serviços por HTTP. Em alguns casos (digamos 5 a 10%), talvez precisemos de transações distribuídas.

Em seguida, você escreve esses serviços da Web de 5 a 10% no WCF. Se o serviço deve ser referenciado internamente em outros projetos, não há debate. A vantagem da capacidade de importar o contrato WCF para criar o proxy do cliente NÃO está aberta para discussão. Leva toda a integração, eficiência e segurança de tipo a um nível totalmente novo.

Você escreve o que deve ser usado para solicitações de API pública (talvez) / Ajax na API da Web do Asp.net.

Se for apenas uma chamada ajax específica da página, você poderá usar o Asp.Net MVC.

Não escolha, abrace todos eles. A API da Web do WCF e do Asp.net serve a propósitos diferentes. Ninguém diz que você não pode comer maçã e laranja na salada de frutas. Tentar escolher um sobre o outro e empurrá-lo para baixo em todos os cenários é apenas pura preguiça.

Sleeper Smith
fonte
4

Nossa equipe teve uma discussão semelhante há alguns meses. O fator decisivo para nós se resumiu a como criaríamos e implementaríamos cada tecnologia. Como já estávamos construindo um aplicativo MVC e estávamos usando o Knockout.js para ligação de dados, estávamos efetivamente usando o MVVM com os controladores sendo apenas uma API para dados.

Isso nos permitiu categorizar nosso uso das tecnologias com este projeto da seguinte maneira:

  • A API da Web seria usada como nossa API para chamadas knockout e Ajax, tornando-os nossos comandos para o padrão MVVM. Nossa lógica de negócios para o aplicativo da Web está agrupada por trás dessa camada por meio de várias classes, repositórios e fábricas.
  • O WCF é então usado para nosso armazenamento de dados, expondo dados de nosso banco de dados não apenas para este site, mas também para qualquer outro site ou serviço que consumiu os dados expostos.

Embora isso possa não ser uma resposta popular ou hiper-técnica, determinar o que você precisa primeiro e como ou se a tecnologia ajudará foi o que ajudou minha equipe a decidir qual tecnologia usar onde.

Malha
fonte
como sua camada WCF lida com Auth?
Maslow
3

Em outras palavras, é melhor usarmos a API da Web, se quisermos expor um serviço por HTTP, mas usar o WCF quando se trata de TCP e Duplex.

Essa seria a abordagem mais razoável. É bastante comum ter serviços WCF e WebApi no mesmo aplicativo Web, onde ambos servem a propósitos diferentes.

Apenas para corrigir alguns argumentos:

Os modelos WCF não são POCO, devido a [DataContract] e [DataMember] e a esses atributos

Em muitos casos, os modelos WCF funcionam sem atributos de contrato de dados / membro de dados.

SOAP não é tão legível e prático quanto JSON

Não é verdade, mas os serviços Web WCF geralmente transportam XML simples em vez de SOAP inchado. Definitivamente, isso é legível.

Um argumento para o WCF: se houver um WSDL disponível, há toneladas de ferramentas em quase todas as tecnologias que podem criar proxies a partir dos metadados. Por outro lado, o esquema JSON ainda não é totalmente suportado.

Wiktor Zychla
fonte
2

Por que não andar na linha com o WCF Data Services? boas consultas no estilo OData / webapi e usabilidade com os poderes do WCF e a capacidade de retornar JSONperfeitamente. O Wcf também não é tão ruim se você tiver um bom código de hospedagem automática do wcf como o seguinte:

https://github.com/ImaginaryDevelopment/MvcOdata

Eu diria que eles não estão muito separados, exceto que, quando usamos WebApio front end e WCF data serviceso nível intermediário, WebApivomitamos coisas simples como string contém ou operadores odata correspondentes a string.

Maslow
fonte
1

Um bom arquiteto adia as decisões de tecnologia até que sejam absolutamente necessárias.

Em outras palavras, não tome a decisão até que um cliente precise realmente se conectar. Você pode criar uma camada de serviço totalmente testada sem realmente colocar um mecanismo de transporte / comunicação sobre ela. Mais de 95% do trabalho pode ser feito "abaixo" do adaptador, fora da estrutura.

Na hora de expor esses serviços a clientes remotos, você pode escolher a estrutura mais moderna da prateleira e escrever invólucros finos em uma camada de serviço versátil.

Inferno, se sua camada de serviço "real" for bem-sucedida, você pode até tentar vários invólucros a um custo mínimo.

Essa é a resposta dogmática, de qualquer maneira. Na prática , convém escolher a ferramenta mais simples disponível para facilitar os testes de integração iniciais e frequentes - mas, ainda assim, limite sua dependência e trate-a estritamente como uma camada de comunicação simplesmente fina sobre os serviços reais .


Se você adotar essa abordagem, provavelmente descobrirá que escolhe a ferramenta mais simples de usar inicialmente e ninguém se incomodará , porque a equipe sabe que pode implementar uma ferramenta ou estrutura mais sofisticada ou moderna mais tarde, se necessário , com o mínimo esforço.

svidgen
fonte
Reconhecidamente, esta resposta é muito tarde para o jogo - mas, eu estava realmente surpreso ao ver nenhuma das respostas populares regurgitado o dogmática "nem sequer tomar a decisão final ainda" resposta ...
svidgen
0

Portanto, agora estou enfrentando a mesma escolha, perguntei-me qual é o subconjunto de recursos do WCF que nossa equipe está usando no momento. Usamos protocolos diferentes? Não. Nós usamos suporte a transações? Não (embora usemos mecanismos personalizados de consistência eventual). Usamos duplex? Não.

Por que gostaríamos de usar a API da Web? Integração de front-end mais fácil (remove a camada de serviço adicional existente agora), SignalR para enviar respostas aos clientes, armazenar em cache para GETs.

Pode ser, pode-se encontrar outros motivos :) Além disso, motivos para permanecer no WCF.

iiwaasnet
fonte
2
O OP não está perguntando sobre WCF versus API da Web, o OP está perguntando sobre como gerenciar o debate técnico interno que sua equipe está tendo. Sua resposta perde a parte mais ampla da pergunta.
0

Se eu estivesse na sua posição, começaria examinando as habilidades de sua equipe. Se todos na sua equipe já conhecem o WCF e apenas uma pequena porcentagem conhece a API da Web, sua decisão já está tomada para você.

De qualquer forma, se você tiver tempo, invista-o no aprendizado e no aprimoramento de sua base de conhecimento, mas não às custas da necessidade dos negócios e da produtividade da empresa.

user3333735
fonte
0

Gostaria de perguntar qual modelo de interação você precisa apoiar? Sua interface externa desejada se parece mais com RPC ou REST? Na minha experiência, geralmente está em algum lugar entre, mas principalmente um ou outro.

Você está consumindo seus próprios serviços para outros projetos no .Net? Essa é provavelmente a pergunta mais reveladora que você pode fazer. O WCF tem a vantagem de poder abstrair suas interfaces em uma biblioteca de classes separada e criar e injetar seu cliente. Como uma extensão para isso, você pode montar seu projeto baseado no WCF com pontos de extremidade JSON e SOAP / WSDL, eu fiz isso. O WCF também oferece melhores garantias contra suas interfaces definidas.

Dito isso, se você espera ter clientes de outras plataformas XML em geral, muito menos o SOAP tem uma sobrecarga mensurável além do que os terminais JSON simples possuem. Se você seguir a rota JSON / API da Web, precisará melhorar muito a documentação de como interagir com seus terminais e API.

Em geral, sugiro escrever um documento simples da API que indique como você enviará dados e como deseja uma resposta para uma única estrutura de objeto de solicitação. Escreva seu caso de teste da maneira mais universal e documente-o como tal. Eu recomendaria uma simples instrução curl. Depois, vários de seus membros implementam isso usando o WCF e com a API da Web. Então veja quais vitórias.

Pessoalmente, apesar de ter feito alguns projetos e implementações relativamente grandes com o WCF, na verdade eu me inclino para a implementação mais simples que, na minha opinião, é o WCF direto com o uso de resultados JSON e algum comportamento de substituição no Global.asax.cs para lidar com condições de erro. Se a documentação de uma API incluir instruções curl, e você puder exercitar toda a funcionalidade da sua API com exemplos de curl, fica muito mais fácil para os clientes serem implementados em qualquer idioma que suporte interfaces da Web. É aqui que o WCF começa a cair. Ter uma API bem definida com documentação independente é melhor do que ter estruturas com ferramentas automatizadas ao lidar com sistemas externos. Falando como consumidor desses sistemas de outras plataformas.

Uma coisa além disso, é implementar seu cliente em dois idiomas diferentes. Faça um cliente em C #, mas também um no Node.js ou Python e veja como eles realmente se encaixam. Somente esse exercício ajudará você a se livrar das pontas soltas da sua API.

Tracker1
fonte