Atualmente, estou procurando soluções que possam otimizar o uso da largura de banda da rede.
Cenário: o servidor possui um arquivo. O cliente faz o download por meio de uma API REST. O cliente faz algumas alterações e faz o upload do arquivo alterado de volta ao servidor através do REST. O servidor substituirá o arquivo original pelo arquivo carregado.
Abordagens possíveis Eu tenho duas abordagens possíveis em mente.
1- Diferença local Antes de fazer qualquer alteração, o cliente fará uma cópia do arquivo original. Depois de fazer as alterações, o cliente usará algoritmos como BSDiff ou XDelta para extrair alterações comparando arquivos originais e alterados. Essas alterações serão enviadas ao servidor. O servidor aplicará o diff no arquivo original.
2- Use o R-Sync Faça uma chamada REST ao servidor e solicite o Rolling Checksum inicial e o MD5 Hash. Em seguida, com base na resposta, gere o diff e envie-o ao servidor. O servidor mesclará as alterações.
Fiz alguns testes rigorosos e descobri que o BSDiff é a solução mais eficiente (em termos de tamanho do diferencial - que é o principal objetivo de otimização). Ele gera a menor diferença possível, mas é preciso uma memória enorme, o que torna impossível o uso no lado do cliente para tamanhos de arquivos grandes. Por outro lado, os resultados do X-Delta e o restante das ferramentas binárias de comparação que experimentei não são tão boas em termos de tamanho de comparação gerado. O diff local também tem a desvantagem de usar espaço em disco extra por manter a cópia do arquivo original. Isso pode ser um problema no caso de arquivos grandes.
O problema de memória do BSDiff torna o R-Sync a escolha mais adequada (porque o restante das ferramentas não é tão eficiente em encontrar o diferencial). Então, eu decidi ir para o R-Sync.
O R-Sync funciona em duas etapas. Primeiro, ele obtém as assinaturas com base no arquivo e, em seguida, os dados são enviados de volta com base nas assinaturas enviadas anteriormente. Estou planejando otimizar ainda mais o R-Sync, mantendo as assinaturas do arquivo original no lado do cliente antes de fazer alterações. Isso removerá a necessidade de o servidor solicitante do cliente calcular e enviar assinaturas no momento do upload. O cliente pode apenas enviar dados com base em assinaturas já computadas para o servidor sempre que o cliente desejar fazer upload do arquivo.
Pergunta Eu sei que essa é uma pergunta estranha, é por isso que fiz uma pergunta antes de fazer aqui. Eu gostaria de saber se existem alternativas melhores para resolver esse tipo de problema. Quero confirmar minha abordagem apenas para garantir que estou no caminho certo e não perca nada importante.