2010-09-01 11 views
8

मुझे ऐसे एप्लिकेशन को बनाने की आवश्यकता है जो अक्सर सर्वर पर मतदान करने की आवश्यकता होती है, लेकिन जीएई के अनुरोध पर सीमाएं हैं, इसलिए बहुत से अनुरोध करना बहुत महंगा हो सकता है। क्या लंबे मतदान का उपयोग करना संभव है और अनुरोधों के लिए मैक्सियम 30 सेकंड के लिए अनुरोधों का इंतजार करना संभव है?क्या Google ऐप इंजन में लंबे मतदान संभव है?

उत्तर

10

Google AppEngine एक नई सुविधा चैनल एपीआई है, उस के साथ आप एक possibility to build a good realtime application है लगता है (और इसके स्वीकार किए जाते हैं)।

एक और समाधान तीसरे भाग धूमकेतु सर्वर का उपयोग करना है जैसे mochiweb या आईफ्रेम पैटर्न के साथ मुड़ें।

Client1, एक घटना का इंतजार कर:

client1 --Iframe Pattern--> Erlang/Mochiweb(HttpLongPolling): 

Client2, एक संदेश भेजने:

client2 --XhrIo--> AppEngine --UrlFetch--> Erlang/Mochiweb 

धूमकेतु पैटर्न के साथ mochiweb का उपयोग करने के रिचर्ड जोन्स एक अच्छा विषय (गूगल पर लिखा है: रिचर्ड जोन्स एक लाख उपयोगकर्ता धूमकेतु आवेदन)।

+0

चैनल एपीआई अभी तक सार्वजनिक नहीं है। चेक आउट करने के लिए यहां दो और वैकल्पिक सेवाएं दी गई हैं: http://beaconpush.com http://pubnub.com –

+0

नोट: चैनल API को बंद कर दिया जाएगा और अक्टूबर 2017 में बंद कर दिया जाएगा। – Suma

0

मुझे नहीं लगता कि लंबे मतदान संभव है। Google appengine के लिए डिफ़ॉल्ट अनुरोध टाइमआउट 30 सेकंड है। लंबे मतदान में अगर संदेश उत्पन्न करने के लिए 30 सेकंड से अधिक समय लगता है, तो यह असफल हो जाएगा। आप कम मतदान का उपयोग कर शायद बेहतर हैं।

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

वहाँ feature request होने के लिए गूगल appengine पर लंबे समय तक मतदान के लिए

+1

Google ऐप इंजन में लंबे मतदान का समर्थन करने के लिए अब चैनल एपीआई है। –

+0

@Zhe जांचें कि प्रश्न कब पोस्ट किया गया था और उत्तर दिया गया था, तब लंबे मतदान संभव नहीं था। – naikus

+0

ओह, मेरे बुरे ... –

2

हमने मिश्रित परिणामों के साथ ऐप इंजन पर एक धूमकेतु-जैसे लंबे मतदान समाधान को कार्यान्वित करने का प्रयास किया है।

def wait_for_update(request, blob): 
    """ 
    Wait for blob update, if wait option specified in query string. 
    Otherwise, return 304 Not Modified. 
    """ 
    wait = request.GET.get('wait', '') 
    if not wait.isdigit(): 
     return blob 
    start = time.time() 
    deadline = start + int(wait) 
    original_sha1 = blob.sha1 
    try: 
     while time.time() < deadline: 
      # Sleep one or two seconds. 
      elapsed = time.time() - start 
      time.sleep(1 if elapsed < 7 else 2) 
      # Try to read updated blob from memcache. 
      logging.info("Checking memcache for blob update after %.1fs", 
         elapsed) 
      blob = Blob.cache_get_by_key_name(request.key_name) 
      # Detect changes. 
      if blob is None or blob.sha1 != original_sha1: 
       break 
    except DeadlineExceededError: 
     logging.info("Caught DeadlineExceededError after %.1fs", 
        time.time() - start) 
    return blob 

समस्या मैं देख रहा हूँ कि अनुरोधों एक लंबे समय से मतदान एक निम्नलिखित, serialize (सिंक्रनाइज़) लंबे समय से पोलिंग अनुरोध के पीछे हो रही है है। मैं क्रोम में एक ट्रेस देख सकता हूं और इस तरह की एक टाइमलाइन देख सकता हूं:

  1. अनुरोध 1 भेजा गया। प्राप्त करें (अन-संशोधित) ब्लॉब (बदलने तक प्रतीक्षा करें)।
  2. अनुरोध 2 भेजा गया। ब्लॉब को संशोधित करें।
  3. पूर्णकालिक आउट के बाद, अनुरोध 1 रिटर्न (डेटा अनमोडिफाइड)।
  4. अनुरोध 2 सर्वर पर संसाधित हो जाता है, और सफलता देता है।

मैंने वायरसहार्क और क्रोम/टाइमलाइन का उपयोग यह पुष्टि करने के लिए किया है कि मैं लंबे समय तक मतदान से एक अलग टीसीपी कनेक्शन पर सर्वर को संशोधन अनुरोध भेज रहा हूं। तो यह सिंक्रनाइज़ेशन ऐप इंजन उत्पादन सर्वर पर खुश होना चाहिए। जहां तक ​​मुझे पता है, Google सर्वर व्यवहार के इस विवरण को दस्तावेज नहीं करता है।

मुझे लगता है कि चैनल एपीआई की प्रतीक्षा करना सबसे अच्छा आशा है कि हमें ऐप इंजन से अच्छा वास्तविक समय व्यवहार प्राप्त हो रहा है।