একাধিক থ্রেডযুক্ত নোড.জেজে সকেট.ইও যুক্ত করা হচ্ছে

আনস্প্ল্যাশ-এ বিদার নর্ডলি-ম্যাথিসেনের ছবি

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

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

সাধারণত, একক থ্রেডযুক্ত দৃষ্টান্তে এটি কোনও বড় উদ্বেগ হবে না। আমাদের জন্য এখন সবকিছু পরিবর্তন হচ্ছে।

দেখা যাক কেন।

তো সমস্যাটা কী?

আমাদের অ্যাপ্লিকেশনটি একটি সহজ অনলাইন চ্যাট যা চারটি থ্রেডে চলে। এইভাবে, একজন ব্যবহারকারী একই সাথে তার ফোন এবং কম্পিউটারে লগ ইন করতে পারে।

কল্পনা করুন যে আমরা সকেটগুলি ঠিকঠাক সেট আপ করেছি যেমন আমরা তাদের কোনও থ্রেডের জন্য সেট আপ করেছি। অন্য কথায়, আমাদের কাছে এখন একটি বৃহত, প্যাডেস্টাল গ্লোবাল স্টেট।

যখন ব্যবহারকারী তাদের কম্পিউটারে লগইন করে, ওয়েবসাইটটি আমাদের সার্ভারে একটি সকেট.আইওর সাথে সংযোগ খুলবে। সকেট # 3 থ্রেডের অবস্থায় সংরক্ষণ করা হয়।

কল্পনা করুন যে কোনও প্রাতঃরাশ নেওয়ার জন্য ব্যবহারকারী রান্নাঘরে হাঁটেন এবং তাদের ফোনটি তাদের সাথে নিয়ে যান - অবশ্যই তাদের বন্ধুদের অনলাইনে টেক্সট করে চালিয়ে যেতে।

ফোনটি থ্রেড 4 এর সাথে সংযুক্ত হয় এবং সকেট থ্রেডের স্থিতিতে সংরক্ষিত হয়।

তাদের ফোন থেকে কোনও বার্তা পাঠানো কোনও উপকারে আসে না। কেবল থ্রেড 3 এর লোকেরা বার্তাটি দেখতে পাবে। এটি কারণ যে থ্রেড # 3 এ সঞ্চিত সকেটগুলি যাদুকরীভাবে থ্রেড # 1, # 2 এবং # 4 এ সঞ্চয় করা হয় না।

এটা মজার বিষয় যে এমনকি রান্নাঘর থেকে ফিরে আসার পরেও ব্যবহারকারী তার কম্পিউটারে তার বার্তা দেখতে পান না।

অবশ্যই, যখন তারা ওয়েবসাইট আপডেট করে আমরা একটি জিইটি অনুরোধ প্রেরণ করতে পারি এবং শেষ 50 টি বার্তা পেতে পারি, তবে আমরা সত্যই এটি "গতিশীল" উপায় বলতে পারি না, আমরা কি পারি?

এটি কেন ঘটছে?

আমাদের সার্ভারকে একাধিক থ্রেডে ছড়িয়ে দেওয়া মানে একাধিক পৃথক সার্ভার রয়েছে। তারা অন্যের অস্তিত্ব সম্পর্কে কিছুই জানে না এবং অবশ্যই কোনও স্মৃতি ভাগ করে না। এর অর্থ হ'ল কোনও বস্তুর অপর এক নজরে অস্তিত্ব নেই।

থ্রেড 3 এ সঞ্চিত সকেটগুলি বর্তমানে ব্যবহারকারীর সকেটগুলি ব্যবহার করছে না। ব্যবহারকারীর বন্ধুরা যদি বিভিন্ন থ্রেডে থাকে তবে তারা ওয়েবসাইটটি রিফ্রেশ না করা পর্যন্ত তারা ব্যবহারকারীর বার্তা দেখতে পাবে না।

আদর্শভাবে, আমরা ব্যবহারকারীর জন্য একটি ইভেন্টের অন্যান্য উদাহরণগুলি অবহিত করতে চাই। এইভাবে আমরা নিশ্চিত হতে পারি যে প্রতিটি সংযুক্ত ডিভাইস সরাসরি আপডেট পাবে।

একটি সমাধান

আমরা রেডিসের প্রকাশ / সাবস্ক্রাইব মেসেজিং উপমা (পাবসব) ব্যবহার করে অন্যান্য থ্রেডকে অবহিত করতে পারি।

রেডিস একটি ওপেন সোর্স (বিএসডি লাইসেন্সযুক্ত) ইন মেমরি ডেটা স্ট্রাকচার স্টোর। এটি একটি ডাটাবেস, ক্যাশে এবং বার্তা ব্রোকার হিসাবে ব্যবহার করা যেতে পারে।

