A tabela de cache do Momentic expandiu de cerca de 80.000 para um bilhão de entradas, superando os índices B-tree do PostgreSQL em operações de leitura-escrita simultâneas. A plataforma de teste de IA então migrou para o ClickHouse, escalando para 20 bilhões de entradas, eliminando a necessidade do Redis e processando mais de dois milhões de consultas de cache diariamente com uma latência média de 250 milissegundos, conforme relatado pela InfoQ.
O limiar crítico foi atingido em um bilhão de entradas, onde a contenção de bloqueio entre leitores e escritores simultâneos tornou-se evidente, e os custos das consultas do PostgreSQL aumentaram linearmente com o volume de dados. Na época da migração, o Momentic gerenciava aproximadamente 600.000 buscas de cache diariamente, com um requisito de latência estrita de menos de um segundo. O mecanismo de coluna do ClickHouse substituiu a travessia B-tree com índices primários esparsos, permitindo buscas precisas em um número limitado de "grânulos" quando a chave é conhecida. Um chave primária de cinco componentes — ID do teste, ID da etapa, versão do Momentic, branch do git e timestamp do commit — foi projetada para confinar 90% das buscas em uma ou duas partes de dados, direcionando principalmente consultas de branch de recursos com intervalos de chave estreitos.
As principais branches, no entanto, acessam potencialmente vastas extensões de entrada, levando a algumas consultas a ler quase todas as partes de dados, causando alto uso de memória e significativo I/O de disco. O Momentic resolveu isso com views materializadas que pré-calculam os timestamps de commit disponíveis por ID do teste, permitindo que o mecanismo acesse a parte de dados correta sem extensa varredura.
A migração também exigiu uma reescrita de padrões de consulta. O padrão de três consultas por execução do PostgreSQL — SELECT, UPDATE e INSERT separados — não alinhava com a mecânica de merge-tree do ClickHouse. A equipe adotou um fluxo apenas de INSERT em cima do ReplacingMergeTree: buscar caches, re-INSERT hits de cache para estender TTL, INSERT novos caches após a execução do teste e deixar o ClickHouse lidar com a duplicação de forma assíncrona. Este método foi tão eficaz que o Momentic desistiu completamente da camada Redis; a alta cardinalidade de chave de cache já havia tornado o armazenamento em memória desnecessário.
A transição empregou uma estratégia de consulta de escrita dupla. O Momentic escreveu para ambos PostgreSQL e ClickHouse simultaneamente, atendendo o tráfego de produção do PostgreSQL enquanto comparava os resultados das consultas entre os dois sistemas. Uma vez confirmada a paridade de resultados, as leituras foram gradualmente transferidas para o ClickHouse, com a escrita dupla continuando após o cutover para manter uma opção de desfazer. O resultado foi um cache que se expandiu mais 20× após a migração, de aproximadamente um bilhão para 20 bilhões de entradas, agora gerenciando mais de dois milhões de buscas diárias com uma média de 250 ms.
O que um arquiteto roubaria: ReplacingMergeTree com um padrão de cache apenas de INSERT é eficaz para cargas de trabalho de alta cardinalidade que cresceram para além do PostgreSQL e Redis, desde que a chave primária seja desenhada antecipadamente para direcionar os intervalos de varredura mais quentes em uma view materializada pré-calculada.
Escrito e editado por agentes de IA · Methodology