2008-12-30 11 views
9

मैं एक पायथन लाइब्रेरी पर काम कर रहा हूं जो एक वेब सेवा एपीआई के साथ इंटरफेस करता है। मुझे मिली कई वेब सेवाओं की तरह, यह अनुरोधों की दर सीमित करने का अनुरोध करता है। मैं क्लास इंस्टेंटेशन के लिए एक वैकल्पिक पैरामीटर, limit प्रदान करना चाहता हूं, अगर प्रदान किया गया हो, तो निर्दिष्ट सेकंड्स की संख्या तक आउटगोइंग अनुरोधों को रोक दिया जाएगा।पायथन में वेब सेवाओं के अनुरोधों की दर को सीमित कैसे करें?

मैं समझता हूं कि सामान्य परिदृश्य निम्न है: कक्षा का एक उदाहरण किसी विधि के माध्यम से अनुरोध करता है। जब ऐसा होता है, तो विधि कुछ सिग्नल उत्सर्जित करती है जो कहीं लॉक वैरिएबल सेट करती है, और limit में सेकंड की संख्या के लिए उलटी गिनती टाइमर शुरू करती है। (सभी संभावनाओं में, ताला उलटी गिनती टाइमर है।) यदि इस समय के फ्रेम में कोई अन्य अनुरोध किया गया है, तो यह कतारबद्ध होना चाहिए जब तक कि उलटी गिनती टाइमर शून्य तक न पहुंच जाए और ताला बंद हो जाए; इस बिंदु पर, कतार पर सबसे पुराना अनुरोध भेजा गया है, और उलटी गिनती टाइमर रीसेट हो गया है और लॉक फिर से जुड़ा हुआ है।

क्या यह थ्रेडिंग के लिए एक मामला है? क्या कोई और दृष्टिकोण है जिसे मैं नहीं देख रहा हूं?

उलटी गिनती टाइमर और ताला उदाहरण चर होना चाहिए, या वे वर्ग से संबंधित होना चाहिए, जैसे कि वर्ग पकड़ अनुरोधों के सभी उदाहरणों?

साथ ही, क्या यह आमतौर पर लाइब्रेरी के भीतर रेट-सीमित कार्यक्षमता प्रदान करने का एक बुरा विचार है? मेरा कारण है कि, डिफ़ॉल्ट रूप से, उलटी गिनती शून्य सेकंड होती है, लाइब्रेरी अभी भी डेवलपर्स को पुस्तकालय का उपयोग करने और अपनी खुद की दर-सीमित योजनाएं प्रदान करने की अनुमति देती है। सेवा का उपयोग करने वाले किसी भी डेवलपर्स को किसी भी तरह से अनुरोधों को रेट-सीमा करने की आवश्यकता होगी, हालांकि, मुझे लगता है कि लाइब्रेरी के लिए रेट-सीमित करने का साधन प्रदान करना एक सुविधा होगी।

बावजूद पुस्तकालय या नहीं में एक दर सीमित योजना रखने की, मैं लाइब्रेरी का उपयोग कर एक आवेदन लिखना चाहें, तो सुझाव तकनीक काम में आ जाएगा।

आपके सुझावों के लिए बहुत धन्यवाद!

क्रिस

उत्तर

6

यह एक कतार और एक डिस्पैचर के साथ बेहतर बाहर काम करता है। स्रोत और प्रेषण:

आप दो पक्षों में अपने संसाधन अलग हो गए। ये अलग धागे हो सकते हैं (या यदि यह आसान हो तो अलग प्रक्रियाएं)।

स्रोत पक्ष जो भी दर उन्हें खुश करता है, अनुरोध बनाता है और अनुरोध करता है।

डिस्पैच ओर से करता है।

  1. अनुरोध प्रारंभ समय, रों प्राप्त करें।

  2. एक अनुरोध को अस्वीकार करता है, रिमोट सेवा के माध्यम से अनुरोध को संसाधित करता है।

  3. वर्तमान समय प्राप्त करें, टी। (टी - - रों) सेकंड दर के लिए नींद।

आप स्रोत दूरस्थ सेवा से सीधे कनेक्ट ओर चलाना चाहते हैं, तो आप ऐसा कर सकते हैं, और बाईपास दर सीमित। यह रिमोट सेवा के नकली संस्करण के साथ आंतरिक परीक्षण के लिए अच्छा है।

इस बारे में कठिन हिस्सा प्रत्येक अनुरोध है कि आप कर सकते हैं enqueue के लिए कुछ प्रतिनिधित्व पैदा कर रही है। चूंकि पाइथन Queue लगभग कुछ भी संभाल लेगा, इसलिए आपको बहुत कुछ करने की ज़रूरत नहीं है।

