উত্পাদনে মেমোরিস্টোর ব্যবহার করা হচ্ছে


116

আজ আমি প্রথমবার "প্রডাকশন" মোডে আমার নোড.জেএস অ্যাপ্লিকেশনটি চালিয়েছি এবং এই সতর্কতা পেয়েছি:

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

আমার কেবল একটি একক প্রক্রিয়া চালানো দরকার তবে এর পরিবর্তে আমার কী ব্যবহার করা উচিত? আমি চাই আমার সেশনগুলি দ্রুত অ্যাক্সেসের জন্য র‍্যামে থাকতে পারে। আমি কেবল নোড অ্যাপটি বন্ধ করে সমস্ত সেশনটি বাতিল করতে সক্ষম হতে চাই।

কেবলমাত্র এই সাধারণ কাজের জন্য রেডিস, মঙ্গোডিবি বা অন্য একটি ডাটাবেস ইনস্টল করার জন্য এটি একটি ওভারকিল বলে মনে হচ্ছে। আমি এও বুঝতে পারি না যে মেমোরিস্টোরটি নোডের সাথে কেন অন্তর্ভুক্ত করা হয়েছে যখন এটি সত্যই ব্যবহার করা উচিত নয়?

উত্তর:


29

মেমোরিস্টোরটি কেবলমাত্র (দ্রুত) বিকাশের মোডের জন্য, কারণ যদি আপনার অ্যাপ্লিকেশন পুনরায় চালু হয় (প্রক্রিয়াটি মারা যায়) আপনি সমস্ত সেশন ডেটা হারাবেন (যা সেই প্রক্রিয়ার স্মৃতিতে থাকে)।

আপনি যদি কোনও ডেটাবেস ব্যবহার করতে না চান তবে পরিবর্তে এনক্রিপ্ট করা কুকি স্টোরেজ ব্যবহার করুন।

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


80

ঠিক আছে, কানেক্ট বিকাশকারীদের সাথে কথা বলার পরে আমি আরও তথ্য পেয়েছি। এখানে দুটি জিনিস মেমরি ফুটো বিবেচনা করা হয়:

  1. সাম্প্রতিক সংস্করণগুলিতে ইতিমধ্যে ঠিক করা জেএসএন পার্সিংয়ের সাথে সমস্যা
  2. মেয়াদোত্তীর্ণ সেশনগুলির কোনও ক্লিনআপ নেই এই বিষয়টি যদি ব্যবহারকারীরা তাদের অ্যাক্সেস না করে তবে (যেমন একমাত্র ক্লিনআপ অন-এক্সেস রয়েছে)

সমাধানটি বরং সহজ বলে মনে হচ্ছে, কমপক্ষে এটি আমি করার পরিকল্পনা করছি: মেয়াদোত্তীর্ণ সময়সীমা পরিষ্কার করার জন্য setInterval ব্যবহার করুন। মেমোরিস্টোর তালিকাটি পেতে সমস্ত () সরবরাহ করে এবং আমরা পড়তে বাধ্য করার জন্য () ব্যবহার করতে পারি এবং সেগুলি শেষ হয়ে যায়। সুডোকোড:

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

এখন কেবলমাত্র সেটআইন্টারওয়াল () এর মাধ্যমে পর্যায়ক্রমে সেশনক্লানআপ কল করুন এবং মেয়াদোত্তীর্ণ সেশনগুলির জন্য আপনার স্বয়ংক্রিয় আবর্জনা সংগ্রহ রয়েছে। আর স্মৃতি ফাঁস হয় না।


3
আমি আবিষ্কার করেছি যে আপনি রেডিস এবং মঙ্গোকেও একটি ব্যাকিং স্টোর হিসাবে ব্যবহার করতে পারেন এবং ডিবি এটি পরিষ্কার করে দিতে পারেন। মঙ্গোর ক্ষেত্রে, আপনি ইনডেক্সিং নিশ্চিত করার সময় মেয়াদোত্তীকরণের তারিখ নির্ধারণ করতে পারেন।
— হুগি

57
এই বার্তাটি সেখানে রাখার মাধ্যমে তারা সত্যিই একটি বোকামি কাজ করেছে। এটি এর মতো "আমরা এটি সঠিকভাবে তৈরি করতে পারতাম তবে পরিবর্তে আমরা কেবল এটি ভুল করব এবং আপনি ইন্টারনেটগুলিতে অনুমানের খেলা খেলতে যান! হা হা! হেরে!"
— ক্যাটালফেটামাইন

