Blog

Por que a Azion Escolheu o V8 para Edge Functions

Por que a Azion Escolheu o V8 para Edge Functions

Uma das principais vantagens do serverless é que grande parte da complexidade do desenvolvimento é abstraída, permitindo que os desenvolvedores se concentrem no que é mais importante: criar a melhor funcionalidade e experiência do usuário possível. Entretanto, de tempos em tempos, nós da Azion gostamos de compartilhar com nossos leitores algumas das técnicas que usamos nos bastidores para oferecer o melhor desempenho, segurança, economia e uso de recursos possíveis. A mais importante entre essas ferramentas é o V8 Engine do Google. O V8 Engine está integrado em nossa tecnologia principal, Azion Cells, e é o que está por trás de nosso novo produto de computação serverless, o Edge Functions, que agora está disponível com suporte a JavaScript.

Este post explicará o que é o V8, como funciona, os recursos que permitem sua velocidade, segurança e eficiência, e como o V8 permite que o Edge Functions da Azion leve a Serverless Computing para o edge da rede.

O que é o V8 JavaScript Engine?

V8 é o mecanismo de código aberto do Google para JavaScript e WebAssembly. De acordo com a especificação V8, “o V8 compila e executa o código-fonte JavaScript, trata da alocação de memória para objetos e realiza garbage collection de objetos que não precisa mais”. Isso quer dizer que o V8 traduz o código JavaScript de alto nível em code machine de baixo nível e, em seguida, executa esse código. Parte da compilação e execução de código envolve outras tarefas como gerenciar call stack e memory heap, armazenar cache e fazer garbage collection, fornecer tipos de dados, objetos e o event loop. A orquestração dessas atividades de runtime I/O internas garante a execução eficiente tanto para a memória quanto para o código.

Como o V8 funciona?

O V8 Engine segue várias etapas para compilar e executar o código JavaScript. O código-fonte é baixado da rede, cache ou service workers. Em seguida, ele é analisado em uma representação de suas partes componentes, chamada de Abstract Syntax Tree (AST) - Árvore de Sintaxe Abstrata - e alimentado no interpretador, que gera e otimiza o bytecode. O bytecode é de nível inferior do que as linguagens amigáveis, como o JavaScript, tornando-o executável pelo V8 Engine, mas não tão baixo (ou tão rápido) quanto o machine code.

Dessa forma, para processar o código com velocidade e precisão, o V8 Engine deve determinar se o bytecode deve ser executado como está ou otimizado em machine code. Essa avaliação é realizada pelo criador de perfil, que verifica se o bytecode pode ser otimizado em machine code pelo compilador. O compilador executa otimizações em tempo real, fazendo suposições com base nos dados de perfil disponíveis. Se alguma suposição estiver incorreta, o código não é otimizado em bytecode antes de ser executado. Uma representação visual desse processo está incluída abaixo.

O que torna o V8 rápido, eficiente e seguro?

Quatro funcionalidades que contribuem para o desempenho, eficiência e segurança do V8 são:

  1. garbage collection eficiente;
  2. uso de classes ocultas;
  3. caching inline;
  4. fine-grained sandboxing.

Garbage Collection efficiente

Garbage Collection é um processo que recupera a memória pela eliminação de objetos que não são mais necessários. Embora isso otimize o uso da memória, pode desacelerar o processamento, pois os processos devem pausar enquanto a garbage collection está ocorrendo. No entanto, conforme explicado na página GitHub do Projeto Chromium, o garbage collector do V8 “minimiza o impacto de interromper a aplicação” processando “apenas parte do object heap na maioria dos ciclos de garbage collection”. Além disso, o garbage collector “sempre sabe onde todos os objetos e ponteiros estão na memória. Isso evita a identificação falsa de objetos como ponteiros que podem resultar em vazamentos de memória. ” O resultado é uma alocação rápida de objetos, pequenas pausas na garbage collection e nenhuma fragmentação de memória.

Classes ocultas e Inline Caching

Classes ocultas e inline caching aumentam a velocidade e a eficiência de recursos do V8. Como o JavaScript é uma linguagem dinâmica, é difícil entender quanta memória e espaço há para alocar objetos, uma vez que suas propriedades podem ser alteradas durante o tempo de execução. Como resultado, a maioria dos mecanismos JavaScript usa armazenamento semelhante a um dicionário para propriedades de objeto, com cada acesso de propriedade exigindo pesquisa dinâmica para resolver a localização da propriedade. No entanto, esse processo é lento e exige muita memória. O V8 torna o acesso à propriedade muito mais eficiente, criando dinamicamente classes ocultas de objetos que podem ser reutilizados. Isso não apenas acelera o acesso à propriedade, eliminando a necessidade de pesquisas de dicionário, mas também permite o inline caching.

Inline Caching, conforme observado em um post do GitHub de 2016, “leva uma operação que normalmente requer uma série de verificações importantes e gera código especializado para cenários específicos e conhecidos, onde o código especializado não contém essas verificações”. Como resultado, o V8 é capaz de gerar machine code com rapidez e eficiência.

Sandboxing

