2012-01-05 17 views
63

मैं नोड्स एक्सप्रेस डब्ल्यू/कनेक्ट मिडलवेयर का उपयोग कर रहा हूं। कनेक्ट की स्मृति सत्र की दुकान के उत्पादन के लिए उपयुक्त नहीं है:एकल होस्ट नोड.जेएस उत्पादन ऐप के लिए एक अच्छा सत्र स्टोर क्या है?

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

बड़ा तैनाती, मोंगो या redis के लिए समझ में आता है।

लेकिन उत्पादन में एकल होस्ट ऐप के लिए एक अच्छा समाधान क्या है?

+1

मैं कुकी sessiosn उपयोग कर रहा था लेकिन वहाँ है कहीं न कहीं या नहीं संग्रहीत sessiosn डेटा क्योंकि जो वर्तमान सत्र तभी दिखाया जा रहा था, लेकिन नहीं पिछले अभियानों मेरे मामले में हो रहा था था ?? –

उत्तर

77

इस दिन देखकर दिन बिताएं। यहां दिए गए विकल्प यहां दिए गए हैं। अनुरोध/सेकंड मेरी स्थानीय मशीन पर ab -n 100000 -c 1 http://127.0.0.1:9778/ के माध्यम से किया जाता है।

  • लिए कोई सत्र - तेजी से (438 अनुरोध/सेकंड)
  • cookieSession: कोई बाहरी सेवा, नाबालिग गति प्रभाव (311 अनुरोध/सेकंड) की आवश्यकता है - सबसे तेज, सत्र कुकी (maxAge द्वारा अनुकूलित) के साथ समाप्त हो जाएगा
  • connect-redis: redis सर्वर, बड़े गति प्रभाव (4 अनुरोध/redis2go और redisgreen साथ सेकंड) की आवश्यकता है - तेजी से मोंगो से, सत्र एक समय (ttl द्वारा अनुकूलित)
  • connect-mongo बाद हटा दिया जाएगा - MongoDB सर्वर, बड़े गति प्रभाव की आवश्यकता है (Mongohq के साथ 2 req/sec) - redis से धीमी, फिर से

    server.use express.cookieSession({ 
        secret: appConfig.site.salt 
        cookie: maxAge: 1000*60*60 
    }) 
    

    यहाँ है coffeescript मैं redis के लिए उपयोग करें:: quires मैनुअल clear_interval सफाई सत्र के लिए स्थापित किया जाना

यहाँ coffeescript मैं cookieSession के लिए इस्तेमाल किया है

RedisSessionStore ?= require('connect-redis')(express) 
redisSessionStore ?= new RedisSessionStore(
    host: appConfig.databaseRedis.host 
    port: appConfig.databaseRedis.port 
    db: appConfig.databaseRedis.username 
    pass: appConfig.databaseRedis.password 
    no_ready_check: true 
    ttl: 60*60 # hour 
) 
server.use express.session({ 
    secret: appConfig.site.salt 
    cookie: maxAge: 1000*60*60 
    store: redisSessionStore 
}) 

यहाँ है मेरी mongo के लिए coffeescript:

server.use express.session({ 
    secret: appConfig.site.salt 
    cookie: 
     maxAge: 100*60*60 
    store: new MongoSessionStore({ 
     db: appConfig.database.name 
     host: appConfig.database.host 
     port: appConfig.database.port 
     username: appConfig.database.username 
     password: appConfig.database.password 
     auto_reconnect: appConfig.database.serverOptions.auto_reconnect 
     clear_interval: 60*60 # hour 
    }) 
}) 

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

स्थानीय डेटाबेस benhmarks के लिए, @Mustafa's answer देखें।

मिश्रण के लिए अपने स्थानीय डेटाबेस मानक जोड़ने के लिए edit this answer पर किसी के लिए खुश है।

+0

वाह, अच्छा संख्या देख रहे हैं। निश्चित रूप से मेरे फैसलों को प्रभावित किया। धन्यवाद! –

