Pergunta

Meu ainda não foi lançado O aplicativo Delphi 2010 permite que os usuários carreguem seus arquivos em meus servidores.No momento estou usando HTTPS POST para enviar os arquivos, o algoritmo (simplificado) é basicamente:

  1. Divida o arquivo em "fatias" (256 KB cada)
  2. Para cada fatia, POST no servidor

ou seja.para um arquivo de 1 MB:

--> Get Slice #1 (256KB)
--> Upload Slice #1 using TidHTTP.Post()

--> Get Slice #2 (256KB)
--> Upload Slice #2 using TidHTTP.Post()

--> Get Slice #3 (256KB)
--> Upload Slice #3 using TidHTTP.Post()

--> Get Slice #4 (256KB)
--> Upload Slice #4 using TidHTTP.Post()

estou a usar Índia 10.Eu (ab) usei meu criador de perfil repetidamente e não sobrou muito para otimizar, exceto alterar a própria rotina de upload.

Eu também estou usando multithreading, e embora eu tenha feito o meu melhor para otimizar meu código, meus benchmarks ainda me dizem que posso fazer melhor (existem outros softwares bem otimizados que alcançam um muito melhor timing...quase duas vezes mais rápido que minha rotina de upload!)

Eu sei que não é culpa do meu servidor... aqui estão as ideias que ainda preciso explorar:

  1. Tentei agrupar fatias em um único POST, naturalmente isso resultou em um aumento de desempenho (20-35%), mas a capacidade de retomada agora está reduzida.

  2. Também pensei em usar SFTP/SSH, mas não tenho certeza se é rápido.

  3. Use web sockets para implementar upload recuperável (como este componente), também não tenho certeza sobre a velocidade.

Agora minha pergunta é:há algo que eu possa fazer para acelerar meu upload?Estou aberto para qualquer sugestão que posso implementar, incluindo ferramentas de linha de comando (se a licença permitir que eu as envie com meu aplicativo), desde que:

  1. O upload recuperável é suportado
  2. Rápido!
  3. Uso razoável de memória
  4. Proteger e permitir autenticação de login/usuário

Além disso, devido a grandes preocupações de segurança, o FTP não é algo que eu gostaria de implementar.

Muito obrigado!

Foi útil?

Solução

Eu sugeriria fazer um único TIdHTTP.Post() para o arquivo inteiro sem fragmentá-lo.Você pode usar o TIdHTTP.OnWork... eventos para controlar quantos bytes foram enviados ao servidor para que você saiba de onde retomar, se necessário.Ao retomar, você pode usar o TIdHTTP.Request.CustomHeaders propriedade para incluir um cabeçalho personalizado que informa ao servidor de onde você está retomando, para que ele possa reverter seu arquivo anterior para o deslocamento especificado antes de aceitar os novos dados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top