System Design: integração de arquivos
Olá!
Este texto faz parte de uma série sobre System Design. Você encontra os desafios anteriores nos links abaixo.
Desafio 1: integração via arquivos
Você é responsável por definir como será feita a integração via arquivos (~10GB arquivo/dia) entre duas empresas. Qual tecnologia você usaria? FTP, VPN ou Cloud Storage? Os arquivos só podem ser expurgados após 3 anos.
Neste caso, temos a seguinte representação macro do problema, considerando todos os componentes envolvidos:
Podemos pensar na solução tanto do lado da Empresa A quanto da Empresa B nesse caso. Porém, vou considerar somente a perspectiva de quem envia o arquivo, dado que não teremos controle sobre a recepção.
Ao discutir esse problema em um cenário mais parecido com o mundo real, eu tenho alguns pontos que eu gostaria de explorar antes de discutir soluções. Os primeiros deles são: qual o conteúdo do arquivo? são registros sensíveis? é necessário criptografia ou algo similar?
De uma maneira geral, é melhor se preocupar com segurança da informação antes de qualquer outra decisão. É melhor pensar nisso antes de iniciar o desenvolvimento do que descobrir depois que o arquivo vazou e dados sensíveis da operação da empresa vazaram e geraram um prejuízo gigantesco.
Além disso, outro critério a ser considerado é: qual a maturidade tecnológica do time que irá cuidar do processo Recepção do Arquivo? Pela minha experiência, isso influencia mais a decisão do time que envia o arquivo do que a familiaridade com alguma tecnologia específica. Afinal, não adianta querer usar S3 se o time receptor não sabe usar Cloud e ainda trabalha com XML e FTP (hoje em dia isso é mais raro, mas ainda existe).
Com isso dito, vamos à discussão do problema em si.
Como temos uma volumetria definida (10GB/dia), uma técnica que é útil para estimar o custo desse tipo de solução é simplesmente projetar o crescimento no tempo para conseguir dimensionar melhor os recursos necessários para esse processamento.
Assumindo esse tamanho para dias úteis temos:
10GB x 252 dias úteis no ano = 2.52 Terabytes (TB) por ano de armazenamento e tráfego (esse é um complicador, mais adiante já explico o motivo).
Caso o arquivo seja transmitido em todos os dias do ano:
10GB x 356 dias no ano = 3.65 TB por ano de armazenamento e tráfego.
No total de 3 anos, iremos consumir 7.56 TB na solução considerando dias úteis e 10.95 TB na solução que contempla todos os dias.
Para fins de simplificação, vou seguir com a ideia de ser uma transmissão diária, pelo motivo de ser um volume maior e gerar mais problemas interessantes para discussão.
Ainda sobre tamanho, muito raramente um arquivo se mantém com o mesmo tamanho ao longo do tempo, portanto, é legal considerar um crescimento vegetativo ao longo do período de 3 anos.
Para fins de simplificação, vou considerar 0,5% de aumento de tamanho ao mês, o que gera o seguinte crescimento ao longo do tempo:
O intuito de eu gastar tanto espaço no texto discutindo sobre tamanho é justamente sobre esse detalhe. O que hoje uma solução para transferir 10GB parece estar corretamente dimensionada, daqui 3 anos estará transferindo aproximadamente 58GB de dados ao dia (isso considerando um crescimento vegetativo estável), caso tenha picos de crescimento por algum motivo, espere um cenário ainda mais desafiador.
Dito isso, vamos à discussão da solução e tecnologias em si.
FTP
Apesar de soar um pouco antigo, é o jeito mais direto de fazer uma transmissão dessa natureza. Em termos de componentes, somente é necessário uma máquina do lado do emissor com disco o suficiente para armazenar os ~860GB de dados (considere um disco de 2TB como margem de segurança), um job escrito em qualquer linguagem para gerar o arquivo e um outro script para fazer uma cópia para o FTP de destino. Como o receptor é de outra empresa e não teríamos controle sobre isso, o escopo vai até aí.
Eu consigo pensar em alguns pontos de atenção para essa solução: gerenciamento do espaço disponível (o expurgo após 3 anos será manual ou automático?), o que acontece caso haja um aumento abrupto no volume de dados? quais são os requisitos de segurança no acesso a esses arquivos, como: há criptografia dos arquivos? Há um meio seguro de transmissão pela internet (como SFTP, FTPS, ou por exemplo)? A autenticação é feita com usuário e senha ou usando algum tipo de chave pública compartilhada entre as partes? como será feito o armazenamento correto da chave privada?
Mesmo criando um método de gerenciamento do disco e que tenha uma relativa segurança (usando criptografia nos arquivos e controle de acesso), não acho que FTP seja um método recomendado para fazer esse tipo de transferência atualmente. A dor de cabeça de gerenciar disco manualmente já soa obsoleto. Somente o utilize caso você não tenha escolha.
VPN
O jeito de transferir os arquivos usando esse método seria FTP também, porém, toda a comunicação entre as partes envolvidas se daria em um túnel seguro, o que já melhoraria vários aspectos de segurança. Seria uma forma de mitigar os problemas de segurança do método anterior.
Porém, há os seguintes pontos a considerar: essa VPN é confiável ou cai toda hora? ela é compartilhada com outros sistemas da empresa? caso seja, o que acontece com a experiência de outras pessoas tentando trabalhar no horário da transferência do arquivo? se aumentar a quantidade de usuários usando a mesma VPN que o processo irá usar, será que a infraestrutura aguenta? será que faz sentido manter dois túneis, um para os sistemas e outro para uso geral? no caso de congestionamento do túnel por excesso de uso, qual o impacto para o negócio caso o arquivo demore três vezes mais que o habitual para ser transferido?
Essa solução pode funcionar caso o gerenciamento da VPN seja corretamente feito (realizando a transferência em momentos de baixo uso, por exemplo). Porém, lembrando que o arquivo tende a aumentar de tamanho com o tempo. Em algum momento, a largura de banda da VPN pode estourar, gerando indisponibilidade ou a necessidade de um upgrade no serviço contratado. Devido a isso, acredito que o grande ponto negativo dessa solução seja o custo.
Cloud Storage
Eu costumo dizer que para todo problema de software existem algumas soluções erradas, mas não somente uma que seja correta. Não é o caso dessa opção.
Com garantias de disponibilidade, controles de segurança nativos no produto, método de pagamento baseado no uso e possibilidade de mover os arquivos antigos para um mecanismo de cold storage (aumentando a latência de acesso em troca de um custo menor de armazenamento), parece-me uma escolha óbvia o uso desse tipo de mecanismo para esse problema.
Eu fiz algumas simulações de custo para deixar menos abstrato. Considerando somente armazenamento, sem considerar custos de transferência, o AWS S3 custa cerca de 0,023 USD por GB nas opções padrão. No Azure, o Blob Storage na versão Premium custa 0,015 USD por GB. Na GCP, não encontrei a mesma metodologia de simulação de custo, mas estimando com o tamanho total dos 3 anos (860GB), ficou cerca de 117 USD/mês. Lembrando que esse é o custo ao final do período, durante vários meses será bem menos.
É possível otimizar o custo estipulando políticas de transferência de arquivos antigos para armazenamentos mais baratos, além de que na maioria dos provedores, ao se atingir uma determinada quantidade de uso, os custos tendem a se tornarem mais vantajosos, devido ao aumento no volume.
O grande ponto de atenção é o custo de transferência, isso pode variar bastante. Principalmente se forem usadas transferências entre data centers em vez de usar a internet, por exemplo.
Caso esses pequenos cuidados sejam tomados, essa solução tende a ser bastante eficiente. A título de comparação, VPNs são cobradas por usuários/mês, nas pesquisas que eu fiz, considerando serviços comuns, sem acordos comerciais específicos para empresas ou features de alta disponibilidade, custa cerca de 7–10 dólares por cada usuário. Considerando o custo por byte transferido, usar Cloud Storage parece-me uma opção muito melhor.
Por fim, bastaria adicionar alguma regra de acesso para um IP específico da máquina da empresa receptora, adicionar restrições de tempo de armazenamento dos arquivos (expirar após 3 anos, por exemplo) e limitar a quantidade de acessos ao dia para evitar leituras suspeitas, que todos os controles de segurança do enunciado do problema estarão atendidos.
Com todos os pontos considerados, a solução usando Cloud Storage poderia funcionar da seguinte forma:
Lembrando que a maioria das verificações aconteceriam direto no Cloud Provider, dado que basicamente são features do produto de armazenamento. Porém, o desenho contempla a execução das regras sendo feitas via código para fins de clareza no entendimento.
Caso você encontre algum erro ou informação incompleta neste artigo, me avise que eu ajustarei o texto.
Obrigado por ter me lido até aqui!
Até!
Você gostou do conteúdo e gostaria de fazer mentoria comigo? Clique aqui e descubra como.