+0

ओच, मैं वास्तव में हैरान हूं कि रेडिस प्रदाता इतना धीमा है ... – UpTheCreek

+0

वैसे, मेमोरीस्टोर इनके साथ बेंचमार्क देखना वास्तव में बहुत अच्छा होगा - कोई मौका? ;) – UpTheCreek

2

मैं सिर्फ node.js की तलाश कर रहा हूं, लेकिन यदि आपको सत्र ऑब्जेक्ट में बहुत सारी जानकारी स्टोर करने की आवश्यकता नहीं है - तो आप सुरक्षित कुकीज़ का पता लगाना चाहेंगे।

ब्राउजर स्टोर और प्रत्येक अनुरोध के साथ आगे की कुकी के हिस्से के रूप में सुरक्षित कुकीज़ स्टोर सत्र जानकारी सुरक्षित करें। वे उपयोगकर्ता को वैध कुकी बनाने से रोकने के लिए एन्क्रिप्टेड हैं।

लाभ यह है कि आपको सर्वर पर राज्य को बनाए रखने की आवश्यकता नहीं है - यह समाधान अच्छी तरह से स्केल करता है और इसे लागू करने में आसान है।

नुकसान यह है कि आप केवल 4KB के बारे में तक जमा कर सकते है और उस डेटा हर अनुरोध पर सर्वर के लिए भेजा जाता है (लेकिन आप एक से अधिक फर्जी अपने सर्वर पर इंगित डोमेन हो सकता है तो आप पर है कि सामान लागू नहीं सार्वजनिक रूप से दृश्यमान स्थिर सामग्री, उदाहरण के लिए)।

वेब पर खोजना ऐसा लगता है कि node.js. के लिए सुरक्षित कुकीज़ के कम से कम दो कार्यान्वयन हैं। सुनिश्चित नहीं हैं कि उत्पादन के लिए तैयार वे कर रहे हैं, हालांकि:

https://github.com/benadida/node-client-sessions/blob/master/lib/client-sessions.js

https://github.com/caolan/cookie-sessions

+0

मजेदार, बेन अडिडा वास्तव में मेरा एक दोस्त है। छोटी सी दुनिया! – Nils

+1

मैं एक विशेषज्ञ नहीं हूं, लेकिन मैंने सोचा कि आम सहमति यह है कि सुरक्षित कुकीज़ '... अच्छी तरह से सुरक्षित नहीं हैं। मैं कुछ पढ़ूंगा लेकिन मैं ऐसा कुछ भी नहीं करना चाहता जो मुख्यधारा नहीं है। – Nils

+0

ठीक है, आप हमेशा फ़ाइलों पर आधारित एक साधारण सत्र स्टोर को जा सकते हैं और कार्यान्वित कर सकते हैं - कुछ ऐसा करता है जो PHP करता है। मान लें कि ओएस उन फ़ाइलों को कैश करता है जिन्हें आपको उचित प्रदर्शन मिलेगा। या आप tmpfs का उपयोग कर सकते हैं जो स्मृति-समर्थित फाइल सिस्टम है। – nimrodm

5

मैं अभी भी यहां तक ​​कि स्थानीय विकास के लिए Redis का प्रयोग करेंगे। यह सहायक है क्योंकि जब आप अपने ब्राउज़र सत्र को लॉग इन करते हुए नोड एप्लिकेशन को पुनरारंभ करते हैं, तब भी यह सत्र संग्रहीत करता है। डिफ़ॉल्ट रूप से Redis स्मृति में सत्र को सहेजता है, जैसे कनेक्ट की मेमोरी स्टोर कॉन्फ़िगर करने के लिए सरल है (मैं इसे स्क्रीन में भी चलाता हूं मेरे नोड ऐप्स) यदि आप कॉन्फ़िगरेशन में किसी भिन्न डेटाबेस या सत्र मान का उपयोग करते हैं तो एकाधिक अनुप्रयोगों का समर्थन कर सकते हैं।

