2009-12-18 13 views
21

मैंने एक Google ऐप इंजन एप्लिकेशन लिखा है जो प्रोग्रामिक रूप से HTML कोड का एक समूह उत्पन्न करता है जो वास्तव में मेरे सिस्टम में लॉग इन करने वाले प्रत्येक उपयोगकर्ता के लिए एक ही आउटपुट होता है, और मुझे पता है कि यह होने वाला है जब कोड उत्पादन में जाता है तो कुशल। इसलिए, मैं जेनरेट किए गए पृष्ठों को कैश करने का सबसे अच्छा तरीका जानने का प्रयास कर रहा हूं।Google ऐप इंजन - कैशिंग ने HTML उत्पन्न किया

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

हालांकि, मेरे पास एक मुद्दा यह है कि मैं यह नहीं समझ सकता कि प्रोग्राम प्रोग्राम को कैसे अपलोड किया जाए जब ऐप इंजन पर अपलोड किए गए कोड का संस्करण अपडेट किया गया था।

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

ध्यान दें कि जब इस स्थिति में memcache मदद कर सकता है, तो मेरा मानना ​​है कि यह अंतिम समाधान नहीं है क्योंकि कोड को अद्यतन होने पर मुझे वास्तव में केवल HTML उत्पन्न करने की आवश्यकता होती है (जैसा कि हर बार memcache समाप्त हो जाता है)।

+5

लेकिन ... यही यादगार है! जब तक एचटीएमएल उत्पन्न नहीं करता है, वास्तव में, वास्तव में लंबा समय लगता है, तो आप इसे ओवरइंक कर रहे हैं। –

+0

इसके अलावा, ऐसा लगता है कि ऐप इंजन मेमकेचे मॉडल केवल डेटा पीढ़ी तक पहुंचता है, कोड जनरेशन नहीं: से: http://code.google.com/appengine/docs/python/memcache/usingmemcache.html - मेमकैच आम तौर पर होता है निम्नलिखित पैटर्न के साथ प्रयोग किया जाता है: एप्लिकेशन को उपयोगकर्ता या एप्लिकेशन से एक क्वेरी प्राप्त होती है। एप्लिकेशन जांचता है कि उस क्वेरी को संतुष्ट करने के लिए आवश्यक डेटा memcache में है या नहीं। यदि डेटा memcache में है, तो एप्लिकेशन उस डेटा का उपयोग करता है। यदि डेटा memcache में नहीं है, तो एप्लिकेशन डेटास्टोर से पूछताछ करता है और परिणामों को भविष्य के अनुरोधों के लिए memcache में संग्रहीत करता है। –

+2

@Alexander - आप जो कुछ भी चाहते हैं उसे याद कर सकते हैं, जो वे उल्लेख कर रहे हैं वह सामान्य उपयोग केस है। –

उत्तर

6

गति के आदेश में:

  1. मेम्कैश
  2. डेटा की दुकान में
  3. कैश्ड एचटीएमएल
  4. पूरे पृष्ठ पीढ़ी

आपका कैशिंग समाधान समय इसे ध्यान में रखना चाहिए। अनिवार्य रूप से, मैं शायद किसी भी तरह memcache का उपयोग करने की सिफारिश करेंगे। यह ज्यादातर मामलों में डेटा स्टोर तक पहुंचने से तेज़ होगा और जब आप एचटीएमएल का एक बड़ा ब्लॉक उत्पन्न कर रहे हैं, तो कैशिंग के मुख्य लाभों में से एक यह है कि आपको संभावित रूप से डेटा तक पहुंचने के I/O जुर्माना नहीं लेना पड़ता था दुकान। यदि आप डेटा स्टोर का उपयोग कर कैश करते हैं, तो आपके पास अभी भी I/O जुर्माना है। डेटा स्टोर में कैश किए गए एचटीएमएल से सब कुछ पुन: उत्पन्न करने और खींचने के बीच का अंतर काफी छोटा होने की संभावना है जब तक कि आपके पास एक जटिल पृष्ठ न हो। यह संभवतया बेहतर है कि बहुत तेज़ कैश का एक गुच्छा memcache से हिट हो और हर बार डेटा स्टोर में कॉल करने के बजाय हर बार एक पूर्ण पुनर्जन्म करें। जब आप अपडेट करते हैं तो memcache में कैश किए गए HTML को अमान्य करने से आपको रोक नहीं है, और यदि आपका ट्रैफ़िक वारंट करने के लिए पर्याप्त है, तो आप हमेशा एक बहु-स्तर कैशिंग सिस्टम कर सकते हैं।

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

