Cassio Greco - QConSP...Mais fácil escrever código em Go Mais fácil trabalhar com concurrency em...

Post on 04-Oct-2020

0 views 0 download

Transcript of Cassio Greco - QConSP...Mais fácil escrever código em Go Mais fácil trabalhar com concurrency em...

Cassio GrecoFundador da Conta Simples

em serviços financeirosPorquê usar Go

Agenda

1. Uma básica introdução sobre Go

2. Porquê e como usamos Go na Conta Simples

3. Resolvendo problemas complexos em Go

4. Conclusão

O básico sobre Go

● Procedural, assim como C

● Possui estruturas normalmente encontradas em OO, i.e. "polimorfismo" (interfaces)

● Possui ponteiros

● Fortemente e estaticamente tipado

● Utiliza garbage collection para livrar memória

● Compila diretamente em código de máquina compatível com vários SOs. Não precisa de VM

● Compilação muito rápida

● Criado para a nova web

● Opinionated, há uma única maneira de se fazer as coisas

● Não há exceptions. Erros são retornados pelas funções

O básico sobre Go

Porque e como usamos Go na Conta Simples

Motivação

● Estamos criando um banco do zero.

● Queremos criar um sistema que possa escalar daqui alguns anos

● Queremos uma linguagem que nasceu pra nova web e que possa se manter moderna nos próximos anos

● Queremos poder contratar desenvolvedores prontos para trabalharem ou que possam aprender e se adaptar rapidamente

● Queremos criar um sistema que seja performante

● Queremos escolher uma linguagem que nos permita ser produtivo

● Queremos uma linguagem que nos permita aproveitar as melhores tecnologias disponíveis hoje para facilitar a nossa vida

Motivação

Precisamos de uma linguagem que nos permite atender a todos os pontos mencionados

Java 8 vs Go

Porque escolhemos Go?

● Go é uma linguagem altamente opinionated. Mais fácil escrever código em Go

● Mais fácil trabalhar com concurrency em Go

● Go é mais rígido com tipos (valores nulos, ponteiros, referência, slices, etc.)

● Go é mais explícito, o que leva a menos bugs

● A compilação do código é muito rápida, especialmente comparada com Java

● Requer menos dependências para se criar um micro serviço e testá-lo

● Não precisa de uma máquina virtual, compila para quase código de máquina

● É muito fácil criar um micro serviço em Go. Ótimo para sistemas distribuídos

Criando um sistema distribuído em Go

API Gateway

Microservice

gRPC gRPC

gRPC

gRPC

Client

Client

Client Microservice

.

.

.

REST

REST

REST

● Criado para a nova web => facílimo a criação de servidores REST ou de RPC, precisando de poucas linhas e utilizando somente a standard library de Go

● Biblioteca de networking extensa dentro da biblioteca padrão de Go

● Criação de endpoints e chamadas de APIs não necessitam de bibliotecas de terceiros

Criando um sistema distribuído em Go

Sistemas distribuídos em Go

● Mas também há suporte para os mais diversos frameworks e bibliotecas para o desenvolvimento web em Go, como gRPC, Protocol Buffers, JWT, etc.

Sistemas distribuídos em Go

● Suporte para os mais diversos bancos de dados, queues, etc.○ Nos permite escolher a melhor ferramenta para a tarefa

Microservice

SQS

Microservice

Put Read

Sistemas distribuídos em Go

● O código é compilado para código de máquina compatível com os principais SOs: Linux, Windows e MacOS

○ Não precisa necessariamente de containers, apenas jogue o executável no servidor e rode

○ Não precisa de VM

Concorrência

Concorrência

● Altamente performante e concorrente

○ Compilado em código de máquina => nos permite economizar no número de servidores que usamos

○ Concorrência em Go é feita através de Goroutines○ Use a palavra chave go para executar código de maneira concorrente, e criar uma

nova goroutine

Concorrência● Comunicação entre goroutines através de channels

○ Permite compartilhar dados sem utilizar locks○ É blocking. A execução do programa irá esperar o envio de uma mensagem antes de

continuar

● Altamente performante e concorrente

Microservice

Processar pagamento

Enviar notificação

Atualizar limite

Concorrência

. . .

● Altamente performante e concorrente

Microservice

Batch

Gerar relatórios

Enviar relatórios

Concorrência

Produtividade em Go

Produtividade com Go

● Não precisa de um framework. Talvez alguma biblioteca de terceiro como gRPC ou Gorilla (para criação de endpoints). Mas são uma camada fina.

● Mensagens de erro são facilmente entendidas, apesar de não serem tão claras quanto em Elixir

