उत्पादन में मेमोरीस्टोर का उपयोग करना


116

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

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

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

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

जवाबों:


29

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

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

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


80

ठीक है, कनेक्ट डेवलपर्स से बात करने के बाद, मुझे अधिक जानकारी मिली। स्मृति लीक पर दो बातें मानी जाती हैं:

  1. जेएसएन पार्सिंग के साथ समस्या जो हाल के संस्करणों में पहले से तय है
  2. तथ्य यह है कि यदि उपयोगकर्ता कभी भी उन तक नहीं पहुंचते हैं (तो केवल सफाई का उपयोग होता है), समाप्त सत्रों की कोई सफाई नहीं है।

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

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

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


3
मुझे पता चला कि आप रेडिस और मोंगो को एक बैकिंग स्टोर के रूप में भी इस्तेमाल कर सकते हैं और डीबी को इसे साफ कर सकते हैं। मानगो के मामले में, आप अनुक्रमण सुनिश्चित करते हुए समाप्ति तिथि निर्धारित कर सकते हैं।
सुग्गी

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

2
var sessionStore का मान क्या है?
दिमित्री कोपरीवा

4
sessionStore? क्या यह एक वैश्विक संस्करण है। यदि नहीं, तो मैं नोड.जेएस में सत्र स्टोर का संदर्भ कैसे प्राप्त कर सकता हूं?
26

1
@MilanBabuskov - क्या आप इसे अपनी app.jsफ़ाइल में रखते हैं? क्या एक्सप्रेस सत्र के अंदर कॉलबैक जारी करने का विकल्प है? इसे कैसे थोपा जाए, इस पर थोड़ा और विस्तार।
जोनाथन Bechtel

46

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

मुझे भी यही समस्या थी और बस एक्सप्रेस-सेशन को कुकी-सेशन से बदल दिया गया ।

ऐसा करने के लिए बस स्थापित करें cookie-session:

npm install cookie-session

फिर अपने में app.js, पता लगाएं कि कहां express-sessionइस्तेमाल किया जा रहा है और इसके साथ बदलें cookie-session

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

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


2
आपने ऐसा कैसे किया।
सिड

2
यह वास्तव में एक उत्तर है जो उपयोगी है। Thanx।
स्मॉनफ

5
अंतर यह है कि cookie-sessionग्राहक पर डेटा संग्रहीत करता है, जबकि express-sessionसर्वर पर डेटा संग्रहीत करता है।
जॉर्ज

11

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

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


यह कोशिश नहीं की है, लेकिन यह स्थिति के लिए एक महान तय की तरह दिखता है (यदि ओपी फिर से शुरू होने वाले सत्रों के साथ ठीक है)
स्टुजो

आपके लिंक से: "यह अत्यधिक उत्पादन में उपयोग करने की अनुशंसा नहीं करता है!"। प्रश्न "उत्पादन में मेमोरीस्टोर का उपयोग" के बारे में है।
डेमियन

सही है, लेकिन केवल इसलिए कि "आप सत्र को अन्य प्रक्रिया या अन्य सेवा के साथ साझा नहीं कर सकते।" मतलब, वहाँ अन्य व्यावहारिक समाधान हैं। लेकिन यह मेमोरी लीक के मुद्दे को हल करता है, इसलिए यदि वे आपके लिए चिंता का विषय नहीं हैं तो सवाल में चिंता का उपयोग करना और उन्हें संबोधित करना ठीक है।
दोव हेफेट्ज़

7

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

हालाँकि, चूंकि आप और मैं दोनों इस बात से सहमत हैं कि मेमोरी लीक एक वास्तविक समस्या है, इसलिए यह कहना कठिन है कि रेडिस ओवरकिल है, क्योंकि यह आपकी समस्या का समाधान करेगा।

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

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


2
चेतावनी को दबाने से मेमोरी लीक नहीं होगी।
मिलन बाबुकोव

योग्य यही है कि वे उत्पादन में इसका उपयोग करने की सलाह देते हैं। इसलिए वैकल्पिक भंडारण की वैकल्पिक विधि का उपयोग करना है, है ना?
क्रिस्टियन

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

2
मुझे आपका दर्द महसूस हो रहा है, लेकिन अभी बहुत ज्यादा ब्लीडिंग एज है .. यह छंटनी क्षेत्र के साथ आती है
क्रिस्टियन

7
मेमोरीस्टोर को नोड में शामिल नहीं किया गया है, यह
मुस्तफा

6

इसका विकल्प रेडिस या मोंगो को स्टोर के रूप में उपयोग करना है। Mongo के साथ आप एक्सप्रेस-सेशन-मोंगो मॉड्यूल का उपयोग करते हैं ।

एक अनुक्रमण विकल्प के साथ बासी सत्र को हटाने की सलाह है:

var MongoStore = require('express-session-mongo');
app.use(express.session({ store: new MongoStore() }));

db.sessions.ensureIndex( { "lastAccess": 1 }, { expireAfterSeconds: 3600 } )

चूंकि बासी सत्रों को डेटाबेस द्वारा ही हटा दिया जाता है, इसलिए एक्सप्रेस सत्र को स्वयं से सफाई को संभालने की आवश्यकता नहीं है।

संपादित करें : ऐसा लगता है कि आपके पास अपना "अंतिम असफल" क्षेत्र होना चाहिए। जब आप इसे एक्सेस करते हैं तो आप उस फील्ड को खुद अपडेट करते हैं। MongoDB डॉक्यूमेंटेशन एक्सपायर-डेटा की जांच करें http://docs.mongodb.org/manual/tutorial/expire-data/

EDIT2 :

अब बन जाता है db.sessions.createIndex( { "createdAt": 1 }, { expireAfterSeconds: 3600 } )

इस क्षेत्र को जाँचने के लिए मैंगो बैकग्राउंड थ्रेड हर 60 सेकंड में चलता है। इसलिए दस्तावेज़ को हटाने का समय सटीक नहीं है।


2

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

मैं DEV और PROD के लिए रेडिस का उपयोग कर रहा हूं और एक्सप्रेस v4 को लक्षित कर रहा हूं। विंडोज पर मैं हल्के MSOpenTech Redis v3.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। मैंने केवल मूल प्रश्न को फिर से पढ़ा और इस पर ध्यान दिया - क्षमा करें!

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


0

यदि आप OSX का उपयोग करते हैं

brew install memcached

अगर लिनक्स

apt install memcached

सत्र संदेश को हल करें, डीज़ोस डी ऐप 127.0.0.1:11211 मेमकेच सेवा से जुड़ सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.