Pergunta

Estou trabalhando em um projeto que envolve o upload de arquivos de vídeo flash para um balde S3 de vários nós distribuídos geograficamente.

Os arquivos de vídeo são cerca de 2-3 MB cada, e estamos enviando apenas um arquivo (por nó) a cada dez minutos, no entanto, a largura de banda que consumimos precisa ser de taxa limitada a ~ 20k/s, pois esses nós estão entregando mídia de streaming a um CDN e, devido aos locais, só podemos obter upload máximo de 512k.

Eu tenho procurado a jóia ASW-S3 e, embora não ofereça nenhum tipo de limitação de taxa, sei que você pode passar em um fluxo de IO. Dado isso, estou me perguntando se pode ser possível criar um fluxo limitado por taxa que substitua o read o método, adiciona a lógica limitadora da taxa (por exemplo, em sua forma mais simples, uma chamada para sleep entre leituras) e depois chama o super do método substituído.

Outra opção que eu considerei é hackear o código para net :: http e colocar a taxa limitando no send_request_with_body_stream método que está usando um while Loop, mas não tenho muita certeza de qual seria a melhor opção.

Eu tentei estender a aula de IO, no entanto, isso não funcionou, simplesmente herdando da classe com class ThrottledIO < IO não fez nada.

Quaisquer sugestões serão muito apreciadas.

Foi útil?

Solução

Você precisa usar o delegado se deseja "aumentar" um IO. Isso coloca uma "fachada" em torno do seu objeto de IO que será usado por todos os leitores "externos" do objeto, mas não terão efeito na operação do próprio objeto.

Eu extraí isso em uma jóia, pois provou ser geralmente útil

Aqui está um exemplo para um IO que é lido de

http://rubygems.org/GEMS/Progressive_IO

Aqui há um aspecto adicionado a todos os métodos de leitura. Eu acho que você pode estender isso para fazer a limitação básica. Depois de terminar, você poderá envolver seu, digamos, arquivar, nele:

 throttled_file = ProgressiveIO.new(some_file) do | offset, size |
    # compute rate and if needed sleep()
 end

Outras dicas

Nós usamos o Aiaio Active_Resource_throttle Para limitar as solicitações de retirar a API da colheita em um projeto no trabalho. Eu não configurei, mas funciona.

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