Por Benedicto Franco Jr. 19.8.09
Muitos de nós já fomos testemunhas e presenciamos tendências tecnológicas virem com intensidade e se dispersarem tão rapidamente como surgiram.
Há alguns anos acompanho a popularização e a adesão de padrões de infraestruras e plataformas para suportar aplicações web. A decisão de usar uma ou outra solução é com freqüência respaldada por casos de sucessos. Notadamente é considerável o peso dado ao que a start-up de sucesso do momento está utilizando. Tais decisões levam a uma reação em cadeia que direciona o mercado de desenvolvimento de software de uma maneira bem significativa.
Uns dos mais populares stacks de hoje tem uma abreviação peculiar: LAMP. Esta combinação de letras são, na verdade, atalhos para os mais famosos projetos open source que se tem conhecimento: Linux, Apache (servidor HTTP) e MySQL. A última letra desta seqüência merece um destaque pela sua ambigüidade pois pode simbolizar a inicial de uma entre as mais populares linguagens script (Python, PHP e Perl).
Particularmente acredito que esta decisão arquitetural é acertada para 95% (se não mais) dos casos, mas ter a certeza que não estaremos entre os 5% restantes em nenhuma condição, é uma resposta que poderíamos obter apenas vinda de uma divindade suprema.
A web e sua intrínseca dimensão global tem o potencial de levar os mais experientes dos arquitetos de sistemas de volta aos bancos altos de suas pranchetas, carregando consigo um problema que pode consumir muito capital, humano e não, que deve ser amenizado idealmente em questão de horas ou, no mais tardar, em dias.
Escalabilidade é um tema bastante complexo e armazenamento e processamento de grandes volumes de dados são focos de pesquisas que estão bem aquecidas hoje em dia. Um dos mais ativos movimentos nesta linha está tomando forma, encorpando e sendo batizado. Chama-se NoSQL.
Em um livro recém lançado intitulado "Hadoop: The Definitive Guide" (escrito por Tom White) há uma passagem digna de nota (em uma tradução livre):
..."Este é o resumo de como a história acerca de escalabilidade no uso de um banco de dados relacional se desenrola. A seguinte lista assume uma aplicação de sucesso, de demanda crescente.
Adiciona-se "memcached" ao sistema para que as requisições mais comuns se mantenham em memória. As leituras ao banco de dados não são mais estritamente ACID; dados armazenados em memória devem ser invalidados por algum mecanismo.
Novos recursos implementados no sistema aumentam a complexidade das consultas SQL; agora temos muitos "joins":
Desnormalização dos dados para reduzir "joins" (Isto não é o que eles ensinam na escola para DBA).
Pára-se com qualquer processamento no lado do servidor.
Cria-se periodicamente "views" materializadas das consultas mais complexas, tenta-se eliminar "joins" na maioria dos casos.
Elimina-se índices secundários e "triggers" (sem índices?)."...
Quantos de nós estamos envolvidos com sistemas que estão nesta rota? Será mesmo que nossas aplicações nunca atingirão tais níveis?
Nessa discussão, surgiu por acaso a opinião de um especialista em bancos de dados que fez seu discurso sustentado pelos mais altos títulos acadêmicos. Nesse almoço informal, em uma roda de nerds, a variável derradeira eleita foi a de volume de dados, sendo um bilhão de registros a fronteira limite que deveria definir o uso do tradicional ou de alternativas NoSQL. É uma fórmula simples, fácil de monitorar mas ingênua por demais.
Um sistema ao atingir tamanha proporções será inevitavelmente complexo e rico em recursos que foram implementados durante sua natural evolução. Isto tornará inviável qualquer mudança de porte a um custo aceitável. Reescrever o sistema pode até ser mais econômico em alguns casos.
O fundamental da arquitetura, seja ela de sistema ou não, é primar pelo alicerce. Escalabilidade é um dos muitos requisitos que costumamos subjulgar, deixando-o de lado, delegando completamente ao hardware e a soluções out-of-the-box essa incumbência.
A promessa NoSQL consiste em endereçar os requisitos de escalabilidade através de camadas de software que implementam suporte a processamento e sistema de arquivos distribuidos em uma rede de servidores comuns. Em conjução, um efetivo sistema de gerecencimento de recursos enfatiza que a adição, remoção ou uma eventual falha de qualquer um desses componentes não comprometam ou exijam qualquer intervenção na aplicação.
Há várias empresas sérias já fazendo uso dessas tecnologias e até mesmo oferecendo-as como serviços a preços competitivos.
O questionamento agora girará em torno de qual platforma usar em nossos novos projetos: LAMP ou LANP.
HBase: http://hadoop.apache.org/hbase/
Cassandra: http://incubator.apache.org/cassandra/
PS.: Sugestões de temas para os próximos posts serão bem vindas!
Bene BigTable Cloud NoSQL
Marcadores: Bene BigTable Cloud NoSQL
Seu post foi muito interessante e fez refletir. Mas, pelo menos para mim ainda ficou uma interrogação... ou melhor, uma nuvem (risos).
O que é utilizado para recuperar os dados ? Fazer uma busca ou inserção no lugar do SQL ?
21/8/09 8:40 AM
A sua pergunta é provavelmente merecedora de um outro "post".
Resumidamente, cada solução NoSQL implementa um conjunto próprio de APIs que por hora, não são padronizadas.
Estas APIs são expostas à aplicação através de classes em Java, pelo uso de "frameworks" que encapsulam serviços como o Thrift ou via web service (RESTFul).
Uma característica importante desses sistemas está no fato que eles são orientados a documentos tendo tuples (conjuntos de chave/valor) como estrutura de dados fundamental.
A grande maiorias dessas soluções são baseadas ou inspiradas por um componente crítico para o Google conhecido como Bigtable.
Estas soluções são indicadas / utilizadas apenas para aplicações Web / sites ou também são utilizadas com eficiência para soluções corporativas com transações mais complexas ?
24/8/09 1:38 PM
A adoção destas soluções em ambiente corporativos ainda engatinha mas há alguns casos de sucesso em empresas como Visa, JPMorganChase, New York Times e outros.
Em todos esses casos, estas soluções são utilizadas principalmente para análise, agregação e classificação de grandes volumes de dados para a obtenção de informações estratégicas e padrões estatíscos. Após estes enriquecimentos, tais informações são utilizados para determinar comportamento de usuários, autenticidade de transações financeiras ou como dados de treino para aplicações que se utilizam de algorítmos como o de machine learning.
Em ambientes OLTP, haverá uma espera pelo amadurecimento destas soluções alternativas até que provem serem tão robustas quanto os bancos de dados tradicionais de hoje.
25/8/09 5:22 AM
Legal o post Benedicto, parabéns! Gostaria só de deixar um comentário (ok, 1 ano e meio após o post mas que ainda é atual...) sobre a minha pouquíssima experiência sobre o uso de BDs noSQL (realmente sou um newbie no assunto).
Há um tempo atrás eu comecei a estudar um pouco de noSQL porque tinha interesse em utilizar uma solução desse tipo em um projeto open source que participo. Como eu não gosto muito de fazer as coisas às cegas, fui pesquisar em alguns livros sobre MongoDB, Cassandra e CouchDB, para saber onde estava pisando. Um ponto interessante que todos abordam é exatamente onde se encaixam as soluções noSQL e, uma coisa fica clara em toda literatura: os bancos noSQL não vêm para substituir bancos relacionais, mas sim para preencher uma lacuna que sempre era (e ainda é) preenchida com os BDs relacionais mas exige um malabarismo imenso, torto e complexo. O que acontece é que existem certos problemas que justificam o uso de soluções noSQL e outros não, por exemplo, se você tem um sistema no qual não há manipulação massiva de dados e escalabilidade não é necessariamente um problema, então é provável que um banco de dados relacional deve funcionar sem problemas! Outro fator que entendi (claro que eu posso estar totalmente errado) é que se eu pretendo utilizar somente uma máquina como banco de dados então não faz sentido utilizar um banco noSQL. Isso a princípio me deixou relativamente desapontado porque parece que os noSQLs não servem para o tipo de problema que eu quero resolver (na verdade eu realmente queria usar um noSQL), mas por outro lado fiquei satisfeito porque pelo menos foi definido um contexto mais claro de uso dessa solução. Por essas razões eu acabei optando por ficar no bom e velho MySQL, mas reitero que eu realmente gostaria de utilizar um banco noSQL!!!
Resumindo, na minha opinião, eu acho que os bancos de dados noSQL vieram para ficar e já são realidade. Acredito que ainda falta explorar um pouco mais essa fronteira de onde e como eles podem ser utilizados, mas creio que isso é questão de tempo. De qualquer forma, o assunto é muito interessante e acho que realmente vale a pena estudar e entender um pouco mais sobre.