● Go é altamente opinionated○ Há uma forma de se fazer as coisas. Um for loop, um if

● Testes são extremamente fáceis de escrever e rápidos de rodar

● Muito fácil de achar e instalar dependências: github.com/repositorio/biblioteca○ Inclusive dependências em repositórios privados

● Compilação do código muito rápida

● Bugs são menos comuns e mais facilmente resolvidos

● Código altamente explícito○ Mais boilerplate, menos erros

Produtividade com Go

● Go é extremamente produtivo

● Possível criar um micro serviço de geração de relatórios ou de notificações totalmente testado, com um único desenvolvedor, em 1 semana

● Extremamente fácil de aprender

● Comunidade enorme. Fácil de achar a resposta de suas dúvidas no StackOverflow ou em blogs

Produtividade com Go

A comunidade e integrações com Go

● Go foi criado para a nova geração da web

● Possui suporte para os mais diversos frameworks e bibliotecas para o desenvolvimento web

○ i.e. gRPC, JWT, SDKs para o AWS e GCE, Drivers para todos os bancos de dados, etc.

● Comunidade gigante e ativa no nível mundial○ Ainda não muito grande no Brasil, mas crescente

● Algumas das principais ferramentas e banco de dados modernos são escritos em Go

Go Node Python Rust Laravel Ruby

20172018

Alguns projetos em Go

Resolvendo problemas complexos em Go

Quando usar Go?Go é ideal para:

○ Sistemas web em geral

○ Sistemas distribuídos

○ Sistemas que requerem alta performance e/ou uso intenso de CPU

■ Há uma implementação do TensorFlow para Go■ O serviço com maior QPS, e de maior uso intensivo de CPU no Uber é escrito em

Go■ Background services

○ Sistemas que requerem alta escalabilidade

○ Sistemas financeiros

○ Sistemas que requerem alta concorrência

○ CLIs

Quando não usar Go?

● Protótipos e aplicações bootstrapped○ Go pode ser usado para micro serviços, mas é overkill para protótipos e scripts básicos

● Sistemas simples que não requerem muita performance ou garantias de tipos de dado

● Sistemas que requerem controle maior sobre a memória do sistema, como com Rust ou C

● Sistemas de telecomunicações. Use Erlang ou Elixir

● Se precisar de tipos genéricos

Quem está usando Go?

Go em Serviços Financeiros

Características de Serviços Financeiros

● Serviços financeiros hoje estão marcados por grandes bancos e instituições financeiras que usam tecnologias ultrapassadas

● Um setor que, até recentemente, não inovava há muito tempo

● Altamente regulamentado

● Sistemas que não deveriam cair nunca. É a sua conexão com o mundo

● Sistemas que atendem a milhões de pessoas e empresas

● Base de sustentação da economia

● Não pode falhar. Um zero a mais ou a menos pode causar muitos problemas

Go em Serviços Financeiros

Go nos permite desafiar o status quo, criando um sistema moderno, altamente performante, seguro e escalável e que ao mesmo tempo nos permite inovar de forma constante.

● Nos dá acesso às mais novas tecnologias

● Nos permite criar um sistema que possa ser usado por milhões de pessoas ao mesmo tempo

● Concorrência em Go é muito simples e segura

● Temos segurança aritmética e de tipos de dados (i.e. ints de 64 bits)

● Determinante. Compila para código de máquina e para vários SOs. Nos dá a segurança que o código que roda em nossas máquinas, rodará igual no servidor

● Nos permite testar nosso código de forma constante e de maneira muito rápida

● Nos permite ser altamente produtivos, conseguindo trazer a inovação de forma mais rápida para nossos clientes

Fintechs

Conclusão

Conclusão

Use Go

Conclusão

● Go é uma ótima linguagem para criar serviços web modernos, seguros e performantes

● Go permite a utilização do seu sistema com as mais diversas ferramentas

● Go foi criada para a nova web e é ideal para sistemas distribuídos

● Go também é uma ótima escolha para serviços financeiros pela segurança de tipos de dados, aritmética, velocidade e determinismo

● Go é uma linguagem muito produtiva de se trabalhar e fácil de aprender

● Consegue-se trabalhar com concorrência de uma maneira extremamente fácil com Go: use apenas a palavra-chave go e channels

● A comunidade e a adoção de Go por parte das empresas já está muito alta, incluindo Fintechs

● Go não é a linguagem ideal para algumas circunstâncias, como para a criação de protótipos

Obrigado

Cassio Grecohttps://contasimples.com

@cassiodgreco

cassio@contasimples.com