কোনও সিঙ্ক অভিনেতা, অ্যাকটিক্স_উইব :: ওয়েব :: ব্লক বা ফিউচার-সিপুপুল ব্যবহার করে ডিজেল চালানো উচিত?


10

পটভূমি

আমি r2d2 এর মাধ্যমে ডিজেল ব্যবহার করে একটি অ্যাকটিক্স-ওয়েব অ্যাপ্লিকেশন নিয়ে কাজ করছি এবং কীভাবে অ্যাসিঙ্ক্রোনাস অনুসন্ধানগুলি করা যায় তা সম্পর্কে নিশ্চিত নই। আমি তিনটি বিকল্প পেয়েছি যা যুক্তিযুক্ত বলে মনে হচ্ছে তবে আমি কোনটি সবচেয়ে ভাল তা সম্পর্কে নিশ্চিত নই।

সম্ভাব্য সমাধান

সিঙ্ক অভিনেতা

একটির জন্য আমি অ্যাকটিক্স উদাহরণটি ব্যবহার করতে পারি , তবে এটি বেশ জটিল এবং এটি তৈরি করতে বয়লারপ্লেটের একটি ন্যায্য চুক্তি প্রয়োজন। আমি আশা করি আরও একটি যুক্তিসঙ্গত সমাধান আছে।

Actix_web::web::block

অন্য বিকল্প হিসাবে আমি actix_web::web::blockআমার ক্যোয়ারী ফাংশনগুলিকে ভবিষ্যতে গুটিয়ে রাখতে ব্যবহার করতে পারি, তবে আমি এর পারফরম্যান্সের প্রভাব সম্পর্কে অনিশ্চিত।

কোয়েরিটি কি একই টোকিও সিস্টেমে চলছে? উত্সটিতে আমি যা খুঁজে পেতে পারি তা থেকে এটি অন্তর্নিহিত অ্যাকটিক্স-ওয়েব থ্রেডপুলে একটি থ্রেড তৈরি করে । এটা কি একটা সমস্যা?

আমি যদি কোডটি ডানদিকে পড়ে থাকি তবে কোনও সংযোগ অর্জনের সময় r2d2 এর থ্রেডটিকে ব্লক করে, যা মূল অ্যাকটিক্স-ওয়েব পুলের অংশটিকে অবরুদ্ধ করবে। ডাটাবেস প্রশ্নগুলির সাথে একই S এটি যদি তখন আমার পুলটিতে থ্রেড থাকে তার চেয়ে বেশি অনুসন্ধান করে তবে এটি সমস্ত অ্যাকটিক্স-ওয়েবকে ব্লক করে দেবে? যদি তাই হয় তবে বড় সমস্যা।

ফিউচার-cpupool

অবশেষে, কিছু অপ্রয়োজনীয় ওভারহেড থাকতে পারে এমন নিরাপদ বাজি হ'ল ফিউচারস-সিপুপুল । মূল সমস্যাটি হ'ল এর অর্থ হল আমার প্রকল্পে আরও একটি ক্রেট যুক্ত করা, যদিও আমি আমার অ্যাপ্লিকেশনটিতে অকারণে ভাসমান একাধিক সিপু-পুলের ধারণা পছন্দ করি না।

যেহেতু আর 2 ডি 2 এবং ডিজেল উভয়ই অবরুদ্ধ করবে এখানে এক বিস্ময়কর কৌশল রয়েছে।

সর্বাধিক গুরুত্বপূর্ণ, এই সিপুপুলটি একই r2d2 পুলটি ব্যবহার না করে এমন কিছু দিয়ে ভাগ করবেন না (যেমন তৈরি সমস্ত থ্রেড কেবল কোনও r2d2 সংযোগের জন্য অপেক্ষা করতে পারে, কাজ উপস্থিত থাকলে পুরো পুলটি লক করে দেয়)।

দ্বিতীয়ত (কিছুটা স্পষ্টতই), আপনার পুলটিতে থাকা থ্রেডের চেয়ে আর আর ডিডি 2 সংযোগ থাকা উচিত নয় কারণ বড়টি সম্পদ নষ্ট করে দেবে (সংযোগগুলি অব্যবহৃত / থ্রেড অবিরত অবরুদ্ধ করা হবে) (সম্ভবত আরও একটি থ্রেড, সম্ভবত দ্রুত সিপিপুল শিডিয়ুলারের চেয়ে ওএস সিডিউলারের মাধ্যমে সংযোগ হ্যান্ডওভার)।

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

