문제

여러 지리적으로 분산 된 노드에서 플래시 비디오 파일을 S3 버킷에 업로드하는 프로젝트를 진행하고 있습니다.

비디오 파일은 각각 약 2-3MB이며 10 분마다 하나의 파일 (노드 당) 만 보내지 만, 우리가 소비하는 대역폭은 ~ 20k/s로 제한되어 있어야합니다.이 노드는 스트리밍 미디어를 CDN, 그리고 위치로 인해 512k 최대 업로드 만 얻을 수 있습니다.

나는 ASW-S3 GEM을 조사해 왔으며 어떤 종류의 요금 제한을 제공하지는 않지만 IO 스트림을 통과 할 수 있다는 것을 알고 있습니다. 이것을 감안할 때 나는 read 메소드는 속도 제한 로직을 추가합니다 (예 : 가장 간단한 형태로 sleep Reads) 사이) 다음 재정의 메소드의 슈퍼를 호출하십시오.

내가 고려한 또 다른 옵션은 net :: http의 코드를 해킹하고 속도 제한을 send_request_with_body_stream a를 사용하는 방법 while 루프이지만 어느 것이 가장 좋은 옵션인지 확실하지 않습니다.

나는 IO 클래스를 연장하려고 시도했지만 전혀 효과가 없었으며 class ThrottledIO < IO 아무것도하지 않았다.

모든 제안은 대단히 감사하겠습니다.

도움이 되었습니까?

해결책

IO를 "증강"하려면 대의원을 사용해야합니다. 이것은 객체의 모든 "외부"독자가 사용할 IO 객체 주위에 "외관"을 넣지 만 객체 자체의 작동에는 영향을 미치지 않습니다.

일반적으로 유용한 것으로 판명 되었기 때문에 보석으로 추출했습니다.

다음은 IO를 읽는 예입니다.

http://rubygems.org/gems/progressive_io

여기에는 모든 읽기 방법에 추가 된 측면이 있습니다. 기본 스로틀링을 수행하기 위해 확장 할 수 있다고 생각합니다. 당신이 끝나면, 당신은 당신의, 파일, 파일, 그것을 랩핑 할 수 있습니다.

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

다른 팁

우리는 사용했습니다 aiaio의 active_resource_throttle 직장 프로젝트에서 Harvest API에서 가져 오는 요청을 제한합니다. 나는 그것을 설정하지 않았지만 작동합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top