2012-01-03 13 views
5

मैं .net (सी # या वीबी) में एक अच्छा थ्रॉटल एल्गोरिदम लागू करना चाहता हूं लेकिन मुझे पता नहीं लगा कि मैं यह कैसे कर सकता हूं।.NET थ्रॉटल एल्गोरिदम

मामला मेरी एएसपीनेट वेबसाइट को परिणाम लाने के लिए किसी अन्य वेबसाइट पर अनुरोध पोस्ट करना चाहिए। प्रति मिनट अधिकतम 300 अनुरोध भेजे जाने चाहिए।

यदि अनुरोध 300 सीमा से अधिक है तो अन्य पार्टी एपी कुछ भी नहीं लौटाता है (जो कुछ है जो मैं अपने कोड में चेक के रूप में उपयोग नहीं करना चाहता)।

पीएस मैं .net अलावा अन्य भाषाओं में समाधान देखा है, लेकिन मैं एक नौसिखिया हूँ और कृपया तरह हो सकता है और 123

धन्यवाद

+1

[थ्रॉटलिंग एसिंक्रोनस कार्यों] का संभावित डुप्लिकेट (http://stackoverflow.com/questions/22492383/throttling-asynchronous-tasks) –

उत्तर

5

के रूप में आप एक साधारण आवेदन (या सत्र) वर्ग हो सकता था के रूप में सरल अपने जवाब रखने के लिए और हिट के लिए जांचें। यह कुछ अत्यंत किसी न किसी तरह केवल आपके जानकारी देना है:

public class APIHits { 
    public int hits { get; private set; } 
    private DateTime minute = DateTime.Now(); 

    public bool AddHit() 
    { 
     if (hits < 300) { 
      hits++; 
      return true; 
     } 
     else 
     { 
      if (DateTime.Now() > minute.AddSeconds(60)) 
      { 
       //60 seconds later 
       minute = DateTime.Now(); 
       hits = 1; 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 
    } 
} 
2

सरल दृष्टिकोण बस समय कितनी देर तक यह पैकेट के बीच है और उन्हें एक से अधिक हर 0.2 सेकंड की दर से भेजे जाने की अनुमति नहीं है। यही वह समय है जब आपको बुलाया जाता है और जब आपको अगली बार बुलाया जाता है, तो जांचें कि कम से कम 200ms अलग हो गए हैं, या कुछ भी नहीं लौटा है।

यह दृष्टिकोण काम करेगा, लेकिन यह केवल चिकनी पैकेट प्रवाह के लिए काम करेगा - यदि आप गतिविधि के विस्फोट की अपेक्षा करते हैं तो आप किसी भी 200ms अवधि में 5 संदेशों की अनुमति दे सकते हैं जब तक कि 1 मिनट से अधिक औसत 300 से अधिक न हो कहता है। इस मामले में, आप पिछले 300 पैकेट्स के "टाइमस्टैम्प" को स्टोर करने के लिए मानों की एक सरणी का उपयोग कर सकते हैं, और फिर प्रत्येक बार जब आप एक कॉल प्राप्त करते हैं तो आप "300 कॉल पहले" देख सकते हैं ताकि कम से कम 1 मिनट बीत गया हो ।

इन योजनाओं के दोनों के लिए, Environment.TickCount द्वारा लौटाए गए समय मान अपनी आवश्यकताओं (200 से कम नहीं मिलीसेकंड का फैला) के लिए पर्याप्त हो सकता है, के रूप में यह लगभग 15 एमएस करने के लिए सही है।

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