+0

मैं देव और प्रोड के लिए अलग-अलग स्टोरों का उपयोग नहीं करता, निस्संदेह आपको इस तरह से त्रुटिपूर्ण त्रुटियों का सामना करना पड़ेगा। टिम सही है, स्थानीय और प्रोड के लिए रेडिस का उपयोग करें। – chovy

+0

यदि आप विंडोज़ बॉक्स पर विकसित होते हैं तो बहुत मजेदार नहीं है। – UpTheCreek

+0

मैं कुकी-सेसियोसिन का उपयोग कर रहा था लेकिन वहां कहीं भी संग्रहीत डेटा है या नहीं, क्योंकि मेरे मामले में क्या हो रहा था वर्तमान सत्र केवल दिखाए जा रहे थे, लेकिन पिछले नहीं ?? –

8

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

  • कभी खाली स्थान के है
  • बारे में पता किसी भी नामस्थान उपसर्ग आप सहित एक अधिकतम कैश कुंजी लंबाई, है कि वहाँ रहें:

    https://github.com/elbart/node-memcache

    ध्यान रखने योग्य बातें करने के बारे में आम तौर पर memcached उपयोग कर सकते हैं। यदि आपकी कैश कुंजी बहुत लंबी है, तो इसके बजाय 1-रास्ता हैश का उपयोग करें।

इनमें से कोई भी सत्र संग्रहण के साथ कोई समस्या नहीं होनी चाहिए; बस सामान्यीकृत कैशिंग के साथ।

+0

क्या आप जानते हैं कि इसे मिडलवेयर के सत्र हैंडलर से कनेक्ट करने के लिए कैसे प्लग करें? (मैं इस क्षेत्र में एक n00b हूँ) – Nils

+0

कोई खेद नहीं है मैंने वास्तव में इसे नहीं किया है। – kgilpin

+0

@Chocohound क्या आपको पता चला .. मैं मेमकैच सर्वर से कनेक्ट करने में सक्षम हो सकता हूं .. लेकिन मैं वातावरण फ़ाइल में memcache के साथ सत्र स्टोर को कैसे कॉन्फ़िगर कर सकता हूं? – Alan

6

मैं connect-mongo का उपयोग कर एक मोंगोडीबी सत्र स्टोर के साथ गया हूं।

npm install connect-mongo साथ स्थापित करें और साथ

app.use(express.session({ store: new MongoStore({ db: 'some-database' }) }));

यह सत्र के डेटाबेस ओर प्रबंधित करता है कि मौजूदा MemoryStore बदलें।

64

चूंकि स्वीकृत उत्तर केवल दूरस्थ होस्ट से कनेक्ट हो रहा है, यह स्पष्ट है कि यह हमेशा स्थानीयहोस्ट से धीमा होगा। यहां तक ​​कि यदि यह आपके घर में अगला कंप्यूटर है, तो उस कंप्यूटर से पढ़ने के लिए मिलीसेकंड लगेगा, लेकिन स्थानीय मेमोरी केवल नैनोसेकंड लेती है। आपको स्थानीय रूप से स्थापित सर्वरों का उपयोग करके उनकी तुलना करनी चाहिए।

यहां मेरे स्थानीय पीसी से मेरे परिणाम हैं: आप देखते हैं, रेडिस उच्च लोड के तहत इन-मेमोरी के जितना तेज़ है।तुम मेरी रेपो कि इन परीक्षण कोड उपलब्ध हैं क्लोन कर सकते हैं: https://github.com/mustafaakin/express-session-store-benchmark

