Taxa limitando um fluxo de arquivos Ruby
-
20-09-2019 - |
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.
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.