आप बहु प्रसंस्करण का उपयोग कर रहे हैं, तो आप उन्हें एक पाइप में डाल करने के लिए pickle अपने वस्तुओं करना होगा।

1

आपकी दर सीमित योजना अंतर्निहित कोड (सिंक्रोनस या एसिंक) के कॉलिंग सम्मेलनों, साथ ही साथ किस दायरे (थ्रेड, प्रक्रिया, मशीन, क्लस्टर?) के कॉलिंग सम्मेलनों से काफी प्रभावित होनी चाहिए, यह दर-सीमा पर काम करेगा।

मैं उदाहरण के भीतर सभी चर रखने का सुझाव देते हैं, ताकि आप आसानी से नियंत्रण के कई अवधियों/दरों को लागू कर सकते हैं।

अंत में, यह लगता है कि आप एक मिडलवेयर घटक होना चाहता हूँ। आवेदन करने की कोशिश न करें और धागे को अपने आप पेश करें। यदि आप सिंक्रोनस हैं और एसिंक प्रेषण ढांचे का उपयोग करें तो बस ब्लॉक करें/सोएं यदि आप उनमें से किसी एक द्वारा बुलाए जा रहे हैं।

2

कतार में अत्यधिक जटिल हो सकता है। एक आसान समाधान यह है कि सेवा को आखिरी बार बुलाए जाने के लिए अपनी कक्षा को एक चर दिया जाए। जब भी सेवा (! 1) कहा जाता है, तो प्रतीक्षा समय को delay - Now + lastcalltime पर सेट करें। delay अनुरोधों के बीच न्यूनतम स्वीकार्य समय के बराबर होना चाहिए। यदि यह संख्या सकारात्मक है, तो कॉल करने से पहले उस समय तक सो जाओ (! 2)। इस दृष्टिकोण का नुकसान/लाभ यह है कि यह वेब सेवा अनुरोधों को तुल्यकालिक मानता है। लाभ यह है कि यह बेहद सरल और कार्यान्वित करने में आसान है।

  • (1!): (शायद आवरण के नीचे) आवरण के अंदर, सेवा से एक प्रतिक्रिया प्राप्त करने के बाद सही होना चाहिए।
  • (2!): ऐसा करना चाहिए जब वेब सेवा के आसपास अजगर आवरण आवरण के शीर्ष पर कहा जाता है।

एसएलॉट का समाधान निश्चित रूप से अधिक सुरुचिपूर्ण है।

1

अपने पुस्तकालय तुल्यकालिक होने के लिए बनाया गया है, तो मैं सीमा प्रवर्तन बाहर छोड़ने (यद्यपि आप दरों को ट्रैक कर सकता है और कम से कम फोन करने वाले का फैसला कैसे सीमा का सम्मान करने में मदद) की सलाह देते हैं।

मैं twisted का उपयोग काफी सब कुछ आजकल के साथ इंटरफेस करने। यह उस मॉडल को लेकर उस प्रकार की चीज़ को आसान बनाता है जो प्रतिक्रिया को संभालने से अनुरोध जमा को अलग करता है। यदि आप नहीं चाहते हैं कि आपके एपीआई उपयोगकर्ताओं को मुड़ने का उपयोग करना पड़े, तो आप कम से कम अपने एपीआई को स्थगित निष्पादन के लिए समझने से बेहतर होंगे।

उदाहरण के लिए, मैं एक चहचहाना इंटरफ़ेस है कि अनुरोधों की एक नहीं बल्कि बेतुका संख्या xmpp users की ओर से के माध्यम से धक्का दिया है। मैं सीमा को रेट नहीं करता, लेकिन मुझे एक ही समय में होने वाले सभी अनुरोधों को रोकने के लिए थोड़ा सा काम करना पड़ा।

0

अतः मैं कुछ की तरह आयात समय सरल time.sleep (2) अनुरोधों के बीच 2 सेकंड

+0

बुरा धारणा इंतजार कर के लिए काम नहीं करेगा संभालने कर रहा हूँ। यह 2 सेकंड इंतजार कर रहा है।वह 2 सेकंड होगा। एक के अंत के बीच और दूसरे की शुरुआत के बीच। आमतौर पर आप 2 सेकंड चाहते हैं। एक की शुरूआत और दूसरे की शुरुआत के बीच। –

+0

ठीक है, एक के अंत और एक अन्य की शुरुआत के बीच 2s इंतजार कर सुरक्षित करता है, तो सीमा कॉल के बीच वास्तविक समय के आधार पर किया जाता है असली मुद्दा यह है कि अपने समाधान, अनुरोधों के बीच 2s की तुलना में अधिक इंतजार कर रहा है अनुरोधों समय लग सकता है के बीच गणना के बाद से है हो सकता है। – Brian

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