2012-05-25 15 views
95

आज मैं पहली बार के लिए "उत्पादन" मोड में मेरी Node.js आवेदन भाग गया और यह चेतावनी मिल गया:उत्पादन में MemoryStore का उपयोग करना

Warning: connection.session() MemoryStore is not 
designed for a production environment, as it will leak 
memory, and obviously only work within a single process. 

मैं केवल एक ही प्रक्रिया को चलाने की जरूरत है, लेकिन मैं क्या इस्तेमाल करना चाहिए बजाय? मैं चाहता हूं कि मेरे सत्र रैम में तेजी से पहुंच के लिए रहें। मैं नोड ऐप को बंद करके सभी सत्रों को त्यागने में भी सक्षम होना चाहता हूं।

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

उत्तर

16

मेमोरीस्टोर केवल (तेज़) विकास मोड के लिए है, क्योंकि यदि आपका ऐप पुनरारंभ होता है (प्रक्रिया मर जाती है) तो आप सभी सत्र डेटा खो देंगे (जो उस प्रक्रिया की स्मृति में रहते हैं)।

यदि आप डेटाबेस का उपयोग नहीं करना चाहते हैं, तो इसके बजाय एन्क्रिप्टेड कुकी स्टोरेज का उपयोग करें।

http://www.senchalabs.org/connect/cookieSession.html

6

मुझे लगता है कि वेब के आसपास सर्वसम्मति यह है कि वास्तव में इसके लिए डीबी का उपयोग करना सही होगा, लेकिन यदि आप सकारात्मक हैं तो आप ऐसा नहीं करना चाहते हैं, तो चेतावनी दबाएं - चेतावनी है कानून नहीं

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

मैं भी समझ में नहीं आता क्यों MemoryStore नोड में शामिल है, जब यह वास्तव में

एक महान बात यह है कि नहीं किया जाना चाहिए - लेकिन यह है कि करने के लिए मैं कहूँगा कि नोड iself केवल हाल ही में खुद उत्पादन तैयार बन गया। कुछ लोग इस धारणा से सहमत नहीं होंगे कि यह बिल्कुल भी है।

+2

चेतावनी को दबाकर स्मृति रिसाव दूर नहीं जाएगी। –

+0

lol यही कारण है कि वे उत्पादन में इसका उपयोग कर आपके खिलाफ सलाह देते हैं।तो विकल्प भंडारण की वैकल्पिक विधि का उपयोग करना है, है ना? – Kristian

+1

मुझे लगता है कि मुझे अभी तक जो विकल्प मिले हैं उन्हें पसंद नहीं है। मैं एक साधारण इन-मेमोरी जावास्क्रिप्ट विकल्प की तलाश में हूं, डेटाबेस सिस्टम नहीं। मैं वास्तव में समझ में नहीं आता कि वे इसे ठीक क्यों नहीं करते हैं। मेरा मतलब है, एक साधारण मेमोरी स्टोर कितनी मुश्किल हो सकती है ... मैं उम्मीद कर रहा हूं कि किसी ने पहले से ही इसे किया है, इसलिए मुझे पहिया का फिर से आविष्कार करने की ज़रूरत नहीं है। –

74

