Post original por Jeff Barr | em 06 setembro 2016
O AWS Community Hero Onur Salk escreveu o guest post abaixo, para contar como ele ajudou o seu empregador a se deslocar para uma arquitetura sem servidor.
— Jeff;
Sou Onur Salk, AWS Community Hero, AWS Certified Solutions Architect – Professional e organizador do grupo de usuários da AWS na Turquia. Como um Herói, eu gostaria de compartilhar minha experiência e conhecimento sobre a AWS com a comunidade no meu blog pessoal e através de encontros com a comunidade. Hoje eu quero compartilhar a história da Yemeksepeti e nossa mudança para a arquitetura sem servidor.
A história da Yemeksepeti
A Yemeksepeti é a maior empresa de encomendas online de alimentos na Turquia. Ele permite aos usuários fazer pedidos de comida de restaurantes de redes afiliadas sem cobrar qualquer taxa extra. Na Yemeksepeti, precisávamos criar um serviço globalmente distribuído que fosse escalável, de alto desempenho e econômico. Acreditamos que, ao projetar uma arquitetura sem servidor, não teremos que nos preocupar em como gerenciar nossos servidores e assim podemos remover um monte de encargos operacionais da nossa equipe. Isto significa que podemos nos concentrar na execução do nosso código em grande escala.
No Yemeksepeti.com, foi desenvolvido um sistema de descontos em tempo real chamado Joker há cerca de quatro anos. O objetivo deste sistema é o de sugerir descontos para clientes que normalmente não é possível encontrar em restaurantes. A plataforma Joker original foi desenvolvida em .NET e, em seguida, integrada com o site e dispositivos móveis usando sua API REST. Fomos convidados a abrir API da plataforma para a nossas empresas irmãs operando em 34 países, para que eles também possam fornecer descontos Joker em tempo real para os seus clientes.
Inicialmente, pensávamos que iríamos compartilhar o nosso código e deixá-los integrar suas aplicações. No entanto, a maioria dos outros países estavam usando um conjunto de tecnologia diferente (linguagens de programação, banco de dados e assim por diante). Embora o uso de nosso código pudesse acelerar o seu desenvolvimento a princípio, eles teriam que manter um sistema desconhecido. É necessário encontrar um método de integração que fosse mais fácil de implementar e mais barato de manter.
Nossos Requisitos
Este foi um projeto global, e estes eram as nossas cinco áreas de enfoque:
- Facilidade de gerenciamento
- Alta disponibilidade
- Escalabilidade
- Uso em várias regiões
- Vantagem de custo
Nós avaliamos essas áreas de enfoque em vários modelos de processamento diferentes e chegamos à seguinte matriz:
|
Facilidade de gerenciamento
|
Alta disponibilidade
|
Escalabilidade |
Uso em várias regiões
|
Vantagens de custo
|
|
IaaS
Poderíamos ativar algumas instâncias do EC2 executando o IIS em cima do Microsoft Windows Server e conectar a uma instância do RDS DB.
|
Não. Precisamos cuidar de nossos servidores. |
Sim. Podemos distribuir nossos servidores para diferentes AZs. |
Sim. Podemos usar Auto Scaling |
Sim. Podemos usar AIMs e copiar entre regiões |
Parcialmente. Haverá taxas de licença e custos para a execução de instâncias do EC2. |
| PaaS
Poderíamos usar AWS Elastic Beanstalk.
|
Parcialmente. Precisamos cuidar de nossos servidores. |
Sim. Podemos distribuir nossos servidores para diferentes AZs. |
Sim. Podemos usar Auto Scaling |
Sim. Podemos usar configurações de ambiente, AMIs, etc. |
Parcialmente. Haverá taxas de licença e custos para a execução de instâncias do EC2. |
| FaaS
Poderíamos usar AWS Lambda.
|
Sim. A AWS cuida dos serviços. |
Sim. Já está altamente disponível |
Sim. Ele funciona em qualquer escala |
Sim. Podemos exportar/importar/fazer upload de nossas configurações facilmente. |
Sim. Não há licenças e pagamos apenas pelo que usamos. |
Decidimos usar Faas (Functions as a Service). Começamos o nosso projeto na região Europa (Irlanda) usando os seguintes serviços:
Arquitetura
Nossa arquitetura se parece com isso:

Amazon VPC: Nós usamos o Amazon VPC para lançar os nossos recursos em nossa rede privada.
Amazon API Gateway: Durante a fase de desenvolvimento, começamos a desenvolver o serviço na região Europa (Irlanda). Naquela época, o AWS Lambda não estava disponível na Europa (Frankfurt). Criamos duas APIs: uma para a integração web e outro para a interface de administração. Usamos autorizadores personalizados com JSON Web Tokens (JWT) para permitir a autorização baseada em tokens para os nossos APIs. Usamos modelos de mapeamento para passar nossas variáveis às nossas funções lambda.

