2012-07-11 3 views
5

मेरे पास कुछ प्रकार का चैट/फ़ोरम एप्लिकेशन है जो jquery AJAX का उपयोग करके आवधिक मतदान (प्रत्येक 15 सेकंड) का उपयोग करके नए संदेशों की जांच करता है। मैं सोच रहा था कि क्या मैं उन उपयोगकर्ताओं के मुद्दे पर जा सकता हूं जो कई ब्राउज़र उदाहरणों को लोड करके 'मजेदार' होने का प्रयास करते हैं, बहुत सारे टैब के साथ, सभी एक ही एप्लिकेशन को इंगित करते हैं। प्रत्येक टैब एक AJAX अनुरोध भेज रहा है, जो संभावित रूप से एक सर्वर को ओवरफ़्लो कर सकता है यदि कई उपयोगकर्ता एक ही काम करना शुरू करते हैं।अनगिनत टैब खोलने वाले उपयोगकर्ताओं द्वारा सर्वर बाढ़ को कैसे प्राप्त करें?

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

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

+0

एकमात्र चीज जो मैं सोच सकता हूं कि आप संभावित रूप से कुछ प्रकार की दर सीमित कर सकते हैं (यानी प्रति सत्र/समय अवधि में मतदान अनुरोधों की संख्या सीमित करें)। –

+0

हम्म, यह कुछ ऐसा है जो मैंने अभी तक नहीं सोचा था। मेरे पास कुछ प्रकार की सीमितता है जो 5 मिनट की निष्क्रियता के बाद AJAX मतदान रोकता है, लेकिन मैं इसे थोड़ा सा विस्तार कर सकता हूं। – Sempiterna

+0

असल में, वास्तव में PHP का उपयोग करके नहीं किया जा सकता है, क्योंकि इसके लिए अभी भी एक AJAX अनुरोध की आवश्यकता है। जावास्क्रिप्ट का उपयोग कर इसे सीमित करना संभव है? दूसरे शब्दों में, क्या एक ही ब्राउज़र में सभी टैब एक दूसरे के बारे में जानते हैं और एक दूसरे के अनुरोध, और javacsript का उपयोग करके इसे इस तरह सीमित करें? असल में, क्या कोई आंतरिक ब्राउज़र काउंटर है जो देखता है कि टैब एक्स में अभी एक अनुरोध किया गया है, और वहां कोड है ताकि टैब वाई अब AJAX अनुरोध भेज न सके? – Sempiterna

उत्तर

0

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

युपीडी:

सरलतम यह करने के लिए जिस तरह से कुकी या सत्र संग्रहण का उपयोग करना है। मैं कुकीज़ का उपयोग करता हूं। एल्गोरिदम सरल है:

  1. वेब पर उपयोगकर्ता लॉगिन।
  2. चेक इस प्रयोक्ता के लिए कोई भी खोला सत्र है, खोला जाता है, तो अन्य सत्र या ट्रिगर अपवाद या स्विच कि सत्र के लिए हटाने के लिए, आप अपने खुद के वांछित व्यवहार तय की है।
  3. उपयोगकर्ता के लिए सत्र आईडी बनाएं और इसे डेटाबेस में संग्रहीत करें।
  4. विशिष्ट उपयोगकर्ता के लिए सत्र काउंटर फ़ील्ड को सत्रों का पता लगाने के लिए बढ़ाएं, इसलिए अब इससे कोई फर्क नहीं पड़ता कि या कई उपयोग में कोई ब्राउज़र है।
  5. अंतिम पहुंच चिह्न अपडेट करें (मैं microtime(true) + $delay और mysql decimal(14,4) का उपयोग करता हूं)। $ _COOKIE में पारित आईडी द्वारा सत्र के लिए

    1. खोज: यह ग्राहक

    करने के लिए उपयोगकर्ता

  6. संदेश आईडी को भेजें प्रत्येक अनुरोध पर।
  7. अंतिम पहुंच चिह्न देखें। यह कम तो microtime(true) इसका मतलब है कि अगर है कि ग्राहक बार-बार करने के लिए अनुरोध भेजने, तो अपने आप को तय क्या करना है, उदाहरण के microtime(true) + $delay + $penalty के लिए, निशान को बढ़ाने या पूरे सत्र या ट्रिगर त्रुटि छोड़ देते हैं। व्यवहार आपके आवेदन पर निर्भर करता है।
