Como a Postman Engineering lida com um milhão de conexões simultâneas

A equipe da Server Foundation em Postman compartilha a história de origem do gateway de websocket Bifrost

(22 de dezembro de 2020)

No universo cinematográfico da Marvel, Bifrost é o nome da ponte de arco-íris que permite viagens instantâneas entre os reinos de deuses e humanidade. Da mesma forma, e igualmente mágico, nosso gateway de websocket Bifrost permite que os clientes Postman se conectem instantaneamente aos serviços Postman.

Foto de Toni Reed em Unsplash

Como compartilhei anteriormente em (Como a Postman Engineering faz microsserviços), todas as arquiteturas de software são um trabalho contínuo em processo. Operar no mundo real significa ocasionalmente reavaliar velhas maneiras de pensar para se ajustar às novas circunstâncias. Essa é a evolução natural do design de software.

Aqui está a história de como os engenheiros do Postman desenvolveram o gateway de WebSocket Bifrost removendo um serviço que ficou muito grande.

Equipes de desenvolvimento em Postman

A maioria das equipes de desenvolvimento do Postman trabalha em equipes multifuncionais focadas em um único domínio central, como documentação ou controle de versão . Guiado pelos princípios de design orientado por domínio , cada esquadrão desenvolve microsserviços internos e recursos do Postman para usuários do Postman.

Enquanto a maioria dos engenheiros trabalha em esquadrões, alguns trabalham em equipes funcionais que criam componentes compartilhados por toda a organização de engenharia. A equipe Server Foundation é um exemplo de equipe funcional da Postman. Esses engenheiros criam os utilitários usados ​​por outros esquadrões para construir, enviar e observar seus próprios recursos. Essa equipe também é onde residem os especialistas em infraestrutura e AWS residentes.

the Server Foundation team é um exemplo de equipe funcional do Postman que cria e gerencia coisas usadas em toda a organização de engenharia

A maioria dos microsserviços do Postman são vagos acoplados para que possam evoluir independentemente de outras equipes. Infelizmente, às vezes, um serviço pode ficar muito grande, fornecendo uma variedade de serviços aparentemente não relacionados. Esses serviços permitem que a equipe itere rapidamente, mas pode começar a agir mais como um monólito inchado, uma grande bola de lama ou como você quiser chamar essas criaturas pesadas.

Quando isso acontece no Postman, muitos engenheiros em equipes diferentes acabam contribuindo para o código, exigindo coordenação cuidadosa em todas as equipes para cada atualização.

O serviço de sincronização monolítico

Um dos serviços Postman que cresceu muito para ser gerenciado com eficiência é chamado de Sync. Ele tem a difícil tarefa de sincronizar todas as atividades do cliente Postman em sua máquina local com os servidores Postman. Cada ação do usuário no Postman resulta em uma série de chamadas de API tratadas por conexões de websocket, seguindo um padrão publicar-assinar , para que as informações fluam em tempo real entre os usuários e entre as equipes.

Por exemplo, isso é o que acontece quando você faz login no Postman e atualiza uma coleção:

  1. Você adiciona um parâmetro à coleção do Postman.
  2. Postman mantém um registro da atualização no controle de versão armazenado com seu perfil.
  3. Postman exibe as informações mais recentes para os visualizadores da coleção em tempo real.

A sincronização foi originalmente planejada para lidar com transações de banco de dados, como atualizar uma coleção. No entanto, desta vez no ano passado, o Sync também gerenciou atividades adicionais, como notificar e exibir a versão mais recente para todos os inscritos na coleção.

Sincronizar sob pressão

Quando você está construindo um carro, o quadro é a estrutura de suporte principal para a qual todos os outros componentes são anexados. Uma pequena rachadura na moldura pode não parecer grande coisa. Provavelmente, poderia passar despercebido dirigindo em baixas velocidades. Em velocidades mais altas, no entanto, há um efeito cascata de desalinhamentos crescentes. A rachadura aparentemente insignificante permite que as vibrações se amplifiquem em todo o resto do veículo até que se transforme em destroços em chamas.

