A revista digital Medium migrou seu sistema para uma nova arquitetura baseada em React.js e GraphQL. Sasha T. Solomon, engenheira da Medium, explicou os dois grandes objetivos dessa migração, disponibilizar o novo sistema aos usuários sem prejudicar o desenvolvimento de novos recursos.
Migrar um sistema que está usando uma tecnologia um pouco mais antiga não é uma decisão fácil de tomar. Além dos custos, deve-se levar em conta quanto tempo levará até que os usuários vejam os benefícios do novo sistema implantado e, possivelmente, não seja possível aguardar a migração inteira antes que isso aconteça. Além disso, é necessário garantir que seu sistema permaneça estável durante toda a migração e que possa evoluir, corrigindo bugs ou implementando novos recursos.
Cinco anos depois do desenvolvimento inicial de sua plataforma, esse era exatamente o caso da Medium, como explica Sasha:
Migrar um sistema inteiro para novas ferramentas e estruturas não é uma tarefa fácil. E fazendo isso sem afetar o desenvolvimento de recursos? Isso é ainda mais difícil
A equipe de engenharia da Medium planejou um caminho para a migração de seus serviços, com o objetivo de permitir que as pessoas começassem a usar o novo sistema o mais rápido possível e, ao mesmo tempo, sem prejudicar as mudanças no sistema existente.
A primeira etapa da migração foi reescrever a Medium com o React.js na parte cliente e usar GraphQL como uma camada de interface para a API existente. No client-side com o GraphQL, a Medium usa o framework Apollo Client.
Nesta fase, o antigo e o novo sistema coexistiam, cada um servindo um conjunto diferente de páginas. Essa abordagem teve o benefício de não exigir uma reescrita completa do lado do servidor e não afetou o desenvolvimento de novos recursos para o sistema antigo. Uma decisão importante tomada pela equipe foi usar protocol buffers para descrever a API legada como um esquema para fazer a interface com o GraphQL.
Em uma segunda fase da migração, que será começada em breve, o código do servidor será refatorado em serviços para alimentar a camada GraphQL, que usará o Sangria como sua estrutura no lado do servidor.
Espera-se que o uso do GraphQL traga uma grande vantagem, já que sua estrutura maior é mapeada diretamente em serviços mais modulares e mais simples, o que, por sua vez, deve melhorar seu desempenho também. Os novos serviços, que usarão o gRPC para conversar com o serviço GraphQL, podem ser construídos de maneira totalmente independente dos serviços antigos, enquanto os serviços antigos são mantidos em locais para alimentar a antiga API.