Twitter Finagle: Desenvolvendo sistemas distribuídos
Entenda como ele vem revolucionando a forma como várias empresas constroem suas soluções de alta performance.
Deste modo será possível entender
porque ele é uma opção viável para o desenvolvimento de sistemas escaláveis e porque
ele vem sendo adotado cada vez mais por empresas de internet e Startups para a criação
de soluções de alta performance.
Vivemos um momento interessante no mercado de tecnologia: a cada dia surgem várias empresas de internet, ou mais precisamente, “startups”, procurando emplacar um novo produto e arrebatar a atenção (e o dinheiro) da maior quantidade de público possível.
Mas algo elas têm em comum: pressa, pois a máxima “tempo é dinheiro” nunca foi tão verdadeira.
Essa urgência de construir soluções a um baixo custo, em tempo recorde e com qualidade faz com que essas empresas novas, ao contrário da maioria das corporações estabelecidas, busquem criar ou reaproveitar softwares inovadores, algumas vezes pouco conhecidos, que nem sempre estão baseados em algum padrão de mercado, que sejam preferencialmente open source e que deem conta do recado, tanto em agilidade de desenvolvimento quanto em performance e estabilidade.
Foi nesse contexto que anos atrás o Twitter criou toda uma linha de ferramentas e frameworks para construir uma solução mais robusta e compatível com suas necessidades de desempenho e escalabilidade. Estamos falando do Finagle, tecnologia que vem revolucionando a forma como as soluções são construídas em grandes empresas como o próprio Twitter, Foursquare, Pinterest, SoundCloud e Tumblr.
O Finagle permite a construção de sistemas fortemente orientados a serviços, fazendo uso extensivo de IO não bloqueante (NIO) e processamento concorrente, além de aceitar múltiplos protocolos de comunicação e não ser executado em servidores de aplicação como o JBoss AS ou o Oracle WebLogic.
Um detalhe interessante e fundamental: o Finagle não está totalmente comprometido em seguir alguma especificação ou padrão pré-estabelecido de desenvolvimento e justamente por esse motivo não está preso a tradicionalismos ou restrições técnicas da plataforma Java EE ou qualquer outra.
Além disso, ressalta-se que o Finagle foi criado para ser executado sobre a Java Virtual Machine e o desenvolvimento das aplicações pode ser feito tanto em Java quanto em Scala (que gera bytecodes compatíveis com a JVM). Como a equipe de engenheiros do Twitter desenvolveu boa parte do Finagle com a linguagem Scala, algumas APIs e classes requerem alguma adaptação para serem utilizadas quando desenvolvemos com Java. Outra característica marcante desse framework é ser nativamente integrado com ferramentas de monitoramento, rastreabilidade de execução e clustering.
O que é o Finagle?
O Finagle é um framework para construção de sistemas distribuídos extensível e configurável para a JVM, sendo empregado para construir servidores altamente concorrentes e de alta performance.
Através de sua API é possível implementar tantos clientes quanto servidores e por ser extensível, permite customizações nos protocolos de comunicação e na configuração de funcionalidades dos servidores e clientes, como adição de rastreabilidade, log e métricas, oferecendo também mecanismos para compor serviços a partir de serviços pré-existentes, levando o reaproveitamento ao máximo.
Os seguintes objetivos guiaram a idealização desse framework:
· Não ser apenas um framework web: o Finagle pode ser usado para criar Web Services, RESTful Services e outros tipos de serviços, com contratos complexos e suportando inclusive protocolos especializados, além do HTTP;
· Isolar responsabilidades e preocupações: de acordo com as melhores práticas de arquitetura SOA, sabemos que um serviço deve ser coeso, com responsabilidades bem definidas e focado apenas em fazer aquela função para o qual foi criado. No Finagle essa prática de divisão de responsabilidades é encorajada, pois ele oferece uma API especializada para composição de serviços;
· Confiabilidade e isolamento de falhas: Cada servidor Finagle é executado em sua própria JVM e deve ser responsável por apenas um serviço. Se esse servidor falhar por qualquer motivo, pode ser mais facilmente recuperado ou reiniciado do que se estivesse sendo executado em um servidor de aplicações, por exemplo. Por default, cada servidor possui também mecanismos de detecção de falhas, balanceamento e reconexão com outros servidores;
· Produtividade de desenvolvimento: o Finagle vem acompanhado de ferramentas para geração de código de clientes e servidores e essas ferramentas se encarregam de boa parte da complexidade acidental do desenvolvimento, que é aquela que não tem nada a ver com o negócio, por exemplo, tratamento de conexões de rede, protocolos, IO etc.
Os engenheiros criadores do Finagle também chegaram à conclusão de que apenas através do uso de abstrações corretas de processamento concorrente, assincronismo e IO não bloqueante seria possível construir servidores que fossem capazes de atender a características de performance tão grandes, a um custo compatível. Partindo deste princípio, eles definiram as seguintes abstrações arquiteturais: Server, Service, Filter e Future.
Abstrações do Finagle
A abstração central do Finagle é o Serviço (Service) e qualquer implementação dessa abstração deve estender a classe com.twitter.finagle.Service. Conceitualmente, um Service é uma “Interface funcional”, um conceito novo do Java 8, mas bem conhecido principalmente em linguagens de programação que seguem o paradigma funcional.
Uma interface funcional, tal qual descrito na documentação do Java 8, tem exatamente um método abstrato que aceita exatamente um parâmetro e retorna uma resposta. No caso do Serviço, esse parâmetro é do tipo “Request” (requisição) e o segundo parâmetro é do tipo “Response” (resposta), por exemplo, se estamos criando um serviço que utiliza o protocolo HTTP, o “request” será do tipo HttpRequest e o resultado HttpResponse.
Por sua vez, se o serviço utilizar o protocolo Thrift, o “request” e “response” serão do tipo byte[] (array de bytes).
Serviços que trabalhem com protocolos mais complexos como o Thrift (ver BOX 1) podem ser criados a partir de IDLs (Interface Definition Language – vide BOX 2). As IDLs simplificam o processo de desenvolvimento, já que as interfaces de serviço descritas nessa linguagem servem para a geração de código através das ferramentas especializadas do Finagle.
BOX 1. O protocolo Thrift
" [...] continue lendo...Artigos relacionados
-
Artigo
-
Artigo
-
Artigo
-
Artigo
-
Artigo