Concurrency: 1 
none  4484.86 [#/sec] 
memory  2144.15 [#/sec] 
redis  1891.96 [#/sec] 
mongo  710.85 [#/sec] 
Concurrency: 10 
none  5737.21 [#/sec] 
memory  3336.45 [#/sec] 
redis  3164.84 [#/sec] 
mongo  1783.65 [#/sec] 
Concurrency: 100 
none  5500.41 [#/sec] 
memory  3274.33 [#/sec] 
redis  3269.49 [#/sec] 
mongo  2416.72 [#/sec] 
Concurrency: 500 
none  5008.14 [#/sec] 
memory  3137.93 [#/sec] 
redis  3122.37 [#/sec] 
mongo  2258.21 [#/sec] 

सत्र का इस्तेमाल किया पृष्ठों बहुत सरल पृष्ठों कर रहे हैं;

app.get("/", function(req,res){ 
    if (req.session && req.session.no){ 
     req.session.no = req.session.no + 1; 
    } else { 
     req.session.no = 1; 
    } 
    res.send("No: " + req.session.no); 
}); 

Redis दुकान config:

app.use(express.session({ 
    store: new RedisStore({ 
     host: 'localhost', 
     port: 6379, 
     db: 2, 
     }), 
    secret: 'hello' 
})); 

मोंगो दुकान config:

app.use(express.cookieParser()); 
app.use(express.session({ 
    store: new MongoStore({ 
     url: 'mongodb://localhost/test-session' 
    }), 
    secret: 'hello' 
})); 
+0

मैं कुकी-सेसियोसिन का उपयोग कर रहा था लेकिन वहां कहीं भी संग्रहीत डेटा है या नहीं, क्योंकि मेरे मामले में क्या हो रहा था वर्तमान सत्र केवल दिखाए जा रहे थे, लेकिन पिछले नहीं ?? –

1

अलग सत्र के कार्यान्वयन की https://github.com/llambda/express-session-benchmarks दिखा तुलना में चेक बाहर मेरी बेंचमार्क।

+0

मैं कुकी-सेसियोसिन का उपयोग कर रहा था लेकिन वहां कहीं भी संग्रहीत डेटा है या नहीं, क्योंकि मेरे मामले में क्या हो रहा था वर्तमान सत्र केवल दिखाए जा रहे थे, लेकिन पिछले नहीं ?? –

0

मुझे खुशी है कि यह एक पुराने सवाल है, लेकिन मैं थोड़ी देर के लिए एक समान समस्या का समाधान के लिए खोज यह बारे में जाना। मैंने पहले ही लिनक्स पर सत्र संग्रहण के लिए memcached का उपयोग करने का निर्णय लिया था (connect-memcached के साथ), लेकिन मुझे विंडोज़ पर चलाने की क्षमता भी आवश्यक थी। मैंने एकल प्रक्रिया नोड ऐप के लिए इन-मेमोरी सत्र संग्रहण खोजने का प्रयास करते समय थोड़ी देर बिताई। रेडिस और मेमकैच विंडोज पर अच्छी तरह से समर्थित नहीं दिखते हैं, और मैं उनकी स्थापना की अतिरिक्त जटिलता नहीं चाहता था।

मैं एक स्टैक ओवरफ़्लो धागा है, जो अच्छा लग रहा है लेकिन काफी मेरी निर्भरता के आकार में वृद्धि में session-memory-store पाया।

अंत में, मुझे memorystoreexpress-session के लिए प्रलेखन में मिला। मैं यह मूल रूप से डिफ़ॉल्ट MemoryStore के लिए इसका नाम की इसी तरह की वजह से याद किया था, लेकिन यह वास्तव में मैं क्या देख रहा था है: लीक बिना

एक्सप्रेस-सत्र पूर्ण विशेषताओं MemoryStore मॉड्यूल!

मैं अब का उपयोग कर रहा कनेक्ट-memcached जब एक क्लस्टर में चल रहा है, और memorystore (लिनक्स केवल पर) जब एक ही प्रक्रिया (लिनक्स या विंडोज पर) चल रहा है।

मैं यह सोचा एक और जवाब के रूप में इस पोस्टिंग के लायक, अगर किसी को भी में बाकी memorystore लापता के रूप में मैं शुरू में किया था की गलती करता है।