“Coisas que passa despercebido em sistemas menores torna-se inevitável em sistemas mais complexos.”
Kunal Nagpal , gerente de engenharia da Postman

O Sync foi um dos primeiros serviços do Postman, e sua arquitetura monolítica permitiu que a equipe enviasse recursos do Postman rapidamente. Com o tempo, começou a lidar com mais e mais responsabilidades. Até hoje, o serviço Sync ainda tem ampla influência em toda a organização de engenharia, e muitos engenheiros sentem a dor quando o Sync se comporta de maneira inesperada ou há tempo de inatividade programado.

Em 2019, o Sync estava lidando com conexões de websocket e banco de dados transações. Com mais e mais colaboração acontecendo entre nossos 11 milhões de usuários naquela época, o Postman estava se aproximando de um milhão de conexões simultâneas na carga de pico.

Como a base para praticamente todos os microsserviços no Postman, a pressão sobre o Sync estava crescendo.

  • Falha em cascata devido a contrapressão: Cada implantação para sincronizar resulta na desconexão de clientes Postman conectados sobre websockets. Quando um milhão de soquetes se reconectam, os recursos do servidor são degradados, o que pode resultar em mais desconexões, causando um pico previsível, mas inevitável, que pode levar de 6 a 8 horas para se recuperar.
  • Impacto na experiência do usuário: Mesmo que não acontecesse com frequência, a perda de conexões significava um atraso ocasional em ver as atualizações e atividades mais recentes em um Espaço de Trabalho de Equipe.
  • Maior custo de manutenção : como cada esquadrão dependia do Sync, praticamente todos os engenheiros do Postman tiveram que aprender como lidar com conexões perdidas, iniciar novas e, em seguida, reconciliar quaisquer conflitos nos dados.

A equipe do Server Foundation sabia que queria aumentar a eficiência das conexões de websocket e também tratá-las separadamente do Serviço de sincronização. O destino era claro, mas o caminho para chegar lá não.

“Esta é a evolução natural do design de software. Os microsserviços começam ágeis, mas aumentam e precisam ser desmontados. Queríamos separar o manuseio de soquete do Sync porque estávamos prestes a introduzir muito mais funcionalidades. ”
Yashish Dua , engenheiro de software da Carteiro

alguns serviços internos ficam muito grandes, exigindo coordenação cuidadosa entre as equipes

Aqui está o que aconteceu

Etapa 1: obtivemos adesão organizacional

O primeiro desafio a enfrentar não era técnico. Este não foi o primeiro lançamento ambicioso de Postman. A engenharia havia aprendido com as tentativas anteriores para começar com as pessoas. A partir de outubro de 2019, os engenheiros da Server Foundation realizaram uma série de análises dedicadas a comunicar a meta para a organização em geral e a explicar o benefício para todos os serviços dependentes.

Se esse novo sistema tiver sucesso, lidar com conexões perdidas e lidar com as consequências não seria mais lugar comum. Este foi um incentivo real para as outras equipes de engenharia apoiarem e migrarem para o novo sistema. Essa comunicação e coordenação abertas continuariam ao longo da duração deste projeto.

Etapa 2: Identificamos as incógnitas desconhecidas

A engenharia sabia a direção que estavam tomando. Apesar disso, eles seguiram algum tempo para pensar em todos os cenários e entender melhor os conceitos subjacentes. Os engenheiros agendaram sessões exploratórias com outras partes interessadas para identificar desconhecidos desconhecidos, as condições imprevisíveis que podem representar um risco maior do que os conhecidos.

Embora a organização Postman esteja acostumada a pesquisar e planejar, esta parte do processo demorou muito mais do que o normal devido à natureza crítica dessa mudança. Eles pesquisaram diferentes opções, consideraram requisitos auxiliares e elaboraram um plano ao longo de dois meses.

Etapa 3: Construímos o gateway de websocket Bifrost

O Bifrost é composto por duas partes:

  • Gateway público : o gateway usa a estrutura da web Fastify e Amazon AWS ElastiCache para Redis como um agente central de mensagens para gerenciar todas as conexões de websocket.
  • API privada : A API também usa o Fastify como uma estrutura da web de baixa sobrecarga para proxy de tráfego para outros serviços Postman internos.