Na fase de desenvolvimento, houve apenas uma fase de teste para cada API.
Durante a fase de produção, o AWS Lambda se tornou disponível em Frankfurt. Decidimos mover o serviço lá para nos beneficiarmos do acesso com baixa latência a partir da Turquia. Nós usamos o recurso API do API Gateway Export para exportar a nossa configuração no formato Swagger, em seguida, importou para Frankfurt. (Antes da importação, nós mudamos as definições de região no arquivo exportado para a eu-central-1). Depois disso, foi criada uma fase de produção e utilizadas variáveis de palco para parametrizar as nossas definições de banco de dados das instâncias do Amazon RDS (como host, nome de usuário e assim por diante). Também queríamos usar o nosso nome de domínio personalizado. Depois que compramos um certificado SSL para o nosso domínio, criámos um nome de domínio personalizado no console Amazon API Gateway e criamos um alias para o nosso nome da distribuição do CloudFront (o Amazon API Gateway utiliza o Amazon CloudFront no fundo). Finalmente, criamos uma função IAM para habilitar o registro do Amazon CloudWatch para chamadas de API, latência e mais.
Métricas para recursos Get_Joker_offer:

AWS Lambda: Durante a fase de desenvolvimento, usamos Python para desenvolver o nosso serviço e criamos 65 funções para integrar os nossos métodos de API e tarefas agendadas utilizando triggers Lambda do CloudWatch Events. A integração do Lambda VPC tornou-se disponível durante a fase de produção, de modo que nos carregamos nossas funções para a região de Frankfurt e as integramos com o VPC.
Contagem de invocação da função Get_joker_offer Lambda (Os picos correspondem aos horários de almoço e jantar (quando as pessoas estão com fome)):

Amazon RDS: Durante a fase de desenvolvimento, optamos por usar o Amazon RDS para o PostgreSQL. Criamos uma instância single-AZ RDS para testar o nosso serviço. Durante a fase de produção, precisamos mover o nosso banco de dados porque migramos nossos APIs e funções para Frankfurt. Nós criamos um snapshot da nossa instância e usamos o recurso Copy snapshot do RDS, nós nos mudamos com sucesso o nosso banco de dados. Lançamos duas instâncias no nosso VPC: uma instância multi-AZ para a produção e uma instância single-AZ para fins de teste. Em nossas variáveis de estágio API, definimos os nomes dos endpoints e das nossas instâncias RDS para mapear a migração de dados para a instância apropriada. Nós também permitimos backups automatizados para ambas as instâncias.
Amazon S3: A plataforma Joker tem um painel de administração que é usado para o gerenciamento e relatórios de ofertas do Joker. Para hospedar esta interface de administração, que é basicamente uma Single Page Application (SPA) com AngularJS, foi utilizado o recurso de hospedagem de sites estático do Amazon S3. Toda a lógica e funcionalidade é fornecida através de métodos que funcionam no Lambda, por isso, não é preciso de um servidor para a interface admin:

Amazon CloudWatch: Nós usamos o serviço para monitorar o uso dos nossos ativos importantes e para receber alertas se algo der errado. Nós criamos um painel personalizado para monitorar a CPU do nosso banco de dados de produção, contagem de conexão, latências API críticas e as contagens de função e durações.
No nosso código Python, nós registramos as durações de cada método interno na CloudWatch para acompanhar o desempenho e encontrar os gargalos:

Aqui está o nosso painel no CloudWatch:

Amazon ElasticSearch: Durante a fase de desenvolvimento, o streaming do CloudWatch Logs para Amazon ES tornou-se disponível na região da Irlanda. Usando esse recurso, criamos um painel Kibana para monitorar algumas outras métricas a partir dos logs que geramos a partir de nosso código. Assim que o Amazon ES estiver disponível na região de Frankfurt, vamos usá-lo novamente.
Resultados iniciais
O sistema de Joker está em produção agora, como um piloto para uma pequena região de um país. Como você pode ver no gráfico seguinte, o crescimento do número de pedidos é promissor. Ao alavancar a arquitetura sem servidor, não tivemos de instalar e gerenciar um sistema operacional e dependências. Usando Amazon API Gateway AWS Lambda, Amazon S3 e Amazon RDS, nossa arquitetura é executada em um ambiente altamente disponível. Nós não precisamos aprender e gerenciar quaisquer recursos de replicação mestre-escravo ou ferramentas de terceiros. Como o nosso serviço recebe mais pedidos, o AWS Lambda acrescenta mais instância Lambda, para que ele funcione em qualquer escala. Nós somos capazes de copiar o nosso serviço para outra região usando os recursos de serviços da AWS, como fizemos antes de entrar em produção. Finalmente, nós não executar todos os servidores, por isso, beneficiar da vantagem de custo da arquitetura sem servidor.
Aqui está uma representação do número de encomendas feitas através do Joker:

O que vem agora?!
Esperamos que este serviço se espalhe para todas as 34 empresas-irmãs dentro da Delivery Hero Holding. Como o serviço é implementado globalmente, vamos implantar em outras regiões da AWS. Pretendemos escolher a região mais próxima à empresa. Para otimizar nossos custos, vamos comprar instâncias reservadas para as nossas instâncias RDS. Além disso, como nós monitoramos nossos métodos internos de duração, podemos refatorar e otimizar o nosso código e para que possamos diminuir o tempo de execução das nossas funções Lambda.
Acreditamos que o futuro da nuvem é FaaS. Nós gostaríamos de experimentar mais a medida que outros recursos, serviços e funções se tornarem disponíveis.
Como um AWS Community Hero, estou ansioso para compartilhar a história da Yemeksepeti com o grupo de usuários AWS na Turquia. Eu gostaria de ajudar as pessoas a explorar e alavancar a arquitetura sem servidor.
— Onur Salk
Deixe suas dúvidas e/ou comentários aqui ou escreva diretamente para o nosso colega Jeff Barr (em inglês).