Talvez a funcionalidade mais importante do V8, conforme usado no Edge Functions, seja o uso de sandboxing. Sandboxing é um mecanismo de segurança que isola programas em diferentes ambientes para evitar vazamento de dados e mitigar o impacto de falhas de sistemas e vulnerabilidades de software. A API do V8 embedder inclui uma classe chamada isolates, em que cada uma representa um único ambiente de execução JavaScript. Ao usar o V8 como nosso mecanismo JavaScript para Edge Functions, a Azion é capaz de manter cada função segura e isolada uma da outra, sem executar cada função em uma VM ou contêiner separado, reduzindo drasticamente o uso de recursos e - como resultado - reduzindo o custo e tempo necessários para executar cada função.

Como o V8 habilita o Edge Function da Azion?

Como a Computação Serverless funciona?

O Edge Functions é um produto que permite aos desenvolvedores criar e executar facilmente funções serverless orientadas a eventos no Edge da rede. Quando as funções são solicitadas, elas executam no Edge Node mais próximo dos usuários finais e escalam automaticamente, sem a necessidade de provisionar ou gerenciar recursos. Como resultado, os usuários podem pagar apenas pelos recursos usados e reduzir significativamente o tempo gasto em tarefas de configuração e gerenciamento de roteamento.

Entretanto, a combinação da facilidade de uso e custo-benefício do serverless com a velocidade de Edge Computing apresenta muitos desafios nos bastidores. A computação serverless torna possível a escalabilidade automática, através da atomização de aplicações em tarefas discretas que são pequenas, independentes e stateless. Como o estado não é preservado entre invocations, as funções podem ser executadas quando são necessárias e parar de funcionar durante os períodos de inatividade. Mas este processo de parar e iniciar consome tempo e recursos de computação, especialmente quando as funções são executadas dentro de contêineres, como é o caso com AWS Lambda e das soluções serverless de provedores cloud.

Como o V8 Aprimora a Computação Serverless?

Ao escolher o V8 como o JavaScript engine do Edge Functions, a Azion é capaz de executar funções em um ambiente multitenant, o que resulta em mais velocidade e eficiência de recursos do que o AWS Lambda e os produtos tradicionais de computação serverless. A multitenancy reduz significativamente o consumo de recursos de duas maneiras. Primeiro, sem a necessidade de particionar recursos como CPU, I/O de disco, OS e memória em contêineres separados, pois há muito menos sobrecarga necessária para executar cada função. Além disso, cada função não requer seu próprio tempo de execução separado. Como resultado, os tempos de execução não precisam ser interrompidos e iniciados entre cada invocation de uma função, exigindo muito menos poder de computação.

O uso eficiente dos recursos não é bom apenas para o planeta, mas também para as empresas que optam por construir com a Azion. Eliminar a necessidade de executar funções em contêineres significa menos configuração, uma vez que as soluções baseadas em contêineres exigem que os desenvolvedores aloquem uma certa quantidade de memória para cada função com antecedência. Além disso, menos poder de computação significa menos custos operacionais.

Finalmente, e o mais crucial para Edge Computing, executar funções em um ambiente multitenant resulta em menor latência. Funções que são executadas em contêineres são desativadas durante períodos de inatividade; quando uma função é chamada novamente, seu contêiner deve ser ativado, resultando em um atraso de meio segundo conhecido como cold start. Ao usar o V8 para isolar cada função, em vez de recipientes, a Azion elimina cold starts, reduzindo assim a latência e tornando o desempenho mais confiável e previsível.

Operar milhares de contêineres em pontos de presença distribuídos em todo o mundo teria um custo proibitivo; é por isso que soluções em cloud como AWS Lambda são fornecidas a partir de data centers centralizados. Como multitenancy permite o uso muito mais eficiente dos recursos, a Azion é capaz de executar funções orientadas a eventos em pontos de presença distribuídos no mundo inteiro, executando-as quando e onde são necessárias no PoP mais próximo do usuário final. Além disso, menos tempo de transmissão de dados indo e vindo significa menos tempo gasto na execução de cada função, resultando em custos mais baixos para o compute time cada vez que uma função é chamada.

Vantagens do Edge Functions

Com o Edge Functions, os desenvolvedores podem criar e executar aplicações edge-native que combinam o poder de Edge Computing com os benefícios do serverless. Nossa escolha de usar o V8 como o JavaScript engine para Edge Functions significa que as empresas colhem as vantagens do que há de melhor:

  • segurança;
  • velocidade;
  • eficiência de recursos;
  • eficiência de custos;
  • facilidade de uso.

Como resultado, o Edge Functions é uma solução ideal para uma variedade de casos de uso, como por exemplo:

  • fácil modernização das aplicações monolíticas;
  • construção de aplicações de latência ultra-baixa;
  • programação orientada a eventos;
  • redução de custos;
  • adição de funcionalidades de terceiros às aplicações;
  • maior agilidade e aceleração do tempo de início das atividades de comercialização.

O Edge Functions está agora disponível com suporte a JavaScript para todos os usuários Azion. Para ler mais sobre Edge Functions, visite nossa página de produto ou crie uma conta gratuita registrando-se como um novo usuário Azion hoje.