Arquitetura e armazenamento: Como funciona a Netflix?

Tal como outras empresas que operam a grande escala, também a Netflix sabe que processar e disponibilizar muitos dados não precisa de acontecer com efeito imediato, pelo que construiu uma arquitetura apostando num processamento offline, online ou nearline, com o objetivo de reduzir a latência. Utiliza o primeiro de forma a poder efetuar testes em modelos para poder utiliza-los mais tarde, o segundo para recolher informação de utilizadores em tempo real e o terceiro para quando os dados precisam de ser recolhidos em tempo real, mas guardados para posterior utilização.

Maneira de processar dados

A Netflix possui uma relação de parceria com a Amazon pelo facto de utilizar os seus serviços web para correr o seu site e o seu motor de recomendações, realizando também o upload de conteúdos na Amazon Cloud, apesar de realizar a codificação pretendida antes de distribuir os conteúdos para poderem chegar e ser visualizados pelos clientes. A empresa possui todos os seus conteúdos armazenados na sua própria rede (content delivery network, CDN), esta consiste numa rede global de servidores que guarda numa cache os conteúdos, cache esta que reduz a largura de banda necessária para a visualização dos mesmos, pelo que consequentemente acaba por baixar o custo do serviço, aumentando a escalabilidade do mesmo em grandes áreas podendo alcançar assim mais utilizadores. A Netflix é constituída por dois tipos de servidores com software open-source, ambos especializados no streaming de vídeo, um baseado em drives de disco rígido, os mais utilizados atualmente e outro em flash drives, ambos existem tanto para suportar grandes ou pequenos fluxos de utilizadores como para garantir redundância na rede. A Netflix tem uma grande diversidade de conteúdos, mais precisamente um petabyte, pelo que é em períodos calmos que realiza o upload dos mesmos nos servidores, de forma preditiva, ou seja, faz o upload dos conteúdos que pensa que as pessoas irão querer assistir, reduzindo a largura de banda necessária em períodos de grande utilização. Após carregar os filmes, séries ou documentários, estes ainda têm de chegar aos utilizadores a partir do CDN, isto acontece graças à existência dos ISP’s (internet service providers), que se ligam ao CDN, ou através de data centers ou de sistemas de armazenamento da Netflix, como podemos visualizar na Figura 4, normalmente os conteúdos já se encontram armazenados nos ISPs pelo que reduz eficazmente o custo da largura de banda aquando da sua saída para os utilizadores finais. Uma das grandes vantagens da Netflix possuir a sua própria CDN é poder controlar a sua rede numa forma end-to-end tornando possível a otimização do serviço e também o facto de conseguir descobrir de forma autónoma o mapeamento da rede, isto é, perceber qual a melhor localização para efetuar o streaming de cada conteúdo.

Codificação