এর অর্থ হ'ল আমরা আমাদের উদাহরণগুলির মধ্যে ইভেন্টগুলি বিতরণের জন্য রেডিস ব্যবহার করতে পারি।

নোট করুন যে সাধারণত আমরা সম্ভবত আমাদের সম্পূর্ণ কাঠামো রেডিসে সংরক্ষণ করব। তবে, যেহেতু কাঠামোটি সিরিয়াল করা যায় না এবং স্মৃতিতে "জীবিত" রাখতে হয়, তাই আমরা প্রতিটি উদাহরণে এর কিছু অংশ সংরক্ষণ করব।

নদী

এখন আসুন যে পদক্ষেপগুলিতে আমরা একটি আগত ইভেন্ট পরিচালনা করি।

  1. ইভেন্ট নামের বার্তাটি আমাদের সকেটের একটিতে আসে - এইভাবে আমাদের প্রতিটি সম্ভাব্য ইভেন্টের জন্য অপেক্ষা করতে হবে না।
  2. এই ইভেন্টটির পরিচালকের পক্ষে যুক্তি হিসাবে যে বিষয়টিকে পাস করা হয়েছিল তাতে আমরা ইভেন্টটির নাম খুঁজে পাই। উদাহরণ: সেন্ডম্যাসেজ - .on ('বার্তা', ({ইভেন্ট}) => {})।
  3. যদি সেই নামের জন্য কোনও হ্যান্ডলার থাকে তবে আমরা এটি চালাব।
  4. হ্যান্ডলারটি প্রতিক্রিয়া সহ পাঠাতে পারে।
  5. প্রেরণটি আমাদের রেডিস পাবে প্রতিক্রিয়া ইভেন্টটি প্রেরণ করে। সেখান থেকে এটি আমাদের প্রতিটি নজরে প্রেরণ করা হয়।
  6. প্রতিটি সংযুক্ত ক্লায়েন্ট ইভেন্টটি গ্রহণ করে তা নিশ্চিত করার জন্য প্রতিটি উদাহরণ এটিকে তার সকেট স্টেটে প্রেরণ করে।

জটিল বলে মনে হচ্ছে, তবে এটি আমার সাথে রাখুন।

বাস্তবায়ন

পরিবেশ সহ সংগ্রহস্থলটি এখানে উপলভ্য যাতে আমাদের নিজেরাই সবকিছু ইনস্টল করতে এবং সেট আপ করতে না হয়।

প্রথমে আমরা এক্সপ্রেস দিয়ে একটি সার্ভার সেট আপ করি।

আমরা একটি এক্সপ্রেস অ্যাপ, একটি এইচটিটিপি সার্ভার এবং আর ডি সকেট তৈরি করব।

এখন আমরা সকেট যুক্ত করার উপর ফোকাস করতে পারি।

আমরা Socket.io এর সার্ভার উদাহরণটি আমাদের ফাংশনে পাস করি, যাতে আমরা মিডওয়্যারের সেট করি।

onAuth

অনআথ ফাংশন কেবল একটি বোগাস অনুমোদনের অনুকরণ করে। আমাদের ক্ষেত্রে এটি টোকেন ভিত্তিক।

ব্যক্তিগতভাবে, আমি সম্ভবত ভবিষ্যতে এটি JWT এর সাথে প্রতিস্থাপন করবো, তবে এটি কোনওভাবেই প্রয়োগ করা হয়নি।

এবার আসুন অন কানেকশন মিডলওয়্যারের দিকে।

অন ​​সংযোগ

এখানে আমরা দেখতে পাচ্ছি যে আমরা পূর্ববর্তী মিডওয়্যারটিতে ব্যবহারকারী আইডি সেট পেয়ে যাচ্ছি এবং এটি আমাদের সকেট স্টেটে সংরক্ষণ করছি, কীটি আইডি হ'ল এবং মানটি সকেটের একটি অ্যারে being

পরবর্তী আমরা সংবাদ ইভেন্টের জন্য অপেক্ষা করছি। আমাদের সম্পূর্ণ যুক্তি এটির উপর ভিত্তি করে - ফ্রন্টএন্ড আমাদের প্রেরিত প্রতিটি ইভেন্টকে একটি: বার্তা বলে।

ঘটনার নামটি আর্গুমেন্ট অবজেক্টের অভ্যন্তরে প্রেরণ করা হয় - যেমন উপরে বলা হয়েছে।

হ্যান্ডলার