ठीक है, डेवलपर्स कनेक्ट करने के लिए बात कर के बाद, मैं और अधिक जानकारी मिल गया। जो पहले से ही हाल के संस्करणों में तय हो गई है

  • तथ्य की अवधि समाप्त हो सत्रों में से कोई सफाई नहीं है कि अगर उन उन तक पहुँच कभी नहीं (यानी केवल सफाई JSON पार्स साथ

    1. समस्या: वहाँ दो बातें स्मृति यहाँ लीक माना जाता है ऑन-एक्सेस है)

    समाधान अपेक्षाकृत सरल लगता है, कम से कम यही वह है जो मैं करने की योजना बना रहा हूं: समय-समय पर समाप्त होने वाले सत्रों को साफ़ करने के लिए सेट इंटरवल का उपयोग करें। मेमोरीस्टोर सूची प्राप्त करने के लिए सभी() प्रदान करता है, और हम पढ़ने को मजबूर करने के लिए get() का उपयोग कर सकते हैं और इस प्रकार उन्हें समाप्त कर सकते हैं। छद्म कोड:

    function sessionCleanup() { 
        sessionStore.all(function(err, sessions) { 
         for (var i = 0; i < sessions.length; i++) { 
          sessionStore.get(sessions[i], function() {}); 
         } 
        }); 
    } 
    

    अब बस sessionCleanup समय-समय पर setInterval के माध्यम से फोन() और आप समाप्त हो गई सत्र के लिए स्वत: कचरा संग्रहण की है। कोई और स्मृति रिसाव नहीं।

  • +3

    में शामिल किया गया है, मैंने पाया कि आप रेडिस और मोंगो को बैकिंग के रूप में भी इस्तेमाल कर सकते हैं स्टोर करें और डीबी इसे साफ़ करें। मोंगो के मामले में, आप इंडेक्सिंग सुनिश्चित करते समय समाप्ति तिथि निर्धारित कर सकते हैं। – huggie

    +44

    यह वास्तव में एक बेवकूफ चीज है जो उन्होंने इस संदेश को डालकर किया है। ऐसा लगता है कि "हम इसे सही बना सकते थे लेकिन इसके बजाय हम इसे गलत बना देंगे और आप इंटर्ननेट पर अनुमान लगाने वाले गेम खेलेंगे। हा हा! हारने वाले!" – asdfasdfads

    +1

    var sessionStore का मूल्य क्या है? – BigDong

    5

    विकल्प रेडीस या मोंगो को स्टोर के रूप में उपयोग करना है। मोंगो के साथ आप express-session-mongo मॉड्यूल का उपयोग करते हैं।

    var MongoStore = require('express-session-mongo'); 
    app.use(express.session({ store: new MongoStore() })); 
    
    db.sessions.ensureIndex({ "lastAccess": 1 }, { expireAfterSeconds: 3600 }) 
    

    के बाद से बासी सत्र डेटाबेस से ही निकाल दिए जाते हैं, एक्सप्रेस सत्र से ही सफाई संभाल करने की जरूरत नहीं है:

    एक अनुक्रमण विकल्प के साथ बासी सत्र दूर करने के लिए एक सलाह है।

    EDIT: ऐसा लगता है कि आपको अपना "अंतिम एक्सेस" फ़ील्ड होना चाहिए। जब आप इसे एक्सेस करते हैं तो आप उस क्षेत्र को स्वयं अपडेट करते हैं।

    अब db.sessions.createIndex({ "createdAt": 1 }, { expireAfterSeconds: 3600 })

    मोंगो पृष्ठभूमि धागा हो जाता है इस क्षेत्र को हर 60 सेकंड चलाता है की जाँच करने के: MongoDB प्रलेखन expire-data http://docs.mongodb.org/manual/tutorial/expire-data/

    EDIT2 की जाँच करें। तो दस्तावेज़ को हटाने का समय सटीक नहीं है।

    28

    तो इसका स्वीकार्य उत्तर [संपादित करें] बहुत हैक था, और अन्य सिर्फ एक डेटाबेस का उपयोग करने की सिफारिश कर रहे हैं जो मुझे लगता है कि ओवरकिल है।

    मुझे एक ही समस्या थी और cookie-session के साथ एक्सप्रेस-सत्र को प्रतिस्थापित किया गया। अपने app.js में

    npm install cookie-session 
    

    फिर, जहां express-session किया जा रहा है और cookie-session के साथ बदलें लगता है:

    यह बस cookie-session स्थापित करने के लिए।

    app.use(require('cookie-session')({ 
        // Cookie config, take a look at the docs... 
    })); 
    

    मेरे लिए एक सरल स्वैप बाहर बॉब्स-अपने चाचा-नो-नुकसान किया था है आप, कुछ अन्य बातों को बदलने की जरूरत हो सकती है।

    +2

    आपने यह कैसे किया। – Sid

    +2

    यह वास्तव में एक उत्तर है जो उपयोगी है। Thanx। – smonff

    6

    यह मॉड्यूल स्मृति रिसाव के मुद्दे से निपटने के लिए डिज़ाइन किया गया था। https://www.npmjs.com/package/session-memory-store

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

    +0

    इसने कोशिश नहीं की है लेकिन यह स्थिति के लिए एक महान फिक्स की तरह दिखता है (यदि ऐप पुन: प्रारंभ करने पर खोए गए सत्रों के साथ ठीक है) – stujo

    1

    उन लोगों के लिए जो रेडिस के साथ परेशानी कर रहे हैं उनके लिए निम्नलिखित प्रयास करें - उम्मीद है कि इससे मदद मिलती है।

    मैं डीवी और प्रोडी के लिए रेडिस का उपयोग कर रहा हूं और एक्सप्रेस v4 को लक्षित कर रहा हूं। विंडोज़ पर मैं हल्के एमएस ओपनटेक रेडिस वी 3.0 टूलसेट का उपयोग कर रहा हूं, अन्यथा, मैं केवल हेरोोक रेडिस एडन का उपयोग करता हूं। इसे नोड के माध्यम से काम करने के लिए बहुत कठिन नहीं रहा है - अब तक ...

    var session = require('express-session'); 
    
    . . . 
    
    var RedisStore = require('connect-redis')(session); 
    
    var redisClient = require('redis').createClient(process.env.REDIS_URL); 
    
    var redisOptions = { 
         client: redisClient, 
         no_ready_check: true, 
         ttl: 600, 
         logErrors: true 
    }; 
    
    var redisSessionStore = new RedisStore(redisOptions); 
    
    app.use(session({ 
        store: redisSessionStore, 
        secret: 'Some.Long.Series.of.Crazy.Words.and.Jumbled.letter.etc', 
        resave: true,  
        saveUninitialized: true 
    })); 
    

    शुभकामनाएं!

    ps। मैं केवल मूल क्वेरी को फिर से पढ़ता हूं और इसे देखा - माफ करना!

    यह इस सरल कार्य के लिए रेडिस, मोंगोडीबी या किसी अन्य डेटाबेस को स्थापित करने के लिए एक ओवरकिल लगता है।

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