2
ভার সেশনস্টোরের মান কত?
— দিমিত্রি কোপ্রিভা

4
sessionStore? এটি কি কোনও নোড.জেএস বিশ্বব্যাপী পরিবর্তনশীল? যদি তা না হয় তবে আমি কীভাবে নোড.জেজে সেশন স্টোরের একটি রেফারেন্স পেতে পারি?
— উইন্ডচাইম

1
@ মিলনবাবুস্কভ - আপনি কি এটি আপনার app.jsফাইলটিতে রেখেছেন ? এক্সপ্রেস সেশনে কলব্যাক দেওয়ার বিকল্প নেই? এটি কীভাবে প্ররোচিত করা যায় সে সম্পর্কে আরও কিছু বিশদ দুর্দান্ত।
— জোনাথন বেচটেল

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...
}));

আপনার কিছু অন্যান্য জিনিসও বদলের দরকার হতে পারে, আমার জন্য এটি ছিল আপনার স্বামী-চাচা-কোনও ক্ষতি-করা simple


2
আপনি এটা কিভাবে করেছিলেন.
— সিড

2
এটি আসলে একটি উত্তর যা দরকারী। ধন্যবাদ।
— সমালোচনা

5
পার্থক্যটি হ'ল cookie-sessionক্লায়েন্টের ডেটা সঞ্চয় করে, যেখানে express-sessionসার্ভারে ডেটা সঞ্চয় করে।
— জর্জে

11

এই মডিউলটি মেমরি ফাঁস ইস্যু মোকাবেলার জন্য ডিজাইন করা হয়েছিল। https://www.npmjs.com/package/session-memory-store

গৃহীত উত্তর ভাল হতে পারে। যাইহোক, যেহেতু এই প্রশ্নটি অনুসন্ধান ফলাফলগুলির তালিকায় উচ্চতর দেখায় আমি মনে করি যে এটি অন্য কাউকে সহায়তা করার ক্ষেত্রে আমি এটি অন্তর্ভুক্ত করব।


এটি চেষ্টা করে
— দেখেনি

আপনার লিঙ্কটি থেকে: "এটি উত্পাদনে ব্যবহার করার পরামর্শ দেওয়া হয় না!"। প্রশ্ন "উত্পাদনে মেমোরিস্টোর ব্যবহার" সম্পর্কে।
— ড্যামিয়েন

ঠিক আছে, তবে কেবল "আপনি অন্যদের প্রক্রিয়া বা অন্যান্য পরিষেবার সাথে সেশনটি ভাগ করতে পারবেন না" because অর্থ, এর বাইরে আরও অনেক ব্যবহারিক সমাধান রয়েছে। তবে এটি মেমোরি ফাঁস ইস্যুটি সমাধান করে, সুতরাং যদি সেগুলি আপনার পক্ষে উদ্বেগ না করে তবে ব্যবহার করা ভাল এবং প্রশ্নের উদ্বেগের সমাধান করে।
— ডোভভ হেফেটজ

7

আমার মতে ওয়েবের aroundক্যমত্যটি হ'ল সঠিক উপায়টি হ'ল সেই জন্য অবশ্যই একটি ডিবি ব্যবহার করা হবে তবে আপনি যদি ইতিবাচক হন তবে আপনি এটি করতে চান না, তবে সতর্কতা দমন করুন - সতর্কতা আইন নয়।

তবে, যেহেতু আপনি এবং আমি উভয়ই একমত যে মেমরি ফাঁস একটি আসল সমস্যা, তাই রেডিসকে অতিরিক্ত ওষুধ বলা বাহুল্য বলা শক্ত, কারণ এটি আপনার সমস্যার সমাধান করবে।

আমিও বুঝতে পারছি না কেন মেমোরিস্টোরটি নোডে অন্তর্ভুক্ত করা হয়েছে যখন এটি সত্যিই ব্যবহার করা উচিত নয়

এটি একটি দুর্দান্ত পয়েন্ট - তবে আমি এটিই বলব যে নোড ইসলফ সম্প্রতি সম্প্রতি উত্পাদন প্রস্তুত হয়ে গেছে । কিছু লোক একেবারেই এমন ধারণার সাথে একমত হয় না।


2
সতর্কবার্তাটি দমন করা স্মৃতি ফাঁস হয়ে যাবে না।
— মিলান বাবুস্কভ

