উদ্বোধন চিন্তা
আপনি কীভাবে এই সিদ্ধান্তে পৌঁছলেন যে সিস্টেমের কিছু অংশ অন্য ভাষায় আরও ভাল ভাড়া পাবে? আপনি কর্মক্ষমতা সমস্যা ভোগ করছেন? এই সমস্যাগুলি কতটা গুরুতর? এটি যদি দ্রুততর হতে পারে তবে এটি কি দ্রুততর হওয়া জরুরী?
একক থ্রেড অ্যাসিনক্রোনি
একাধিক প্রশ্ন এবং অন্যান্য ওয়েব সংস্থান রয়েছে যা একক থ্রেড অ্যাসিনক্রোনি বনাম বহু-থ্রেড সম্মতি সম্পর্কিত পার্থক্য, উপকারিতা এবং কনস এর সাথে ইতিমধ্যে কাজ করে। I / O হ'ল প্রধান বাধা হ'ল নোড.জেএস-এর সিঙ্গল-থ্রেড অ্যাসিঙ্ক্রোনাস মডেল কীভাবে সম্পাদন করে সে সম্পর্কে পড়তে আগ্রহী এবং এটি অনেকগুলি অনুরোধ একই সাথে পরিবেশন করা হচ্ছে।
মোচড়, টর্নেডো এবং অন্যান্য অ্যাসিনক্রোনাস মডেলগুলি একক থ্রেডের দুর্দান্ত ব্যবহার করে। যেহেতু প্রচুর ওয়েব প্রোগ্রামিংয়ে প্রচুর আই / ও (নেটওয়ার্ক, ডাটাবেস ইত্যাদি) রয়েছে তাই দূরবর্তী কলগুলির জন্য অপেক্ষা করতে ব্যয় করা সময়টি উল্লেখযোগ্যভাবে যুক্ত হয় adds এটি এমন সময় যা অন্যান্য কাজগুলিতে ব্যয় হতে পারে - যেমন অন্য ডাটাবেস কলগুলি লাথি মেরে ফেলা, পৃষ্ঠাগুলি উপস্থাপন করা এবং ডেটা উত্পন্ন করা। সেই একক থ্রেডের ব্যবহার অত্যন্ত উচ্চ।
একক থ্রেড অ্যাসিনক্রোনির সর্বাধিক সুবিধা হ'ল এটি মেমরির অনেক কম ব্যবহার করে । মাল্টি-থ্রেড এক্সিকিউশনে প্রতিটি থ্রেডের জন্য নির্দিষ্ট পরিমাণে সংরক্ষিত মেমরি দরকার। থ্রেডের সংখ্যা বাড়ার সাথে সাথে কেবল থ্রেডগুলির অস্তিত্ব থাকতে পারে তার পরিমাণের পরিমাণও। যেহেতু স্মৃতি সীমাবদ্ধ তাই এর অর্থ যে কোনও এক সময় তৈরি করা যায় এমন থ্রেডের সংখ্যার সীমা রয়েছে।
উদাহরণ
ওয়েব সার্ভারের ক্ষেত্রে ভান করে প্রতিটি অনুরোধকে তার নিজস্ব থ্রেড দেওয়া হয়। বলুন প্রতিটি থ্রেডের জন্য 1MB মেমরির প্রয়োজন, এবং ওয়েব সার্ভারে 2 গিগাবাইট র্যাম রয়েছে। আর কোনও প্রক্রিয়া করার পর্যাপ্ত মেমরির আগে এই ওয়েব সার্ভারটি যে কোনও সময়ে (প্রায়) 2000 টি অনুরোধের প্রক্রিয়া করতে সক্ষম হবে।
যদি আপনার বোঝা এর তুলনায় উল্লেখযোগ্য পরিমাণে বেশি থাকে, অনুরোধগুলি খুব দীর্ঘ সময় নিতে চলেছে (পুরানো অনুরোধগুলি শেষ হওয়ার অপেক্ষায়), বা আপনাকে সমবর্তী অনুরোধগুলির সংখ্যা বাড়ানোর জন্য আরও ক্লাবটিতে আরও সার্ভার নিক্ষেপ করতে হবে ।
মাল্টি-থ্রেড কনকুরিঞ্জি
মাল্টি-থ্রেড সম্মতি পরিবর্তে একই সময়ে বেশ কয়েকটি কার্য সম্পাদন করার উপর নির্ভর করে। এর অর্থ হ'ল যদি কোনও থ্রেড যদি ফেরার জন্য ডাটাবেস কলের অপেক্ষায় অবরুদ্ধ থাকে তবে অন্যান্য অনুরোধগুলি একই সময়ে প্রক্রিয়া করা যায়। থ্রেডের ব্যবহার কম, তবে চালানো থ্রেডের সংখ্যা অনেক বেশি।
মাল্টি-থ্রেড কোড সম্পর্কে বিতর্ক করা খুব শক্ত। লকিং, সিঙ্ক্রোনাইজেশন এবং অন্যান্য মজাদার একযোগে সমস্যা রয়েছে। একক থ্রেড অ্যাসিনক্রোনি একই সমস্যায় ভুগছে না।
তবে সিপিইউ নিবিড় কাজের জন্য মাল্টি-থ্রেড কোড অনেক বেশি পারফরম্যান্ট । কোনও থ্রেডের "ফলন" করার সুযোগ না থাকলে-যেমন একটি নেটওয়ার্ক কল যেমন সাধারণত ব্লক হয়ে যায় - একটি একক থ্রেড মডেলটির কোনও সামঞ্জস্য নেই।
উভয় সহাবস্থান করতে পারেন
দুজনের মধ্যে অবশ্যই ওভারল্যাপ রয়েছে; তারা পারস্পরিক একচেটিয়া নয়. উদাহরণস্বরূপ, প্রতিটি থ্রেডকে আরও ভালভাবে ব্যবহার করার জন্য মাল্টি-থ্রেড কোডটি অ-ব্লকিং পদ্ধতিতে লেখা যেতে পারে।
তলদেশের সরুরেখা
বিবেচনা করার মতো আরও অনেক বিষয় রয়েছে তবে আমি দুটি সম্পর্কে এইভাবে ভাবতে চাই:
- আপনার প্রোগ্রামটি যদি I / O সীমাবদ্ধ থাকে তবে একক থ্রেড অ্যাসিনক্রোনাই সম্ভবত বেশ ভালভাবে কাজ করবে।
- যদি আপনার প্রোগ্রামটি সিপিইউ বাউন্ড হয় তবে একটি মাল্টি-থ্রেড সিস্টেম সম্ভবত সেরা হবে।
আপনার বিশেষ ক্ষেত্রে, আপনাকে নির্ধারণ করতে হবে যে কী ধরণের অ্যাসিনক্রোনাস কাজ সমাপ্ত হচ্ছে এবং কতক্ষণ এই কাজগুলি দেখা দেয়।
- তারা প্রতিটি অনুরোধে ঘটে? যদি তাই হয়, অনুরোধের সংখ্যা বাড়ার সাথে সাথে স্মৃতি সম্ভবত একটি সমস্যা হয়ে উঠবে।
- এই কাজগুলি আদেশ করা হয়? যদি তা হয় তবে একাধিক থ্রেড ব্যবহার করে আপনাকে সিঙ্ক্রোনাইজেশন বিবেচনা করতে হবে।
- এই কাজগুলি কি সিপিইউ নিবিড়? যদি তা হয় তবে একটি একক থ্রেড কি বোঝাটি ধরে রাখতে সক্ষম?
এর কোন সহজ উত্তর নেই। আপনার ব্যবহারের ক্ষেত্রে কী কী তা আপনাকে অবশ্যই বিবেচনা করতে হবে এবং সেই অনুযায়ী নকশা করতে হবে। কখনও কখনও একটি অ্যাসিনক্রোনাস একক থ্রেড মডেল আরও ভাল। অন্যান্য সময়, প্রচুর পরিমাণে সমান্তরাল প্রক্রিয়াকরণ অর্জনের জন্য কয়েকটি থ্রেড ব্যবহার করা প্রয়োজন।
অন্যান্য বিবেচ্য বিষয়
আপনার চয়ন করা সাদৃশ্য মডেল না করে আপনার অন্যান্য বিষয়গুলিও বিবেচনা করতে হবে। আপনি কি এরলং না ক্লোজার জানেন? আপনি কি মনে করেন যে আপনি এই অ্যাপ্লিকেশনটির কার্যকারিতা উন্নত করার জন্য আপনি যে কোনও একটি ভাষাতে নিরাপদ মাল্টি-থ্রেড কোড লিখতে সক্ষম হবেন? এর মধ্যে যে কোনও একটি ভাষাতে গতি পেতে খুব বেশি সময় লাগছে, এবং আপনি যে ভাষা শিখেন তা ভবিষ্যতে কী উপকারে আসবে?
এই দুটি সিস্টেমের মধ্যে যোগাযোগের সাথে জড়িত সমস্যাগুলি সম্পর্কে কীভাবে? এটি কি সমান্তরালভাবে দুটি পৃথক ব্যবস্থা বজায় রাখা জটিল হবে? কীভাবে এরং সিস্টেম জাজানো থেকে কাজগুলি গ্রহণ করবে? এরং কীভাবে এই ফলাফলগুলিকে আবার জ্যাঙ্গোতে যোগাযোগ করবে? পারফরম্যান্স কি যথেষ্ট সমস্যা যে যুক্ত জটিলতা এটি উপযুক্ত?
সর্বশেষ ভাবনা
আমি সবসময় জ্যাঙ্গোকে দ্রুত পর্যাপ্তরূপে খুঁজে পেয়েছি এবং এটি বেশ কয়েকটি ভারী পাচার হওয়া সাইট ব্যবহার করে। সাম্প্রতিক অনুরোধ এবং প্রতিক্রিয়া সময়ের সংখ্যা বাড়াতে আপনি বেশ কয়েকটি পারফরম্যান্স অপটিমাইজেশন করতে পারেন। স্বীকারোক্তিজনকভাবে, আমি এখনও এ পর্যন্ত সেলারিটির সাথে কিছু করি নি, তাই স্বাভাবিক পারফরম্যান্স অপটিমাইজেশনগুলি সম্ভবত আপনার এই অ্যাসিনক্রোনাস টাস্কগুলির সাথে যে কোনও সমস্যার সমাধান হতে পারে না।
অবশ্যই, সমস্যাটিতে আরও হার্ডওয়্যার নিক্ষেপ করার পরামর্শ সর্বদা রয়েছে। সম্পূর্ণ নতুন সাবসিস্টেমের বিকাশ ও রক্ষণাবেক্ষণ ব্যয়ের চেয়ে নতুন সার্ভার সরবরাহের ব্যয় কি কম?
আমি এই সময়ে অনেক বেশি প্রশ্ন জিজ্ঞাসা করেছি, কিন্তু এটি আমার উদ্দেশ্য ছিল। উত্তর বিশ্লেষণ এবং আরও বিশদ ছাড়াই সহজ হতে পারে না। সমস্যাগুলি বিশ্লেষণ করতে সক্ষম হওয়াগুলি জিজ্ঞাসা করা প্রশ্নগুলি জেনে নেমে আসে, যদিও ... তাই আশা করি আমি এই ফ্রন্টটিতে সহায়তা করেছি।
আমার অন্ত্র অনুভূতি বলে যে অন্য ভাষায় পুনর্লিখন অপ্রয়োজনীয়। জটিলতা এবং ব্যয় সম্ভবত খুব দুর্দান্ত হবে।
সম্পাদন করা
ফলো-আপ সাড়া
আপনার ফলোআপ কিছু আকর্ষণীয় ব্যবহারের কেস উপস্থাপন করে।
1. জ্যাঙ্গো এইচটিটিপি অনুরোধের বাইরে কাজ করছে
আপনার প্রথম উদাহরণে এনএফসি ট্যাগগুলি পড়া এবং তারপরে ডাটাবেসটি অনুসন্ধান করা জড়িত। আমি মনে করি না যে অন্য ভাষায় এই অংশটি লেখা আপনার পক্ষে কার্যকর হবে কারণ কেবল ডাটাবেস বা একটি এলডিএপি সার্ভারের অনুসন্ধান করা নেটওয়ার্ক I / O দ্বারা আবদ্ধ হতে চলেছে (এবং সম্ভাব্য ডাটাবেস পারফরম্যান্স)। অন্যদিকে, একযোগে অনুরোধের সংখ্যাটি সার্ভারের দ্বারা আবদ্ধ হবে, যেহেতু প্রতিটি পরিচালনার কমান্ড তার নিজস্ব প্রক্রিয়া হিসাবে চালিত হবে। সেটআপ এবং টিয়ারডাউন সময় থাকবে যা পারফরম্যান্সকে প্রভাবিত করে, যেহেতু আপনি ইতিমধ্যে চলমান প্রক্রিয়াটিতে বার্তা প্রেরণ করছেন না। তবে আপনি একই সময়ে একাধিক অনুরোধ প্রেরণ করতে সক্ষম হবেন, যেহেতু প্রতিটি বিচ্ছিন্ন প্রক্রিয়া হবে।
এই ক্ষেত্রে, আমি দুটি তদন্ত দেখতে পাচ্ছি যা আপনি তদন্ত করতে পারেন:
- আপনার ডাটাবেসটি সংযোগ পুলিংয়ের সাথে একসাথে একাধিক প্রশ্ন পরিচালনা করতে সক্ষম কিনা তা নিশ্চিত করুন। (উদাহরণস্বরূপ, ওরাকল, আপনার সেই অনুযায়ী জ্যাঙ্গো কনফিগার করা প্রয়োজন
'OPTIONS': {'threaded':True}
)) ডাটাবেস স্তর বা জ্যাঙ্গো স্তরে অনুরূপ কনফিগারেশন অপশন থাকতে পারে যা আপনি নিজের ডেটাবেসের জন্য টুইঙ্ক করতে পারেন। আপনি যে ভাষায় আপনার ডাটাবেস প্রশ্নগুলি লিখেছেন তা বিবেচনাধীন, আপনি এলইডি আলোকিত করার আগে আপনাকে এই ডেটা ফিরে আসার জন্য অপেক্ষা করতে হবে। কোয়েরিং কোডটির পারফরম্যান্স যদিও কিছুটা পার্থক্য করতে পারে এবং জ্যাঙ্গো ওআরএম দ্রুত বজ্রপাত হয় না ( তবে , সাধারণত যথেষ্ট দ্রুত)।
- সেটআপ / টিয়ারডাউন সময়টি ন্যূনতম করুন। অবিচ্ছিন্নভাবে চলমান প্রক্রিয়া করুন এবং এতে বার্তা প্রেরণ করুন। (আমি ভুল হলে আমাকে সংশোধন করুন, তবে এটিই আপনার মূল প্রশ্নটি ফোকাস করছে)) পাইথন / জাঙ্গোতে এই প্রক্রিয়াটি লেখা আছে বা অন্য কোনও ভাষা / কাঠামো উপরে লেখা হয়েছে কিনা। আমি এত ঘন ঘন ম্যানেজমেন্ট কমান্ড ব্যবহার করার ধারণা পছন্দ করি না। কোডের একটি ছোট টুকরোটি অবিচ্ছিন্নভাবে চালানো কি সম্ভব, যা এনএফসি পাঠকদের বার্তাগুলির কাতারে পাঠানো বার্তা দেয়, যা সেলারি পরে জাজানোতে পড়ে এবং ফরোয়ার্ড করে? একটি ছোট প্রোগ্রামের সেটআপ এবং টিয়ারডাউন, যদিও এটি পাইথনে লেখা আছে (তবে জ্যাঙ্গো নয়!), জ্যাঙ্গো প্রোগ্রাম শুরু করার এবং বন্ধ করার চেয়ে ভাল হওয়া উচিত (এর সমস্ত সাবসিস্টেম সহ)।
আমি নিশ্চিত না যে আপনি জ্যাঙ্গোর জন্য কোন ওয়েব সার্ভার ব্যবহার করছেন। mod_wsgi
অ্যাপাচি আপনাকে পরিষেবার অনুরোধ করে এমন প্রক্রিয়াগুলির মধ্যে প্রসেস এবং থ্রেডের সংখ্যা কনফিগার করতে দেয়। পরিষেবার উপযুক্ত অনুরোধের সংখ্যাটি অনুকূল করতে আপনার ওয়েব সার্ভারের প্রাসঙ্গিক কনফিগারেশনটি টুইঙ্ক করতে ভুলবেন না।
২. জ্যাঙ্গো সিগন্যালের সাথে "বার্তা পাঠানো"
আপনার দ্বিতীয় ব্যবহারের ক্ষেত্রেটিও মোটামুটি আকর্ষণীয়; আমি এর উত্তর আমার কাছে আছে কিনা তা নিশ্চিত নই। আপনি যদি মডেল উদাহরণগুলি মুছতে থাকেন এবং সেগুলি পরে চালনা করতে চান JSON.dumps
তবে সেগুলি সিরিয়ালাইজ করা এবং তারপরে deserialize করা সম্ভব হতে পারে JSON.loads
। পরবর্তীতে অবজেক্ট গ্রাফটি পুরোপুরি পুনরায় তৈরি করা অসম্ভব হয়ে উঠবে (সম্পর্কিত মডেলগুলি অনুসন্ধান করা), কারণ সম্পর্কিত ক্ষেত্রগুলি ডাটাবেস থেকে অলসভাবে লোড করা হয়, এবং সেই লিঙ্কটি আর উপস্থিত থাকবে না।
অন্য বিকল্পটি হ'ল কোনওভাবে মুছে ফেলার জন্য কোনও চিহ্ন চিহ্নিত করা এবং কেবল অনুরোধ / প্রতিক্রিয়া চক্রের শেষে এটি মুছুন (সমস্ত সংকেত পরিবেশন করার পরে)। এটি নির্ভর করার পরিবর্তে এটি প্রয়োগ করতে কাস্টম সংকেতের প্রয়োজন হতে পারে post_delete
।