Bifrost é composto de duas partes: um gateway público e um API privada

Etapa 4: testamos o novo gateway

Quando os engenheiros do Postman estão prontos para enviar um recurso, espera-se que eles testem o recurso, junto com quaisquer recursos relacionados. Como quase todos os recursos do Postman dependem de websockets, isso significa que todos os recursos tiveram que ser testados para esta versão. Além disso, uma estrutura para teste automatizado de websockets não tinha ainda sido configurada no Postman, então todos os testes foram concluídos manualmente antes do Bifrost poderia ser usado na produção.

Esta foi uma jornada árdua, mas no final de janeiro de 2020, a engenharia tinha uma prova de conceito funcional.

Etapa 5: migramos para o novo gateway

Todos os clientes Postman, como o aplicativo Electron ou a Web, contam com uma chamada inicial de bootstrap para outro serviço central chamado Godserver. Este servidor determina o acesso e configuração dos clientes, e é como a engenharia controla lançamentos incrementais de produtos. Como tudo isso foi predeterminado e controlado pelo Godserver, a migração para o gateway Bifrost não exigiria uma única atualização do código do cliente Postman.

A equipe do Server Foundation descreveu as etapas de migração dos esquadrões, as alterações de código necessárias e a configuração aplicar. Ao longo de algumas semanas, os serviços dependentes começaram a fazer a transição de depender do Sync para o gerenciamento baseado em Bifrost de suas conexões de websocket. O Godserver desviou mais e mais tráfego para o novo gateway de websocket para ver como Bifrost lidou com a carga e respondeu a casos extremos.

“É como trocar o motor de uma aeronave em meados de voo. ”
Numaan Ashraf , diretor de engenharia da Postman

Etapa 6: nós escalou o serviço

O gateway Bifrost estava funcionando!

Mas o Postman havia adquirido outro milhão ou mais de usuários enquanto o gateway estava em planejamento e desenvolvimento. E as outras equipes de engenharia não pararam seu próprio trabalho durante esse tempo. Novos recursos de colaboração, como controle de versão e controle de acesso baseado em função (RBAC) , contados pesadamente em websockets para informações a serem atualizadas em tempo real. Houve uma enxurrada de lançamentos de produtos que realmente testariam o novo gateway.