A eficiência do armazenamento está maioritariamente ligada à codificação. Esta permite reduzir a taxa de transmissão para que o valor seja aceitável tanto para o canal como para o dispositivo onde o conteúdo vai ser recebido. A Netflix começou o seu serviço de streaming em 2007, usando codecs de vídeo VC-1 e de áudio WMA (Windows Media Audio, tendo os mesmos evoluído até aos dias de hoje para codecs H.264/AVC, VC-1, H.263 e H.265 (HEVC) para vídeo, e Dolby Digital, Dolby Digital Plus, Advanced Audio Coding (AAC) e Ogg Vorbis para áudio. A empresa usa a tecnologia de streaming adaptável de forma a ajustar a qualidade de vídeo e áudio de acordo com a velocidade de conexão de banda larga do cliente e as condições da rede em tempo real.

Codificação de Vídeo

A codificação de vídeo consiste na utilização de algoritmos que são capazes de explorar de forma eficaz a redundância espacial numa imagem e a dependência temporal entre imagens. A Netflix está a começar a render-se às novas tecnologias, utilizando técnicas de inteligência artificial para analisar cada frame num vídeo e comprimir sem afetar a qualidade da imagem, reduzindo assim a quantidade de dados utilizada. Os fundamentos da codificação de vídeo não mudaram muito até à data de hoje, o streaming de vídeo continua a ser produzido com o mesmo tipo de codificação usada no MPEG-1: é escolhida uma resolução da trama específica, juntamente com um GOP (group-of-pictures) que impõe imagens intra periódicas, e um bit rate de apenas uma ou duas vezes as tramas do vídeo utilizado como input. Muitas vezes a má qualidade da imagem impede os utilizadores de visualizarem os seus filmes ou séries preferidas na Netflix, isto acontece diversas vezes devido ao facto de existirem redes com uma largura de banda reduzida. Foi então por isso que a Netflix decidiu apostar e desenvolver algoritmos de compressão que fornecem a mesma ou melhor qualidade de imagem aquando da utilização de menos largura de banda. Começaram por desenvolver em 2015 o per-title encoding, no ano seguinte apostaram em melhores codificações para downloads em dispositivos móveis. Seguindo para a produção de uma framework de codificação designada Dynamic Optimizer. O Dynamic Optimizer analisa um vídeo dividindo-o em vários pontos de qualidade e resolução para assim obter uma melhor variedade de dados para tornar possível a otimização, sendo a codificação feita cena a cena. Em Dezembro de 2016, apresentaram dois novos codecs, AVCHi-Mobile e VP9-Mobile para downloads que fizeram frente aos codecs H.264/AVC ou AVC Main, utilizados anteriormente. Estas alterações levaram a um melhor desempenho de compressão comparado com o per-title encoding, pois inclui GOPs mais longos, otimização por bloco, entre outros. Todas estas modificações resultam numa melhor qualidade de vídeo para o mesmo bit rate. Além de usar novos formatos de codificação, a otimização das configurações do codificador permite melhorar a eficiência de compressão da seguinte forma:

Ambos utilizam a técnica de codificação per-chunk, onde o bit rate é otimizado de acordo com a complexidade das parcelas que estão a ser codificadas. O gráfico da figura em baixo representa a comparação entre estes novos formatos de codificação com o anterior, AVC Main. Sendo para isto calculados o PSNR e o VMAF (qualidade percetiva), medindo assim a qualidade de vídeo. As barras representam o ganho de bit rate e as maiores percentagens indicam uma maior poupança de bit rate, o BD-rate por sua vez indica a variação média na taxa de bits.

Poupança de rate em diferentes tipos de codificação.

Codificação de Áudio

Na codificação de áudio, a característica mais explorada é a irrelevância. Inicialmente o codec utilizado pela Netflix era o Dolby Digital 5.1, mas trouxe diversos problemas devido ao facto de não funcionar em alguns equipamentos eletrónicos, o que provocava o descontentamento a vários utilizadores, fazendo com que em 2017 a Netflix desenvolvesse o codec anterior, criando o Dolby Atmos que trouxe uma melhor imersão de som aos seus vídeos. Este novo codec de áudio é o melhor e mais recente codec utilizado. Cria um ambiente de imersão semelhante a estar num globo, com a ajuda de altifalantes, que fazem com o som surround esteja presente em qualquer lugar da sala, e que os misturadores de som se movimentem simulando, por exemplo, uma mota a circular em torno de quem está a assistir, ou um pássaro a voar, devolvendo o som com uma enorme precisão. Este codec trouxe uma mais valia a este valioso serviço, pois faz com que os clientes possam viver o realismo da história como se fizessem parte dela. Outro codec também utilizado é o HE-AAC, que combina o baixo rate com uma elevada qualidade de áudio, possuindo uma compressão de áudio lossy, sendo por isso um dos mais desejados e utilizados pela empresa.

Protocolos de Transmissão da Informação

Para transmitir a informação entre os servidores e o dispositivo do cliente, a Netflix utiliza uma técnica chamada Adaptive Bitrate Streaming. Esta técnica descobre a largura de banda que o utilizador tem disponível e qual o CPU do dispositivo que está a ser utilizado, de forma a poder adaptar o débito do conteúdo ao ambiente em questão. No início da transmissão é enviado ao cliente um “catálogo” com os segmentos e os débitos. Quando o utilizador acede ao ficheiro multimédia, o seu computador vai pedir os segmentos com menor débito até encontrar o débito ideal para a largura de banda de que dispõe. Após este processo, o vídeo irá ser transmitido no débito encontrado anteriormente. A técnica utilizada tem como vantagens a sua simplicidade e a flexibilidade que trás ao serviço e o facto de dar ao cliente a melhor qualidade possível dentro dos recursos existentes em tempo real. O Adaptive Bitrate Streaming funciona sobre o protocolo HTTP (Hyper Text Transfer Protocol Secure). O stream HTTP é exclusivamente direcionado ao cliente o que torna a implementação por parte do fornecedor de conteúdo menos complexa e toda a adaptação tem que ser feita no dispositivo do cliente. Em 2015 a Netflix decidiu adotar o HTTPS (Hyper Text Transfer Protocol Secure) para todas as suas ligações e não só para aquelas onde o utilizador inseria dados pessoais como até então.

Metadados

O Netflix contém mais de 30 milhões de subscritores em mais de 40 países, o que acaba por gerar um elevado número de pedidos por dia, sendo assim necessário o uso de metadados para responder a esta dimensão de pedidos. Cada pedido pode envolver uma grande diversidade de atributos de metadados, pelo que para reduzir a latência no acesso aos dados estes são armazenados na RAM dos servidores responsáveis. Existem então duas aplicações responsáveis por este procedimento, o VMS, onde são guardados dados sobre vídeos, como resumos e títulos e o NetflixGraph, que por sua vez contém dados sobre as relações entre vídeos, personagens e etiquetas, como corajoso, engraçado, entre outros, que permite então construir as recomendações que o Netflix dá aos seus utilizadores. Esta recomendação começa com a numeração de 1 a n dos objetos, e o valor atribuído a cada objeto é intitulado como “ordinal”, sendo então necessária uma estrutura de dados, mais precisamente uma lista de inteiros, para manter as relações entre ordinais, estando estes ligados entre si por alguma propriedade, como podemos verificar na figura em baixo.

Relação entre objetos e propriedades.

Quando é necessário encontrar um conjunto de ligações entre propriedades e ordinais, é necessário realizar os seguintes procedimentos:

  1. Encontrar o ordinal do objeto
  2. Procurar o ponteiro do objeto no byte array
  3. Encontrar a primeira propriedade do tipo de nó encontrado
  4. Ler quantos bytes são usados para representar esta propriedade e incrementar o ponteiro com o valor de bytes descoberto
  5. Avançar para a próxima propriedade no esquema
  6. Descodificar iterativamente valores no byte array, cada vez que o valor atual é adicionado ao anterior
  7. E por último, retornar os objetos que correspondiam aos ordinais analisados.

É então desta forma que a Netflix recomenda filmes aos seus utilizadores.