+0

आपको कैसे प्राप्त करें उपयोगकर्ता के लिए कनेक्शन यदि यह उपयोगकर्ता एक ही ब्राउज़र से कई बार कनेक्ट करता है?एक अद्वितीय पहचानकर्ता जो प्रत्येक पोस्ट या जीईटी के साथ भेजा जाता है? एक अनुरोध सीमा बेकार होगी, क्योंकि उसे अभी भी सर्वर पर एक AJAX अनुरोध भेजने की आवश्यकता होगी, जहां सीमा तक पहुंचने पर इसकी जांच की जा रही है। – Sempiterna

+0

अद्यतन उत्तर – pinepain

+0

@RikkusRukkus स्थानीय स्टोरेज पर भरोसा करना सुरक्षित नहीं है, क्योंकि इसका डेटा उपयोगकर्ता द्वारा संशोधित किया जा सकता है – pinepain

0

सुनिश्चित नहीं हैं कि अगर यह कर-सक्षम जावास्क्रिप्ट में है। आप जांच सकते हैं कि टैब सक्रिय है या नहीं। और केवल सक्रिय टैब पर ajax करते हैं?

+0

यह ऑनफोकस/ऑनब्लूर या कुछ का उपयोग करने का विचार हो सकता है। सुनिश्चित नहीं है कि यह सभी ब्राउज़रों और मोबाइल में काम करता है, लेकिन यह एक परीक्षण के लायक है। – Sempiterna

2

एक विकल्प तो जैसे डेटा प्राप्त करने का हो सकता है:

  • आपकी स्क्रिप्ट डेटा मतदान पर तैयारी कर रहा है।अनुरोध निष्पादित करने से पहले, लिखें (LocalStorage के साथ), एक मान कहता है कि आप डेटा लाने जा रहे हैं। localStorage.setItem("last-request-timestamp", new Date().getTime());
  • डेटा के लिए मतदान। आपको परिणाम मिल गया उस परिणाम को स्थानीय स्टोरेज में लिखें: localStorage.setItem("latest-messages", ajax_result);
  • जांचें कि कोई पृष्ठ 1512 सेकंड पहले localStorage.getItem("last-request-timestamp") लंबा है या नहीं, यह जांच कर डेटा पोस्ट करने की तैयारी कर रहा है या नहीं। यदि ऐसा है, तो चरण 1 पर जाएं। यदि नहीं, तो 15 सेकंड प्रतीक्षा करें और फिर से जांचें।
  • भले ही वर्तमान पृष्ठ डेटा के लिए मतदान किया गया हो या नहीं, latest-messages परिवर्तनीय और पृष्ठ को अपडेट करें।

अन्य पृष्ठ निश्चित रूप से स्थानीय स्टोरेज डेटा साझा करेंगे। यदि कोई अन्य पृष्ठ इस समय ला रहा है तो उन्हें डेटा नहीं मिलेगा। यदि पृष्ठ # 1 बंद है, तो अन्य पृष्ठों में से एक डेटा लाने के लिए जारी रहेगा।

मैंने पहले स्थानीय स्टोरेज का उपयोग नहीं किया है, लेकिन ब्राउज़र समर्थन पर्याप्त सभ्य लगता है। आपको इसे केवल एक कुंजी-मान सरणी के रूप में उपयोग करने में सक्षम होना चाहिए: localStorage["last-request-timestamp"]

आप केवल स्थानीय स्टोरेज में तारों को स्टोर कर सकते हैं, लेकिन आप इसे JSON में क्रमबद्ध कर सकते हैं।

+0

दिलचस्प, मैंने इससे पहले नहीं सुना था। मुझे लगता है कि यह jquery कोड ब्लॉक के अंदर सेट और इस्तेमाल किया जा सकता है, ताकि यह केवल कुछ अनुरोधों पर लागू हो। मैं इसे देख लूंगा, धन्यवाद :) – Sempiterna

0

समस्या पर मेमकैच/रेडिस जैसे कुछ फेंक क्यों नहीं? 10-15 के जीवनकाल के साथ प्रतिक्रिया कैश करें और जितना संभव हो उतना प्रसंस्करण से बचें।

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

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