A Bifrost estava pronta para oferecer suporte ao aumento da demanda e dimensionar o manuseio de websocket. “573e9f9583”> Escalonamento horizontal : Na maioria das vezes, os serviços Postman lidam com o aumento do uso escalando para instâncias de maior capacidade ou adicionando mais instâncias de computação à frota. Portanto, os engenheiros da Postman geralmente escalam up um serviço aumentando o tamanho e a capacidade de computação do AWS EC2 instâncias, por exemplo, usando AWS Elastic Beanstalk. Mas para Bifrost, o manuseio de websocket escala out usando mais máquinas. Sua eficiência ideal é alcançada quando instâncias de menor tamanho são usadas em grande número. Este tipo de escala hiper-horizontal funciona bem para Bifrost porque os clientes não exigem alta taxa de transferência de rede, e limitar cada máquina a menos conexões limita o raio de explosão das falhas.

  • Novo fator de carga de CPU e memória : a maioria dos serviços Postman pode escalar com eficiência com uma única dimensão de métrica de escalonamento, como CPU, memória ou latência. No entanto, para Bifrost, as coisas ficam um pouco mais sutis porque tanto a memória quanto o uso da CPU têm impactos diferentes nas operações em vários níveis de taxa de transferência. Para compensar isso, Bifrost usa uma métrica de escala personalizada com base no fator de carga. O fator de carga é um cálculo multidimensional que fornece um perfil de escala não linear personalizado.
  • Vamos nos aprofundar nas decisões arquitetônicas e tecnológicas tomadas pela engenharia do Postman.

    A arquitetura Bifrost e pilha de tecnologia

    O sistema Bifrost tem dois componentes principais – um Gateway e uma API. Esta arquitetura de duas partes é o molho secreto para a estabilidade e escalabilidade do sistema.

    O Gateway atua como o ponto de terminação para todas as conexões de websocket. Embora os gateways comerciais estejam disponíveis para compra, era importante preservar a lógica de negócios herdada acumulada ao longo de anos de otimização. Os engenheiros do Postman também queriam controlar totalmente como os websockets são tratados, por exemplo, se quisessem acessar o protocolo de handshake. Para o gateway Bifrost, eles usaram o Amazon ElastiCache para Redis, permitindo que consultassem o cache do Redis usando nós de leitor e gravador.Dividir o tráfego em dois nós para operações de leitura e gravação permite que a equipe otimize o desempenho.

    “Bifrost é nosso gateway para todas as conexões de websocket. É um proxy para todos os clientes Postman e responsável por lidar com operações de soquete de baixo nível para serviços internos do Postman. ”
    Mudit Mehta , engenheiro de software da Postman

    Quase todos os outros serviços da Postman usam Sails como uma estrutura MVC em tempo real para Node.js . Para o gateway Bifrost, no entanto, os engenheiros precisavam de uma estrutura de back-end de alto desempenho, capaz de lidar com grandes volumes com velocidade e uso de memória otimizado. Mais uma vez, eles queriam se aprofundar na camada de soquete, abaixo das abstrações de nível superior fornecidas pelo Sails. Então, eles se voltaram para o Fastify e bifurcaram o middleware socketio-adapter para otimizar para seu próprio uso casos.

    o gateway Bifrost usava AWS, Redis e Fastify para lidar com websockets

    Além do gateway, o outro componente do Bifrost é a API privada que faz proxy do tráfego para outros serviços Postman. Ele se baseia em regras de negócios flexíveis e, portanto, é constantemente reavaliado para saber como e para onde encaminhar o tráfego de entrada.

    “Componentes simples. Lógica complexa. ”
    Kunal Nagpal , gerente de engenharia da Postman

    Para ambos os componentes, a equipe de engenharia decidiu lançar o seu próprio. Embora a parte do gateway do Bifrost não seja atualizada com frequência, a equipe tem controle total sobre o que acontece nas camadas mais profundas do manuseio de websocket. A parte API do Bifrost é o cérebro da operação e converte as mensagens recebidas em tempo real em chamadas HTTP padrão. Ele também pode ser atualizado mais rapidamente como um componente independente do Sync e do gateway Bifrost.

    Lembra daquele molho secreto? A dissociação do Bifrost nesses dois sistemas distintos permite que ambas as partes otimizem para seus próprios objetivos.

    A jornada está longe de terminar

    Como em todas as histórias de engenharia interessantes, este não é o fim . Vou deixá-los com algumas dúvidas sobre o que está por vir para a engenharia do Postman.

    • Crie redundância adicional : O cache Redis é um agente central de mensagens . O manuseio do Websocket ainda depende de um único ponto de falha, então o que acontece se o cache cair?
    • Aumente a largura de banda e o rendimento : O gateway é atualmente capaz de lidar com 10x simultaneidade, mas a comunidade Postman está crescendo rapidamente e a engenharia está construindo mais recursos de colaboração. A necessidade de lidar com mais tráfego de websocket está chegando rapidamente.
    • Continue quebrando o monólito: O O serviço de sincronização contém uma confusão de outros serviços entrelaçados em sua base de código. Desacoplar o manuseio de soquete de Sync afrouxa seu controle sobre outros serviços, então outros serviços agora podem ser removidos mais facilmente.

    Esta foi outra espiada nos bastidores de como a engenharia do Postman opera. Fique ligado para mais histórias das trincheiras.

    🙏🏼 Análise técnica por Kunal Nagpal, Yashish Dua, Mudit Mehta e Shamasis Bhattacharya.

    Originalmente publicado em https://blog.postman.com em 22 de dezembro de 2020.

    Deixe uma resposta

    O seu endereço de email não será publicado. Campos obrigatórios marcados com *