कभी भी आप प्रदर्शन अनुकूलन कर रहे हैं, पहले उपाय करें! बहुत सारे प्रदर्शन "ऑप्टिमाइज़ेशन" या तो मूल की तुलना में धीमे हो जाते हैं, ठीक उसी तरह, या उनके पास नकारात्मक उपयोगकर्ता अनुभव विशेषताओं (जैसे स्टेल डेटा) हैं। ऑप्टिमाइज़ न करें जब तक आप निश्चित न हों कि आपको करना है।

+0

हाय बॉब, आपकी प्रतिक्रिया के लिए धन्यवाद! आपके सुझावों को ध्यान में रखेगा! –

+0

निश्चित रूप से बेंचमार्क मेमकैच किया गया है यदि आप इसमें बड़ी मात्रा में डेटा डालना चाहते हैं। ऐप इंजन पर यह शुद्ध पाइथन अचार कार्यान्वयन iiirc के साथ सब कुछ अचार करता है, यह * बहुत धीमा हो सकता है। – tosh

+0

यदि वह ऑब्जेक्ट डालने वाला ऑब्जेक्ट कच्चे प्री-रेंडर एचटीएमएल है, तो इससे कोई फर्क नहीं पड़ता। –

5

कुछ समय पहले मैंने ऐप इंजन पर ब्लॉगिंग सिस्टम लिखने के बारे में a series of blog posts लिखा था। आपको विशेष रुचि के static generation of HTML pages पर पोस्ट मिल सकता है।

1

यह एक पूरा समाधान नहीं है, लेकिन कैशिंग के लिए कुछ दिलचस्प विकल्प प्रदान कर सकता है।

Google Appengine Frontend Caching आपको memcache का उपयोग किए बिना कैशिंग का एक तरीका देता है।

1

बस अपनी साइट

यह वास्तव में बहुत आसान से आपको लगता है है की एक स्थिर संस्करण सेवा करते हैं।

यदि आपके पास पहले से कोई फ़ाइल है जिसमें आपकी साइट के लिए सभी यूआरएल (ex urls.py) हैं, तो आधा काम पहले ही हो चुका है।

+-/website 
+--/static 
+---/html 
+--/app/urls.py 
+--/app/routes.py 
+-/deploy.py 

/HTML जहां स्थिर फ़ाइलों से परोसा जाएगा है:

यहाँ संरचना है। urls.py में आपकी साइट के लिए सभी यूआरएल की एक सूची है। path.py (यदि आपने main.py के मार्गों को स्थानांतरित किया है) को संशोधित करने की आवश्यकता होगी ताकि आप स्थानीय रूप से गतिशील रूप से जेनरेट किए गए संस्करण को देख सकें लेकिन उत्पादन में स्थिर संस्करण की सेवा कर सकें। deploy.py आपकी एक-स्टॉप स्थिर साइट जनरेटर है।

आप अपने यूआरएल मॉड्यूल को कैसे लेआउट करते हैं। मैं व्यक्तिगत रूप से इसे एक पृष्ठ के लिए सभी मेटाडेटा लाने के लिए एक-स्टॉप-शॉप के रूप में उपयोग करता हूं लेकिन वाईएमएमवी।

उदाहरण:

main = [ 
    { 'uri':'about-us', 'url':'/', 'template':'about-us.html', 'title':'About Us' } 
] 
एक संरचित प्रारूप यह पाई के रूप में आसान अपनी खुद की साइट रेंगने बनाता में साइट के लिए url से साथ

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

यहाँ

यह है:

# Detect whether this the 'Development' server 
DEV = os.environ['SERVER_SOFTWARE'].startswith('Dev') 

मैं main.py में रखते हैं और यह विश्व स्तर पर बेनकाब क्योंकि मैं इसका इस्तेमाल लॉगिंग की तरह/बंद अन्य बातों को चालू करने की लेकिन, एक बार फिर, YMMV पसंद करते हैं।

import os 
import sys 
import urllib2 
from app.urls import main 

port = '8080' 
local_folder = os.getcwd() + os.sep + 'static' + os.sep + 'html' + os.sep 
print 'Outputting to: ' + local_folder 

print '\nCompiling:' 
for page in main: 
    http = urllib2.urlopen('http://localhost:' + port + page['url']) 
    file_name = page['template'] 
    path = local_folder + file_name 
    local_file = open(path, 'w') 
    local_file.write(http.read()) 
    local_file.close() 
    print ' - ' + file_name + ' compiled successfully...' 

यह वास्तव में अल्पविकसित सामान है:

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

सबसे अच्छा हिस्सा यह है कि/html फ़ोल्डर किसी अन्य स्थिर फ़ोल्डर की तरह काम करता है, इसलिए यह स्वचालित रूप से कैश किया जाएगा और कैश की समाप्ति आपकी शेष स्थिर फ़ाइलों के समान ही होगी।

