2011-09-18 17 views
12

मुझे डीजेंगो (AJAX लंबी-मतदान के साथ) में रीयलटाइम हालिया गतिविधि फ़ीड विकसित करने की आवश्यकता है, और मैं सोच रहा हूं कि सर्वर-साइड के लिए सबसे अच्छी रणनीति क्या है।लाइटवेट अधिसूचना तकनीक

स्यूडोकोड:

def recent_activity_post_save(): 
    notify_view() 

[in the view] 
while not new_activity(): 
    sleep(1) 
return HttpResponse(new_activity()) 

पहली बात यह है कि में मन डीबी हर दूसरे से क्वेरी है आता है। संभव नहीं है। अन्य विकल्प:

  1. एक अधिसूचना सेवा
  2. एक विशेष उपकरण का उपयोग कर के रूप में कैश का उपयोग कर, अजवाइन की तरह (मैं नहीं बल्कि यह नहीं चाहते हैं, क्योंकि यह overkill की तरह लगता है)

क्या सबसे अच्छा है यहाँ जाने का रास्ता?

उत्तर

5

मैं इसे सरल रखने का सुझाव देते हैं ...

अपने घटनाओं स्टोर करने के लिए एक डेटाबेस तालिका बनाएँ, उस तालिका में सम्मिलित जब उचित हो, तो सिर्फ एक सरल ajax मतदान तकनीक सर्वर हर एक्स सेकंड हिट करने के लिए लागू ग्राहक पक्ष पर।

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

एक मॉडल बनाएं जिसमें आपके एप्लिकेशन के लिए हालिया गतिविधि डेटा शामिल है, फिर भी जब भी आपका एप्लिकेशन ऐसा कुछ करता है जो नई गतिविधि को लॉग इन कर लेता है तो आप बस इस तालिका में सम्मिलित कर सकते हैं।

आपका दृश्य किसी भी अन्य दृश्य की तरह होगा, x पंक्तियों को इस RecentActivity तालिका (वैकल्पिक रूप से क्वेरी पैरामीटर और जो भी हो) पर खींचें।

फिर, ग्राहक पक्ष पर, आपके पास बस एक साधारण AJAX परागक होगा जो आपके दृश्य को हर x सेकेंड पर रखेगा। जटिल प्लगइन्स और प्रौद्योगिकियों का उपयोग कर सकते की कोई कमी नहीं है, लेकिन अपने स्वयं के लेखन है कि जटिल या तो नहीं है:

function simplePoll() { 
    $.get("your-url", {query-parameters}, function(data){ 
    //do stuff with the data, replacing a div or updating json or whatever 
    setTimeout(simplePoll, delay); 
    }); 
} 

मेरे विचार यह है कि प्रदर्शन के मुद्दों वास्तव में मुद्दों तक आपकी साइट उनके लिए काफी सफल हुआ नहीं हैं एक मुद्दा होना एक पारंपरिक रिलेशनल डेटाबेस काफी अच्छी तरह से बढ़ सकता है जब तक आप ट्विटर, Google, आदि जैसे सफलता के स्तर तक पहुंचने शुरू नहीं करते हैं। हम में से अधिकांश उस स्तर पर नहीं हैं :)

0

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

1

आप धूमकेतु समाधान का उपयोग कर सकते हैं, जैसे Ape project। इस तरह की परियोजना को ब्राउज़र में रीयल-टाइम डेटा भेजने के लिए डिज़ाइन किया गया है, और आधुनिक ब्राउज़र वेब सॉकेट सुविधा का उपयोग कर सकता है।

0

यदि आप धूमकेतु समाधान के बाद you could use orbited हैं। मुझे आपको चेतावनी दीजिए कि यद्यपि यह एक विशिष्ट समाधान है क्योंकि उत्पादन वातावरण में orbited को तैनात और उपयोग करने के तरीके पर अच्छा दस्तावेज़ ढूंढना बहुत मुश्किल है।

0

सर्वर-साइड परिप्रेक्ष्य से उत्तर देने वाली एक समान चर्चा है: Making moves w/ websockets and python/django (/ twisted?) , सबसे महत्वपूर्ण उत्तर this one है।

this answer भी है, जो Django से इसका प्रयास करने के लिए एक बहुत ही ठोस दिखने के विकल्प को इंगित करता है।

यदि आप वास्तव में यह चाहते हैं कि यह आपके मौजूदा Django एप्लिकेशन से कार्य करता है, तो यह सर्वर पक्ष न करें। एक ब्राउज़र के कनेक्शन में HTTP सॉकेट बंधक को पकड़ना आपके एप्लिकेशन को तोड़ने का एक तेज़ तरीका है। दो उचित विकल्प हैं: विभिन्न वेब सॉकेट विकल्पों का पता लगाएं (जैसे उपरोक्त एक जो सेवा की मेजबानी करने के लिए पिरामिड का उपयोग करता है), या ब्राउजर को समय-समय पर अद्यतनों की तलाश में सर्वर पर मतदान अनुरोध भेजना देखें।

+1

यह आम तौर पर अच्छी सलाह है, लेकिन सवाल विशेष रूप से कहता है "django में (AJAX लंबे मतदान के साथ)"। – dkamins

