A Netflix publicou a Parte 3 de sua série Real-Time Distributed Graph (Grafo Distribuído em Tempo Real), detalhando a API de Execução gRPC que alimenta o servimento de consultas em um grafo com 8 bilhões de nós e 150 bilhões de arestas. A camada de servimento atinge latência sub-100ms em dezenas de milhares de consultas por segundo enquanto absorve 6 milhões de escritas por segundo. Os autores Nilesh Mishra e Ajit Koti explicam os tradeoffs de design que permitem essa escala.
A Netflix identificou dois padrões de acesso opostos. Consultas rasas-e-amplas—buscas de segurança como "quais dispositivos essa conta transmitiu nos últimos 30 dias?"—permanecem um salto de profundidade, mas se ramificam para centenas de arestas por conta ativa, exigindo filtragem temporal nas propriedades das arestas em escala. Consultas profundas-e-estreitas—rastreamentos de personalização como "me mostre o histórico de visualização de Stranger Things de um membro em todos os perfis"—encadeiam 3 a 4 saltos sequenciais, cada um dependente dos resultados anteriores. Uma travessia de 4 saltos executada do lado do cliente custa 40ms a 10ms por salto de rede antes de retornar qualquer dado comercial.
A Netflix escolheu execução breadth-first em vez de travessia depth-first. Depth-first serializa cada caminho através do grafo, agravando a latência proporcionalmente à profundidade de ramificação. Breadth-first despacha todas as arestas em um determinado salto em paralelo, aguarda a fronteira completa, depois avança. Para uma conta com 5 perfis, cada um tendo centenas de títulos, isso elimina um multiplicador de serialização 5× no loop interno.
A API de Execução gRPC codifica o plano de travessia completo—todos os saltos, filtros por salto, limites de ramificação—em um único RPC. A camada de servimento executa do lado do servidor, então os clientes emitem uma solicitação e recebem uma resposta independentemente da profundidade do salto. Isso remove a penalidade de round-trip do cliente e move o controle de execução para o limite do serviço onde a topologia de armazenamento é conhecida. O design da API segue padrões Gremlin: os chamadores encadeiam etapas de travessia e aplicam filtros de forma declarativa.
O armazenamento fica em KVDAL—uma Camada de Abstração de Dados Chave-Valor construída em Apache Cassandra. KVDAL usa um mapa de dois níveis: um record_id mapeia para itens ordenados (nós de destino e propriedades das arestas). Uma única busca em KVDAL recupera a lista de adjacência completa para um nó. Todo acesso ocorre sobre gRPC, tornando o backend de armazenamento intercambiável sem mudanças de código upstream. A implantação abrange 27 namespaces em 12 clusters Cassandra em 2.400 instâncias EC2, sustentando 2 milhões de leituras/seg e 6 milhões de escritas/seg em latência de milissegundos de um único dígito.
A Netflix avaliou bancos de dados de grafo nativos antes de se comprometer com essa pilha. Neo4j funcionou aceitavelmente em milhões de registros, mas degradou em centenas de milhões devido a requisitos de memória e limites de dimensionamento horizontal. AWS Neptune foi rejeitado por sua arquitetura single-writer, que causa gargalo na ingestão em tempo real de alto volume entre regiões. A abordagem adjacency-list-on-Cassandra troca expressividade de consulta nativa de grafo por previsibilidade operacional e escala horizontal.
Garantias de consistência durante travessia em um conjunto de dados ativo de 150 bilhões de arestas sob 6 milhões de escritas por segundo são uma restrição ativa em vez de um problema totalmente resolvido. Aplicação de schema—carregada em memória e rigorosamente validada na camada de servimento—previne caminhos de travessia inválidos de chegar ao armazenamento, protegendo contra planos de consulta que degradam sob distribuições de dados reais.
Para arquitetos construindo camadas de recomendação ou servimento de recuperação, o padrão da API de Execução gRPC (codificar o plano de travessia completo, executar do lado do servidor, retornar uma resposta) é o aprendizado portável. A matemática de 10ms-por-salto se aplica a qualquer armazenamento de grafo distribuído, independentemente da tecnologia de armazenamento subjacente.