যেমন আপনি অনকেনশনে দেখতে পাচ্ছেন, বিশেষত বার্তার ইভেন্টের শ্রোতাদের কাছে, আমরা ইভেন্টের নামের উপর ভিত্তি করে একটি হ্যান্ডলার খুঁজছি।

আমাদের হ্যান্ডলারটি কেবল এমন একটি অবজেক্ট যেখানে মূল ইভেন্টটির নাম এবং মানটি হ'ল ফাংশন। আমরা এটি ইভেন্টগুলি শুনতে এবং সে অনুযায়ী প্রতিক্রিয়া জানাতে ব্যবহার করব।

এছাড়াও, আমরা পরে প্রেরণের ক্রিয়াকলাপটি যুক্ত করব এবং ঘটনাটি ঘটনাগুলিতে পাঠাতে এটি ব্যবহার করব।

সকেটস্টেট

আমরা আমাদের রাজ্যের ইন্টারফেস জানি, কিন্তু আমাদের এখনও এটি প্রয়োগ করতে হবে।

আমরা সকেট যুক্ত এবং অপসারণের পাশাপাশি একটি ইভেন্ট পাঠানোর জন্য পদ্ধতি যুক্ত করি।

অ্যাড ফাংশনটি চেক করে যে স্ট্যাটাসটির এমন কোনও সম্পত্তি রয়েছে যা ব্যবহারকারীর আইডির সাথে সম্পর্কিত। যদি তা হয় তবে আমরা এটি আমাদের প্রাক-বিদ্যমান অ্যারেতে যুক্ত করব। অন্যথায়, আমরা প্রথমে একটি নতুন অ্যারে তৈরি করব।

অপসারণ ফাংশন এছাড়াও পরীক্ষা করে যে স্থিতিটি তার বৈশিষ্ট্যগুলিতে ব্যবহারকারীর আইডি অন্তর্ভুক্ত করে। না হলে কিছু যায় আসে না। অন্যথায় অ্যারে থেকে সকেট অপসারণ করতে অ্যারে ফিল্টার করা হয়। অ্যারেটি যদি খালি হয় তবে এটি স্থিতি থেকে সরানো হবে এবং সম্পত্তিটি অপরিজ্ঞাত করে দেওয়া হয়েছে।

রেডিসের পাব

আমরা আমাদের পাব তৈরি করতে প্যাকেজ নোড-রেডিস-পাবস্যাব ব্যবহার করি।

শিপিং যুক্ত করা হয়

ঠিক আছে, এখন আপনাকে যা করতে হবে তা হ'ল শিপিং ফাংশন যুক্ত করা ...

... এবং বহির্গামী_সকেট_মেসেজের জন্য একটি শ্রোতা যুক্ত করুন। এইভাবে, প্রতিটি উদাহরণ ইভেন্টটি গ্রহণ করে এবং এটি ব্যবহারকারীর সকেটে প্রেরণ করে।

সমস্ত কিছুই মাল্টিথ্রেড করুন

শেষ অবধি, আমাদের সার্ভারটি মাল্টিথ্রেড করার জন্য প্রয়োজনীয় কোডটি যুক্ত করা যাক।

দ্রষ্টব্য: আমাদের বন্দরটি শেষ করতে হবে কারণ Ctrl + C দিয়ে আমাদের নোডমোন প্রক্রিয়াটি বের করার পরে এটি কেবল সেখানে স্তব্ধ।

কিছুটা সংবেদনশীলতা সহ, আমাদের কাছে এখন সমস্ত দৃষ্টান্তের জন্য কার্যকরী সকেট রয়েছে। ফলাফল: অনেক বেশি দক্ষ সার্ভার।

পড়ার জন্য ধন্যবাদ!

আমি প্রথম নজরে অনুমান করি যে এটি একবারে সমস্ত কিছু রেকর্ড করা অপ্রতিরোধ্য এবং ক্লান্তিকর বলে মনে হচ্ছে। এই বিষয়টি মাথায় রেখে, আমি দৃ strongly়ভাবে আপনাকে পরামর্শ দিচ্ছি যে আপনি আবার সমস্ত কোডটি পড়ুন এবং এটি সম্পূর্ণরূপে দেখুন।

আপনার যদি কোনও প্রশ্ন বা মন্তব্য থাকে তবে বিনা দ্বিধায় সেগুলি মন্তব্য বিভাগে লিখুন বা আমাকে একটি বার্তা প্রেরণ করুন।

আমার সামাজিক মিডিয়া দেখুন!

আমার নিউজলেটার জন্য সাইন আপ করুন!

মূলতঃ www.mcieslar.com এ 10 সেপ্টেম্বর, 2018 এ প্রকাশিত।