Passado e Presente

Felipe Cavani - 2016-03-20 07:27:33 -0300

Eu comecei a programar realmente em C, Delphi não conta. Foi em C que aprendi, busca, ordenação e estrutura de dados, algumas estruturas. Foi em C que eu aprendi a gerenciar a memória por conta própria, para meu desespero e do usuário final. Alocava o que precisava, no meu caso, trabalhava com imagens, e depois devolvia isso quando terminava. Também reaproveitava buffers e passava ponteiros para tudo quanto é lado. Ficava cultivando meus bugs. Mas no final conseguia resultados ótimos. Nessa época tive meu primeiro contato com threads, foi muito legal, consegui criar um pipeline para processar imagens de forma a aproveitar melhor o mísero processador que eu tinha. Depois com dois processadores e hipperthread foi tranquilo e rápido. Foi assim que eu me virava com C. C não tinha os excessos do C++, este que tem algumas coisas boas outras não tão importantes. Já nessa época sentia falta de uma forma de RPC que não exigisse que você fizesse muitas modificações no código, sem linguagem intermediária ou outras complicações. Eu precisava serializar um objeto ou estrutura e precisava que ela aparecesse na outra ponta do mesmo jeito, sem interoperabilidade entre linguagens, sem complicação, somente entre processos ou entre máquinas.

Go (golang)

gopher

Go é uma linguagem expressiva, concisa, limpa e eficiente. Seus mecanismos de concorrência tornam fácil escrever programas que aproveitam ao máximo a performance de computadores multicore e máquinas conectadas em rede, enquanto seu moderno sistema de tipagem possibilita a construção de programas flexíveis e modulares. Go compila rapidamente e ainda tem a conveniência do gerenciamento automático de memória e o poder do pacote reflex durante o tempo de execução. Go é rápida, com tipagem estática, compilada e que passa ao programador a sensação de linguagem interpretada com tipagem dinâmica.” (Extraído da documentação)

Simples assim, até o pacote reflect é simples, mas as coisas que você pode fazer com ele não são. Parece que quando começaram a juntar as ideias que formariam o compilador e a biblioteca padrão optaram por simplicidade e minimalismo, mas sem perder o poder do que pode ser feito por essa dupla.

Engraçado que uma coisa menor me chamou a atenção no Go. Gostei muito do pacote netchan, que unia a praticidade e poder dos canais com a comunicação por redes, indo além das fronteiras da máquina. E isso foi uma boa desculpa para aprender a lidar com as primitivas de concorrência. É muito prático lidar com as goroutines ao invés dos threads como em C, estas que na verdade nem threads são e sim threads leves gerenciados pelo próprio run-time. No final acabei conhecendo o resto da biblioteca e o netchan foi retirado da biblioteca, um dos motivos foi que não era possível tratar os erros provenientes da camada de rede de forma satisfatória.

O que a citação acima diz é verdadeiro. Consegui desenvolver alguns softwares não muito bons e outros interessantes. Dois deles que merecem destaque é o que gerencia este site e outro é o gormethods. Este último é meu sonho de realizar RPC de forma simples, se não simples pelo menos é de uma forma que me agrada. O gormethods possibilita o compartilhamento dos métodos de uma estrutura escritos em Go através de um canal de comunicação sem necessidade de alteração da API do seu aplicativo (além da inicialização do cliente), a forma que você escreve a estrutura e seus métodos é mantida, só é gerada uma estrutura que implementa uma interface igual a da estrutura original e esta é usada como cliente. Após isso, basta inicializar o servidor, compartilhar e no lado cliente instanciar esta estrutura e depois é só usar. O backend que gerencia este site discutirei a seguir.

O Backend

O backend foi desenvolvido em Go ao longo de… Desde quando a linguagem foi disponibilizada. Entretanto é verdade que muita coisa já foi reescrita e outras jogadas fora, pouco sobreviveu e o que tenho agora é uma arquitetura modular bem simples, muito parecida com os frameworks web que utilizam muitos midlewares, o que pode ser confuso, mas funciona.

A arquitetura do sistema é a microservices, onde temos vários serviços, cada um pequeno e com sua funcionalidade bem definida, estes serviços são interligados, conforme as dependência do sistema, com outro serviço ou outros dependendo da necessidade, a interligação é feita através de uma API, que normalmente é exposta em um protocolo de comunicação.

O sistema é composto por 13 serviços; são poucos serviços se comparado com um sistema de grande porte, mas este site é simples não havendo necessidade de mais que isso. Dois serviços se destacam: proxy e http. O proxy recebe as requisições e balanceia a carga para os https. Estas requisições são enviadas para os serviços http, este que é responsável pelo roteamento delas, processamento da camada web e por fim envia novas requisições para os outros serviços. Nos demais serviços é feito acesso ao sistema de arquivos, acesso ao banco de dados e acesso a outros serviços ou a serviços de terceiros.

O gerenciamento dos processos é feito pelo systemd, que é configurado para verificar se o processo está em execução e caso não esteja ele é reiniciado. O gerenciamento das configurações é feito pelo etcd, que é um banco de dados distribuído do tipo key-value. A descoberta de serviços também é feita pelo etcd.

Como este é um sistema simples que não necessita conectar ou ser conectado por outros serviços, optei por usar o gormethods como meio de transporte para os serviços. Apesar de possuir API simples e não impor esforço para adaptar a sua API a uma forma especifica de RPC, construir este protocolo foi o maior desafio deste projeto.

Anterior | Próximo