سؤال

أنا أعمل في مشروع ينطوي على تحميل ملفات الفيديو الفلاش إلى دلو S3 من عدد من العقد الموزعة جغرافيا.

ملفات الفيديو حوالي 2-3 ميغابايت لكل منهما، ونحن نرسل ملف واحد فقط (لكل عقدة) كل عشر دقائق، ومع ذلك، فإن النطاق الترددي الذي نستهلكه يجب أن يكون معدل يقتصر على ~ 20k / s، لأن هذه العقد تسليم وسائط البث إلى CDN، وبسبب المواقع نحن قادرون فقط على التحميل 512K Max.

لقد كنت أبحث في جوهرة ASW-S3 وبينما لا تقدم أي نوع من الحد الأقصر من أنني أدرك أنه يمكنك تمرير دفق IO. بالنظر إلى هذا أتساءل عما إذا كان من الممكن إنشاء دفق محدود معدل يتجاوز read الطريقة، يضيف في معدل الحد من المعدل (على سبيل المثال في أبسط نموذج مكالمة إلى sleep بين القراءة) ثم اتصل بالطريقة الفائقة من طريقة تجاوز.

خيار آخر رأيته هو اختراق رمز NET :: HTTP ووضع معدل يحد إلى send_request_with_body_stream الطريقة التي تستخدم while حلقة، لكنني لست متأكدا تماما والتي سيكون الخيار الأفضل.

لقد حاولت توسيع فئة IO، ومع ذلك، لم تنجح على الإطلاق، ببساطة ورث من الفصل class ThrottledIO < IO لم تفعل أي شيء.

أي اقتراحات سيكون موضع تقدير كبير.

هل كانت مفيدة؟

المحلول

تحتاج إلى استخدام المندوب إذا كنت ترغب في "زيادة" IO. هذا يضع "واجهة" حول كائن IO الخاص بك الذي سيتم استخدامه من قبل جميع القراء "الخارجيين" من الكائن ولكن لن يكون لديهم أي تأثير على تشغيل الكائن نفسه.

لقد استخرجت ذلك في جوهرة لأنها أثبتت أنها مفيدة بشكل عام

إليك مثال ل IO الذي يحصل عليه

http://rubygems.org/gem/progressive_io.

هنا هناك جانب إضافته لجميع طرق القراءة. أعتقد أنك قد تكون قادرا على تمديد ذلك للقيام بخاخان أساسي. بعد الانتهاء من ذلك، ستتمكن من التفاف، قل، ملف، في ذلك:

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

نصائح أخرى

لقد استخدمنا Active_Resource_throttle للحد من الطلبات من السحب من API الحصاد في مشروع في العمل. لم أقم بها، لكنها تعمل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top