Lol এ কারণেই তারা এটি উত্পাদন করে আপনার বিরুদ্ধে পরামর্শ দেয়। সুতরাং বিকল্পটি স্টোরেজের বিকল্প পদ্ধতি ব্যবহার করা, তাই না?
— ক্রিস্টিয়ান

1
আমার ধারণা আমি এখন পর্যন্ত যে বিকল্পগুলি খুঁজে পেয়েছি তা পছন্দ করি না। আমি একটি সাধারণ ইন-মেমরি জাভাস্ক্রিপ্ট বিকল্প খুঁজছি, ডাটাবেস সিস্টেম নয়। কেন তারা এটি ঠিক করে না আমি সত্যিই বুঝতে পারি না। আমি বলতে চাইছি, একটি সাধারণ মেমোরি স্টোরটি কতটা শক্ত হতে পারে ... আমি কেবল আশা করছি যে কেউ ইতিমধ্যে এটি সম্পন্ন করেছে, তাই আমাকে চাকাটি পুনরায় উদ্ভাবন করতে হবে না।
— মিলান বাবুস্কভ 20

2
আমি আপনার ব্যথা অনুভব করছি, তবে নোড এখনই বেশ রক্তক্ষরণ প্রান্ত .. এটি অঞ্চলটি নিয়ে আসে
— ক্রিশ্চিয়ান

7
মেমোরিস্টোরটি নোডে অন্তর্ভুক্ত নয়, এটি এক্সপ্রেস / কানেক্টে অন্তর্ভুক্ত রয়েছে
— মোস্তফা

6

বিকল্পটি হ'ল রেডিস বা মঙ্গো স্টোর হিসাবে ব্যবহার করা। মঙ্গোর সাথে আপনি এক্সপ্রেস-সেশন-মঙ্গো মডিউলটি ব্যবহার করেন ।

ইনডেক্সিং বিকল্প সহ বাসি সেশনগুলি সরানোর জন্য একটি পরামর্শ রয়েছে:

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

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

যেহেতু বাসি সেশনগুলি ডেটাবেস নিজেই মুছে ফেলা হয়, তাই এক্সপ্রেস সেশনের নিজেই ক্লিনআপ পরিচালনা করার প্রয়োজন হয় না।

সম্পাদনা : দেখে মনে হচ্ছে আপনার নিজের "লাস্টঅ্যাক্সেস" ক্ষেত্র থাকা উচিত। আপনি যখন এটি অ্যাক্সেস করেন আপনি নিজেরাই সেই ক্ষেত্রটি আপডেট করেন। মঙ্গোডিবি ডকুমেন্টেশনের মেয়াদোত্তীর্ণ ডেটা http://docs.mongodb.org/manual/tutorial/expire-data/

সম্পাদনা 2 :

এখন হয়ে যায় db.sessions.createIndex( { "createdAt": 1 }, { expireAfterSeconds: 3600 } )

এই ক্ষেত্রটি পরীক্ষা করতে মঙ্গো ব্যাকগ্রাউন্ড থ্রেড প্রতি 60 সেকেন্ডে চলে। সুতরাং দস্তাবেজটি অপসারণের সময়টি সঠিক নয়।


2

যারা রেডিসের সমস্যায় পড়ছেন তাদের জন্য নিম্নলিখিতগুলি চেষ্টা করে দেখুন - আশা করি এটি সাহায্য করবে।

আমি ডিইডি এবং পিআরডি এর জন্য রেডিস ব্যবহার করছি এবং এক্সপ্রেস ভি 4 লক্ষ্যবস্তু করছি। উইন্ডোজে আমি লাইটওয়েট এমএসওপেনটেক রেডিস ভি 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 
}));

শুভকামনা!

পুনশ্চ. আমি কেবলমাত্র মূল ক্যোয়ারীটি পুনরায় পড়েছি এবং এটি লক্ষ্য করেছি - দুঃখিত!

কেবলমাত্র এই সাধারণ কাজের জন্য রেডিস, মঙ্গোডিবি বা অন্য একটি ডাটাবেস ইনস্টল করার জন্য এটি একটি ওভারকিল বলে মনে হচ্ছে।


0

আপনি যদি ওএসএক্স ব্যবহার করেন

brew install memcached

যদি লিনাক্স

apt install memcached

সেশন বার্তাটি সমাধান করুন, বোকোজ ডি অ্যাপ্লিকেশনটি 127.0.0.1 اصول1211 মেমক্যাস পরিষেবাটিতে সংযুক্ত হতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.