পুরানো উত্তর

পুরানো সমাধানগুলি কার্যকর হতে পারে

https://www.reddit.com/r/rust/comments/axy0hp/patterns_to_scale_actixweb_and_diesel/

সংক্ষেপে, ফিউচারস- cpupool সুপারিশ করে।

ভবিষ্যতে -আরএস-এ ব্লকিং I / O কে এনক্যাপসুলেট করার সর্বোত্তম পন্থাটি কী?

সাধারণ ক্ষেত্রে ফিউচার-সিপুপুলের প্রস্তাব দেয়।

পুরানো সমাধান যা কাজ করে না

https://www.reddit.com/r/rust/comments/9fe1ye/noob_here_can_we_talk_about_async_and_databases/

পুরানো অ্যাকটিক্স-ওয়েব সংস্করণের জন্য সত্যিই দুর্দান্ত ফিক্স। আমি যা অনুরোধগুলি পাই তা থেকে সেগুলিতে আর সিপিইউ পুল নেই।


এই ইস্যুতে দেওয়া মন্তব্যগুলি থেকে দেখে মনে হচ্ছে ডিজেল সমর্থন না করার futures-cpupoolজন্য এটি প্রস্তাবিত কাজ async
জেএমবি

এটি একটি সাধারণ সমাধান বেশি। আমি এমন কিছু প্রত্যাশা করছি যা অ্যাকটিক্স সিস্টেমটি লাভ করবে। এর চেয়ে কম কিছু নয়, আমি সমস্যাগুলি সন্ধানের জন্য এখন ফিউচার-সিপুপুল খনন করব।
লগিনা

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

যেহেতু সিপুপুলটি r2d2- তে ব্লকিং সংযোগ পুলের সাথেও ইন্টারঅ্যাক্ট করে আমি কীভাবে এটি সমাধান করতে পারি সে সম্পর্কে আমি অনিশ্চিত। আমি এখন এটি নিজেই খোঁজ করছি এবং শিগগিরই এটি আপডেট করব।
লগিনা

উত্তর:


3

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

অ্যাকটিক্স_উইব :: ওয়েব :: ব্লকটি ব্যবহার করা যথেষ্ট শালীন, তবে অ্যাকটিক্সে একটি ভাগ করে নেওয়া থ্রেড-পুল ব্যবহার করবে (এবং এটি ব্যবহার করা ব্লক করার কারণে আমি পুরো থ্রেড পুলটি ব্লক করতে পারি এবং অ্যাকটিক্স_উইবকে দেওয়া অন্যান্য কার্যে হস্তক্ষেপ করতে পারি)।

কেবল ডাটাবেস ইন্টারঅ্যাকশনের জন্য ডাটাবেস প্রতি পৃথক থ্রেডপুল তৈরি করতে ফিউচার-সিপুপুল ব্যবহার করা ভাল। এইভাবে আপনি যে সমস্ত কাজ একে অপরের জন্য অপেক্ষা করতে হবে (যখন সংযোগের চেয়ে আরও বেশি কাজ রয়েছে) একটি পুলের মধ্যে গোষ্ঠীভুক্ত করুন, সংযোগের প্রয়োজন নেই এমন অন্য কোনও কাজকে ব্লক করা থেকে বিরত রাখবেন এবং থ্রেডের সংখ্যাটি সম্ভাব্যভাবে সীমিত করুন সংযোগের সংখ্যা (যাতে কাজটি কেবল তখনই নির্ধারিত হবে যখন এটি অবরুদ্ধ হবে না)।

আপনি কেবলমাত্র একটি ডাটাবেস সংযোগ ব্যবহার করতে চান এমন ক্ষেত্রে (বা খুব কম) সিঙ্ক অভিনেতা একটি দুর্দান্ত বিকল্প good এটি একটি থ্রেড সহ ফিউচার-সিপুপুলের মতো কাজ করবে, এটি নিশ্চিত করে যে সমস্ত কাজ এক সাথে একবারে চালিত হয়, ব্যতীত এটি পৃথক একের পরিবর্তে অ্যাকটিক্স-ওয়েবের অন্তর্নিহিত থ্রেডগুলির একটি ব্যবহার করবে (অতএব, খুব কম সংযোগের জন্য কেবল এটিই ভাল) । যদিও আমি বয়লারপ্লেটটি মূল্যবান হওয়ার পক্ষে অনেক বড় পাই।


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