2013-05-20 7 views
7

मेरे पास एक ऐप है जो दिन में एक बार कई एपीआई को अनुसूचित कॉल करने के लिए सेट अप किया गया है। यह बहुत अच्छी तरह से काम करता है लेकिन मुझे पता है कि कुछ एपीआई जिन्हें मैं कॉल कर रहा हूं (उदाहरण के लिए ट्विटर) की दर सीमा है। चूंकि मैं जो कॉल कर रहा हूं, वह लगातार बढ़ने के लिए सेट है, क्या कोई मेरी कॉल को थ्रॉटल करने का तरीका सुझा सकता है ताकि मैं x प्रति घंटे/मिनट इत्यादि में भेज सकूं?एपीआई दर सीमा से निपटने?

मुझे Glutton Ratelimit मणि मिला है, क्या कोई इसका उपयोग कर रहा है और क्या यह कोई अच्छा है? क्या ऐसे कुछ हैं जिन्हें मुझे देखना चाहिए?

+1

मैं तुम्हारे लिए एक जवाब नहीं है, लेकिन अगर आप जानते हैं कि आप लगातार विकसित करने के लिए अनुरोध की संख्या आप तो थ्रॉटल करना ही कारण एक कतार में एक ही दर से बढ़ने की होगी जा रहे हैं, तो आप इस बात पर विचार करने की आवश्यकता है कि कतार से कैसे निपटना है जो कभी भी खाली नहीं होगा। – Matt

+0

सुनें कि आप क्या कह रहे हैं। मैंने देरी_बॉज का इस्तेमाल किया और किसी भी तरह से इसे शामिल करने की उम्मीद कर रहा था। अनुरोध बढ़ेगा, लेकिन मैं उन्हें प्रति दिन 10-15k से आगे बढ़ने में नहीं देख सकता। – Raoot

+1

अजीब कैसे यह प्रश्न +4 तक संशोधित हुआ और [एक समान] [http://stackoverflow.com/questions/15309544/how-to-make-concurrent-http-request-in-ruby-at-the- सबसे तेज़-दर-संभव-से-नहीं) 3 से नीचे और बंद हो गया। मुझे लगता है कि समय सब कुछ – pguardiario

उत्तर

4

यदि आप अपनी एपीआई कॉल करने के लिए कुछ प्रकार के पृष्ठभूमि कार्यकर्ता का उपयोग कर रहे हैं, तो आप अगली बार स्लॉट में फिर से प्रदर्शन करने के लिए कार्य को फिर से निर्धारित कर सकते हैं, जब दर सीमा रीसेट हो गई हो।

class TwitterWorker 
    include Sidekiq::Worker 

    def perform(status_id) 
    status = Twitter.status(status_id) 
    # ... 

    rescue Twitter::Error::TooManyRequests 
    # Reschedule the query to be performed in the next time slot 
    TwitterWorker.perform_in(15.minutes, status_id) 
    end 
end 

हालांकि कोई वैज्ञानिक समाधान नहीं है, उदाहरण के लिए यदि आप दर सीमा की तुलना में एक दिन में अधिक एपीआई कॉल करने का प्रयास करते हैं तो जोखिम हर बार फिर से निर्धारित किया जा सकता है। लेकिन तब तक, कुछ आसान चाल चल सकता है!

+0

धन्यवाद, यह समझ में आता है। मैं पृष्ठभूमि नौकरियों को करने के लिए देरी_job का उपयोग कर रहा हूँ। मैं आपकी सलाह के लिए धन्यवाद, इस पर ध्यान रखूंगा। – Raoot

+1

यह वास्तव में एक अच्छा, सरल विचार है।मैं वास्तव में बचाए गए अपवाद 'ई' का नामकरण कर रहा हूं और' perform_id (e.rate_limit.reset_in, ...) 'कर रहा हूं ताकि यह कोटा –

0

एक अन्य समाधान प्रॉक्सी जो आप अलग अलग आई पी पतों

साथ अनुरोध भेजने के लिए अनुमति देते हैं खरीदने के लिए है

मानक http lib उपयोग http://ruby-doc.org/stdlib-2.0/libdoc/net/http/rdoc/Net/HTTP.html#method-c-Proxy

मुझे यकीन है कि आप अवरुद्ध नहीं किया जाएगा नहीं कर रहा हूँ, लेकिन शायद यह कोशिश करने के लिए लायक है । यादृच्छिक रूप से चुना गया आईपी आपकी सीमा

+3

जैसे ही रीट्री हो सके यह तकनीक अनधिकृत API के लिए काम कर सकती है। हालांकि, जब आप ट्विटर आरईएसटी एपीआई 1.1 के साथ काम करते हैं, तो आपके सभी अनुरोधों को प्रमाणित करने की आवश्यकता होती है और इस प्रकार सीधे आपसे बंधे होते हैं, इससे कोई फर्क नहीं पड़ता कि अनुरोध किस आईपी से आता है। अच्छी सोच, यद्यपि! –

+0

हां बिल्कुल। प्रॉक्सी Google मानचित्र जैसे प्रति-आईपी दर सीमाओं में मदद करेगा, लेकिन प्रति खाता सीमाओं के लिए नहीं, जैसे कि मुझे ट्विटर की कल्पना है। – pguardiario

+0

दिलचस्प दृष्टिकोण और कहीं और उपयोगी साबित हो सकता है। – Raoot

0

जब तक आप समवर्ती अनुरोध नहीं कर रहे हैं, वहां इसके लिए बहुत कुछ नहीं है।

  • चित्रा बाहर कितना देरी आप अनुरोध
  • प्रति जरूरत अनुरोध से पहले समय की जाँच करें, अनुरोध और sleep आराम के बाद समय से घटाना।

समवर्ती अनुरोध के साथ आप अधिक सटीक हो सकता है, I once blogged about that here

+0

धन्यवाद, आपके ब्लॉग पर एक नज़र डालेंगे। – Raoot

0

मैं जानता हूँ कि यह एक पुराने सवाल है, लेकिन यह एक ही सवाल के साथ दूसरों में मदद करता है के मामले में कुछ उल्लेख करना चाहता था।

यदि काम को रिस्क का उपयोग करके नौकरियों के लिए कतारबद्ध किया जा सकता है, तो आप उस मणि का उपयोग कर सकते हैं जिसे मैंने अभी जारी किया है जो एक queue को रोकता है जब आप रेट_लिमिट को दबाते हैं - और कुछ समय बाद इसे रोक देता है।

https://github.com/pavoni/resque-rate_limited_queue

संबंधित मुद्दे