नोट: यह ऐसी साइट को संभालता है जहां पृष्ठों को रूट फ़ोल्डर स्तर से सभी परोसा जाता है। यदि आपको फ़ोल्डरों की गहरी घोंसले की आवश्यकता है तो इसे संभालने के लिए इसे थोड़ा सा संशोधन करने की आवश्यकता होगी।

+0

हाय इवान। उपयोगी होने पर, आपका उत्तर एलेक्स के पर्यावरण के बारे में संभावित रूप से गलत धारणा बनाता है। यदि वह एक सामग्री प्रबंधन प्रणाली का निर्माण कर रहा है जहां व्यवस्थापक सामग्री को संपादित कर सकते हैं, तो आवेदन से स्वतंत्र, फिर स्थिर फाइलों का उपयोग स्पष्ट रूप से इस समस्या को हल करने वाला नहीं है। उन उत्तरों से बचने पर विचार करें जो वास्तव में प्रश्न का उत्तर नहीं देते हैं। कुछ समुदाय के सदस्य उनको कम कर देंगे। यदि आप जानते हैं कि जेनरेट किए गए HTML को कैश करना है, तो मैं आपको विस्तृत करने के लिए प्रोत्साहित करता हूं। फिर भी, मुझे लगता है कि यह उपयोगी जानकारी है, विशेष रूप से जेनरेट किए गए HTML को ब्राउज़र स्रोत के माध्यम से स्थिर HTML में परिवर्तित करने के चरण। – jmort253

+0

@ jmort253 दरअसल, सामग्री को संपादित करना और विकास सर्वर पर इसे गतिशील रूप से प्रदर्शित करना पूरी तरह से संभव है। आदर्श रूप से, उत्पादन सर्वर को सामग्री को धक्का देना 1-क्लिक संकलन/तैनाती चक्र शामिल है। गतिशील मार्ग (यानी, संपादन/व्यवस्थापक सुविधाएं) और गतिशील साइट फ़ाइलें विकास सर्वर पर उपलब्ध हैं, जबकि उत्पादन सर्वर साइट के स्थैतिक (यानी स्थैतिक/एचटीएमएल) संस्करण को इंगित करता है। उत्पादन के पक्ष में, सबकुछ स्थिर रहता है इसलिए सब कुछ स्वचालित रूप से कैश किया जाता है। –

+0

(cont) यह एक मानक/पारंपरिक दृष्टिकोण नहीं हो सकता है लेकिन यह काम करता है। मैं वर्तमान में इसे 2 साइटों के लिए उपयोग कर रहा हूं जहां विकास सर्वर जीएई है और उत्पादन अपाचे है (यानी सही फ़ाइल संरचना सेट करने के लिए रेगेक्स मार्गों का उपयोग करना)। जीएई तैनाती हुक के रूप में संकलक को आग लगाने के लिए सेट किया गया है, तो एक ही जीएई उत्पादन/विकास सेटअप के लिए भी किया जा सकता है और संस्करण संख्या सिंक में रहेगी। Https://developers.google.com/appengine/articles/hooks देखें। सीपीयू चक्र को कम करने का सबसे अच्छा तरीका कभी भी उत्पादन में गतिशील कोड लॉन्च नहीं करना है ... –

1

पुराने धागा है, लेकिन मैं वैसे भी टिप्पणी करेंगे प्रौद्योगिकी के रूप में एक छोटे से ... एक और विचार है कि या approproate आप HTML पैदा करते हैं और Google क्लाउड मेमोरी पर संग्रहीत करने के लिए है के लिए नहीं हो सकता प्रगति की है। फिर एचडीएमएल को एक सीडीएन लिंक के माध्यम से एक्सेस करें जो क्लाउड स्टोरेज आपके लिए प्रदान करता है। नए अनुरोधों पर जागने के लिए memcache की जांच करने या डेटास्टोर के लिए प्रतीक्षा करने की आवश्यकता नहीं है। Ive ने अपने सभी जावास्क्रिप्ट, सीएसएस, और अन्य स्थिर सामग्री (छवियों, डाउनलोड इत्यादि) को अपने ऐपेंजिन ऐप्स के लिए और मेरे लिए अच्छी तरह से काम करने के लिए इस तरह संग्रह करना शुरू कर दिया।

+1

इसमें जोड़ने के लिए, उसी क्षेत्र के भीतर क्लाउड सेवाओं के बीच प्रवेश/बहिष्कार निःशुल्क है: https://cloud.google.com/storage/pricing। इसलिए, जब तक आप उपयोगकर्ता को इसे सीधे एक्सेस करने की अनुमति नहीं दे रहे हैं, तब तक आप केवल संग्रहण के लिए भुगतान कर रहे हैं। यह बेहतर हो सकता है यदि आप अपनी स्थिर संपत्तियों पर अपनी किसी भी मेमकेच बैंडविड्थ को बर्बाद नहीं करना चाहते हैं। –