পটভূমি
আমি 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
।