2

क्या आपने सिग्नल का उपयोग करने पर विचार किया है? आप recent_activity_post_save() में एक सिग्नल भेज सकते हैं और वहां एक श्रोता हो सकता है जो जानकारी को कैश में संग्रहीत करता है।

दृश्य यह देखने के लिए कैश का संदर्भ देगा कि नई सूचनाएं हैं या नहीं। बेशक आपको सिग्नल की आवश्यकता नहीं है, लेकिन आईएमएचओ इस तरह थोड़ा क्लीनर होगा, क्योंकि आप अधिक "अधिसूचना हैंडलर" जोड़ सकते हैं।

यह इष्टतम लगता है क्योंकि आपको डीबी (कृत्रिम भार) को मतदान करने की आवश्यकता नहीं है, नोटिफिकेशन लगभग तुरंत "दृश्यमान" होते हैं (सिग्नल को संसाधित करने और कैश के साथ बातचीत करने के लिए आवश्यक समय के बाद)।

तो स्यूडोकोड इस प्रकार दिखाई देगा:

# model 
def recent_activity_post_save(): 
    post_save_signal.send() 

# listener 
def my_handler(...): 
    cache.set('notification', ....) 

post_save_signal.connect(my_handler) 

# view 
def my_view(request): 
    new_notification = None 
    while not new_notification: 
     sleep(1) 
     new_notification = cache.get('notification') 
    return HttpResponse(...) 
+0

यह वही है जो मैं अभी उपयोग कर रहा हूं; यह मेरे लिए भी इष्टतम लगता है, लेकिन मैं इस विषय पर अन्य राय की तलाश में था। +1 –

+0

मुझे इस समाधान को तब तक पसंद आया जब तक कि मैंने 'new_notification' लाइन नहीं देखा' ... यह सैद्धांतिक रूप से अनुरोध पर अनिश्चित काल तक लटका नहीं सकता - शायद किसी प्रकार का अजाक्स मतदान अनुरोध - जबकि यह किसी के लिए इंतजार कर रहा है आने के लिए नई अधिसूचना? कैश खाली होने पर दृश्य से खाली डेटा सेट को वापस करना बेहतर नहीं होगा? –

+0

@DMactheDestroyer जो कुछ प्रकार का छद्म कोड था, निश्चित रूप से यह 30 सेकंड के बाद एक खाली परिणाम देता है या इसलिए यदि कोई नई गतिविधि नहीं है। –

0

आप तय करना चाहिए कि अगर आप अपने संदेश पहुंचाने के लिए एक "पुल" या "पुश" वास्तुकला के साथ जाना होगा, इस post on quora देखो! यदि आप ऐसे समाधान के लिए जाना चाहते हैं जो अधिसूचनाओं को उनके रिसीवर कैशिंग/नोस्कल आधारित सिस्टम पर "धक्का" देता है तो वे बहुत अधिक लिखने के कार्यों के लिए इतना उच्च भार नहीं बनाते हैं।

उदाहरण के लिए रेडिस इसके क्रमबद्ध सेट/सूची डेटास्ट्रक्चर के साथ आपको बहुत उदाहरण देता है। उदाहरण देखें। एक विचार पाने के लिए this post (हालांकि यह पायथन नहीं है)। उदाहरण के लिए आप RabbitMQ जैसे "वास्तविक" संदेश कतारों को भी देख सकते हैं!

क्लाइंट कनेक्शन के लिए यहां अन्य पोस्टों ने आपको पहले से ही कुछ विचार दिए हैं कि मुड़ और समान ढांचे का उपयोग कैसे करें।

और सेलेरी हमेशा एक अच्छा उपकरण हो सकता है, उदाहरण के लिए आप कर सकते हैं। उपयोगकर्ताओं के सक्रिय एटी स्ट्रीमों को एक अतुल्यकालिक नौकरी में सभी लेखन है!

+0

अंतर्दृष्टि के लिए धन्यवाद; मैं हालांकि _lightweight_ समाधान की तलाश में था, क्योंकि किसी साइट पर एक पृष्ठ के लिए NoSQL डेटाबेस स्थापित करने में कोई बात नहीं है, है ना? –

0

मुझे लंबे समय तक मतदान के उपयोग के लिए खुद को सीमित करने की आवश्यकता नहीं दिखती है यदि यह वास्तव में आवश्यक नहीं है। सर्वोत्तम विकल्प का लाभ उठाने के लिए लिखे गए पुस्तकालय हैं (यदि यह पिछले विकल्पों में से कोई भी उपलब्ध नहीं है तो यह शॉर्ट-पोलिंग, लंबे मतदान, वेबसाइकिल या यहां तक ​​कि छोटे फ्लैश प्लगइन भी हो सकता है)। Node.js में सॉकेट.आईओ नामक ऐसी नौकरी के लिए सबसे अच्छी पुस्तकालयों में से एक है, लेकिन भाग्यशाली है कि दो पायथन कार्यान्वयन भी उपलब्ध हैं, gevent-socketio और tornadio, लेकिन बाद में टर्ननाडो ढांचे के शीर्ष पर बनाया गया है, इसलिए संभवत: सवाल।

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

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

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