2011-06-30 17 views
5

मैं रेल आवेदन पर रूबी लिख रहा हूं और वेबसाइट के सबसे महत्वपूर्ण featuers में से एक लाइव वोटिंग है। हम पूरी तरह से उम्मीद करते हैं कि हमें 1 मिनट तक कम से कम 10k वोटिंग अनुरोध मिलेगा। अन्य अनुरोधों के साथ-साथ इसका मतलब है कि हमें अनुरोधों का एक टन मिल सकता है।रेलों में सैकड़ों एक साथ अनुरोधों को संभालना

मेरा प्रारंभिक विचार सर्वर को अपाचे + फ़्यूज़न का उपयोग करने के लिए सेट अप करना है, हालांकि, वोटिंग के लिए विशेष रूप से मैं एक php स्क्रिप्ट लिखने और memcached में जानकारी लिखने/पढ़ने के बारे में सोच रहा हूं। डेटा को केवल 15 मिनट तक जारी रखने की आवश्यकता है, इसलिए 1 मिनट में डेटाबेस में 10,000 बार लिखना व्यर्थ लगता है। हमें उपयोगकर्ता के आईपी को भी चिह्नित करने की आवश्यकता है ताकि वे दो बार वोट न दें जिससे memcached में अतिरिक्त जटिल हो।

यदि किसी के पास इस काम को यथासंभव सर्वोत्तम बनाने के लिए कोई सुझाव या विचार हैं, तो कृपया मदद करें।

+0

नोएसक्यूएल डीबीएस और 10k लिखते हैं एक मिनट प्रति सेकंड लगभग 165 लिखते हैं। यह काफी नहीं है। – Viktor

+0

मैंने इसके बारे में सोचा नहीं था, आप सबसे विश्वसनीय क्या सलाह देते हैं? No12QL के लिए –

+0

MongoDB। यदि आप MySQL का उपयोग एक MyISAM तालिका का उपयोग कर रहे हैं। – Dex

उत्तर

7

यदि आप इस तरह के भारी प्रवाह के लिए एक ऐप आर्किटेक्ट कर रहे हैं, तो आपको इसके न्यूनतम घटकों को पूर्ण न्यूनतम तक सीमित करने की आवश्यकता होगी।

उस तरह की तीव्रता के लिए एक पूर्ण रेल स्टैक का उपयोग करना वास्तव में व्यावहारिक नहीं है, न ही आवश्यक है। एक बहुत ही पतली रैक परत बनाने के लिए यह बेहतर होगा जो सीधे डीबी कॉल करके वोटिंग को संभालता है, एक ओआरएम छोड़ देता है, मूल रूप से INSERT कथन के आसपास एक रैपर होता है। यह सिनात्रा और सेक्वेल कुछ है, जो एक कुशल क्वेरी जेनरेटर के रूप में कार्य करता है, इससे मदद मिल सकती है।

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

एक मिनट में 10,000 डीबी कॉल करना एक बड़ा सौदा नहीं है, प्रत्येक कॉल ठीक से ट्यून किए गए ढेर पर मिलीसेकंड का केवल एक अंश लेगा। Memcached उच्च प्रदर्शन की पेशकश कर सकते हैं विशेष रूप से अगर परिणाम स्थायी होने का इरादा नहीं है। मेमकैचड में परमाणु वृद्धि ऑपरेटर होता है जो कि वही है जो आप आसानी से मतदान करते समय ढूंढ रहे हैं। रेडिस भी एक बहुत ही सक्षम अस्थायी स्टोर है।

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

एक मिनट में 10,000 ऑपरेशंस एक पूर्ण डीबी स्टैक के ऊपरी हिस्से के बिना एक विशेष सर्वर प्रक्रियाओं का उपयोग करके मामूली हार्डवेयर पर भी आसानी से प्राप्त किया जा सकता है।

आपको यह सुनिश्चित करना होगा कि आपका दायरा बहुत अच्छी तरह परिभाषित है ताकि आप इसे तैनात करने से पहले अपने कार्यान्वयन का परीक्षण और भारी दुरुपयोग कर सकें।

आप है कि क्या वर्णन कर रहे हैं, बहुत कोर पर के बाद से, कुछ एक हैश देखने के बराबर, आवश्यक कोड बस है:

contest = @contest[contest_id] 

unless (contest[:voted][ip]) 
    contest[:voted][ip] = true 
    contest[:votes][entry_id] += 1 
end 

इस कई लाख गुना चल रहा है एक दूसरे में पूरी तरह से व्यावहारिक है, तो एकमात्र ओवरहेड इसके चारों ओर एक JSON परत लपेट जाएगा।

+1

महान प्रतिक्रिया के लिए धन्यवाद। मैं शायद इवेंटमाचिन का परीक्षण करूंगा और सिनात्रा + यादगार ऐसा लगता है कि यह बहुत अधिक अतिरिक्त काम कोडिंग की आवश्यकता के बिना वास्तव में कुशल होगा। बात यह है कि, यह एक ही सुविधा के लिए है, हालांकि, यह इतनी उच्च आवश्यकता है कि इसे अपने स्वयं के समाधान की आवश्यकता है। –

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