এই পৃষ্ঠাটি মাল্টিপ্লেক্স কর্মীদের বর্ণনা করে, মাল্টিপ্লেক্স-সামঞ্জস্যপূর্ণ নিয়মগুলি কীভাবে লিখতে হয় এবং নির্দিষ্ট সীমাবদ্ধতার জন্য কাজগুলি বর্ণনা করে৷
মাল্টিপ্লেক্স কর্মীরা ব্যাজেলকে একক কর্মী প্রক্রিয়ার সাথে একাধিক অনুরোধ পরিচালনা করার অনুমতি দেয়। মাল্টি-থ্রেডেড কর্মীদের জন্য, Bazel একই, বা আরও ভাল কর্মক্ষমতা অর্জনের জন্য কম সংস্থান ব্যবহার করতে পারে। উদাহরণস্বরূপ, প্রতি কর্মী প্রতি একজন কর্মী প্রক্রিয়া থাকার পরিবর্তে, Bazel একই কর্মী প্রক্রিয়ার সাথে কথা বলতে চারজন মাল্টিপ্লেক্সড কর্মী থাকতে পারে, যা সমান্তরালভাবে অনুরোধগুলি পরিচালনা করতে পারে। জাভা এবং স্কালার মতো ভাষার জন্য, এটি JVM ওয়ার্ম-আপ সময় এবং JIT সংকলন সময় বাঁচায় এবং সাধারণভাবে এটি একই ধরণের সমস্ত কর্মীদের মধ্যে একটি ভাগ করা ক্যাশে ব্যবহার করার অনুমতি দেয়।
ওভারভিউ
বেজেল সার্ভার এবং কর্মী প্রক্রিয়ার মধ্যে দুটি স্তর রয়েছে। সমান্তরালভাবে প্রক্রিয়া চালাতে পারে এমন কিছু স্মৃতিবিদ্যার জন্য, Bazel কর্মী পুল থেকে একটি WorkerProxy
পায়। WorkerProxy
একটি request_id
সহ ক্রমানুসারে কর্মী প্রক্রিয়ার কাছে অনুরোধ পাঠায়, কর্মী প্রক্রিয়া অনুরোধটি প্রক্রিয়া করে এবং WorkerMultiplexer
এর কাছে প্রতিক্রিয়া পাঠায়। যখন WorkerMultiplexer
একটি প্রতিক্রিয়া পায়, তখন এটি request_id
পার্স করে এবং তারপরে উত্তরগুলিকে সঠিক WorkerProxy
এ ফেরত পাঠায়। নন-মাল্টিপ্লেক্সড কর্মীদের মতো, সমস্ত যোগাযোগ স্ট্যান্ডার্ড ইন/আউটের মাধ্যমে সম্পন্ন করা হয়, তবে টুলটি কেবল ব্যবহারকারী-দৃশ্যমান আউটপুটের জন্য stderr
ব্যবহার করতে পারে না ( নীচে দেখুন )।
প্রতিটি শ্রমিকের একটি চাবি আছে। কোন WorkerMultiplexer ব্যবহার করতে হবে তা নির্ধারণ করতে Bazel কী-এর হ্যাশ কোড (পরিবেশ ভেরিয়েবল, এক্সিকিউশন রুট এবং WorkerMultiplexer
সমন্বয়ে গঠিত) ব্যবহার করে। WorkerProxy
একই WorkerMultiplexer
এর সাথে যোগাযোগ করে যদি তাদের একই হ্যাশ কোড থাকে। তাই, অনুমান করে পরিবেশের ভেরিয়েবল এবং এক্সিকিউশন রুট একটি একক ব্যাজেল আমন্ত্রণে একই, প্রতিটি অনন্য WorkerMultiplexer
শুধুমাত্র একজন ওয়ার্কার মাল্টিপ্লেক্সার এবং একজন কর্মী প্রক্রিয়া থাকতে পারে। নিয়মিত কর্মী এবং WorkerProxy
সহ মোট কর্মীদের সংখ্যা এখনও --worker_max_instances
দ্বারা সীমিত।
মাল্টিপ্লেক্স-সামঞ্জস্যপূর্ণ নিয়ম লেখা
মাল্টিপ্লেক্স কর্মীদের সুবিধা নিতে নিয়মের কর্মী প্রক্রিয়াটি বহু-থ্রেডেড হওয়া উচিত। প্রোটোবাফ একটি নিয়ম সেটকে একটি একক অনুরোধ পার্স করার অনুমতি দেয় যদিও স্ট্রীমে একাধিক অনুরোধ জমা হতে পারে। যখনই কর্মী প্রক্রিয়া স্ট্রীম থেকে একটি অনুরোধ পার্স করে, এটি একটি নতুন থ্রেডে অনুরোধটি পরিচালনা করা উচিত। যেহেতু বিভিন্ন থ্রেড একই সময়ে স্ট্রীমে সম্পূর্ণ এবং লিখতে পারে, তাই কর্মী প্রক্রিয়াটিকে নিশ্চিত করতে হবে যে প্রতিক্রিয়াগুলি পরমাণুভাবে লেখা হয়েছে (বার্তাগুলি ওভারল্যাপ হয় না)। প্রতিক্রিয়াগুলিতে তারা যে request_id
পরিচালনা করছে তার অনুরোধের_আইডি থাকতে হবে।
মাল্টিপ্লেক্স আউটপুট হ্যান্ডলিং
মাল্টিপ্লেক্স কর্মীদের সিঙ্গেলপ্লেক্স কর্মীদের তুলনায় তাদের আউটপুট পরিচালনার বিষয়ে আরও সতর্ক হওয়া দরকার। stderr
এ পাঠানো যেকোনো কিছু একই ধরনের সকল WorkerProxy
এর মধ্যে ভাগ করা একটি একক লগ ফাইলে যাবে, যা একযোগে অনুরোধের মধ্যে এলোমেলোভাবে আন্তঃসৃত। stderr
এ stdout
পুনঃনির্দেশিত করা একটি ভাল ধারণা, WorkResponse
এর output
ক্ষেত্রে সেই আউটপুটটি সংগ্রহ করবেন না, কারণ এটি ব্যবহারকারীকে আউটপুটের টুকরো টুকরো দেখাতে পারে। যদি আপনার টুল শুধুমাত্র stdout
বা stderr
এ ব্যবহারকারী-ভিত্তিক আউটপুট পাঠায়, আপনি মাল্টিপ্লেক্স কর্মীদের সক্ষম করার আগে আপনাকে সেই আচরণটি পরিবর্তন করতে হবে।
মাল্টিপ্লেক্স কর্মীদের সক্রিয় করা
মাল্টিপ্লেক্স কর্মীরা ডিফল্টরূপে সক্ষম হয় না। একটি রুলসেট একটি অ্যাকশনের execution_requirements
এ supports-multiplex-workers
ট্যাগ ব্যবহার করে মাল্টিপ্লেক্স কর্মীদের চালু করতে পারে (যেমন supports-workers
ট্যাগ নিয়মিত কর্মীদের সক্ষম করে)। যেমনটি হয় নিয়মিত কর্মীদের ব্যবহার করার সময়, একটি কর্মী কৌশল নির্দিষ্ট করা প্রয়োজন, হয় রুলসেট স্তরে (উদাহরণস্বরূপ, --strategy=[some_mnemonic]=worker
) অথবা সাধারণত কৌশল স্তরে (উদাহরণস্বরূপ, --dynamic_local_strategy=worker,standalone
.) কোন অতিরিক্ত পতাকা প্রয়োজন নেই, এবং supports-multiplex-workers
supports-workers
উপর অগ্রাধিকার নেয়, যদি উভয় সেট করা হয়। আপনি --noexperimental_worker_multiplex
পাস করে বিশ্বব্যাপী মাল্টিপ্লেক্স কর্মীদের বন্ধ করতে পারেন।
মেমরির চাপ কমাতে এবং কর্মক্ষমতা উন্নত করতে, সম্ভব হলে মাল্টিপ্লেক্স কর্মীদের ব্যবহার করার জন্য একটি নিয়ম সেটকে উৎসাহিত করা হয়। যাইহোক, মাল্টিপ্লেক্স কর্মীরা বর্তমানে গতিশীল সম্পাদনের সাথে সামঞ্জস্যপূর্ণ নয় যদি না তারা মাল্টিপ্লেক্স স্যান্ডবক্সিং বাস্তবায়ন করে। নন-স্যান্ডবক্সড মাল্টিপ্লেক্স কর্মীদের গতিশীল সম্পাদনের সাথে চালানোর প্রচেষ্টা নীরবে পরিবর্তে স্যান্ডবক্সযুক্ত সিঙ্গেলপ্লেক্স কর্মীদের ব্যবহার করবে।
মাল্টিপ্লেক্স স্যান্ডবক্সিং
মাল্টিপ্লেক্স কর্মীদের কর্মী বাস্তবায়নে এর জন্য স্পষ্ট সমর্থন যোগ করে স্যান্ডবক্স করা যেতে পারে। সিঙ্গেলপ্লেক্স কর্মী স্যান্ডবক্সিং প্রতিটি কর্মী প্রক্রিয়াকে তার নিজস্ব স্যান্ডবক্সে চালানোর মাধ্যমে করা যেতে পারে, মাল্টিপ্লেক্স কর্মীরা একাধিক সমান্তরাল অনুরোধের মধ্যে প্রক্রিয়া কাজের ডিরেক্টরি ভাগ করে নেয়। মাল্টিপ্লেক্স কর্মীদের স্যান্ডবক্সিংয়ের অনুমতি দেওয়ার জন্য, কর্মীকে তার কার্যকারী ডিরেক্টরির পরিবর্তে সরাসরি প্রতিটি অনুরোধে নির্দিষ্ট একটি সাবডিরেক্টরি থেকে পড়া এবং লেখার সমর্থন করতে হবে।
মাল্টিপ্লেক্স স্যান্ডবক্সিং সমর্থন করার জন্য, কর্মীকে অবশ্যই sandbox_dir
থেকে স্যান্ডবক্স_ডির ক্ষেত্রটি ব্যবহার করতে হবে এবং WorkRequest
সমস্ত ফাইল পড়ার এবং লেখার জন্য একটি উপসর্গ হিসাবে ব্যবহার করতে হবে। যদিও arguments
এবং inputs
ক্ষেত্রগুলি একটি আনস্যান্ডবক্সড অনুরোধ থেকে অপরিবর্তিত থাকে, প্রকৃত ইনপুটগুলি sandbox_dir
-এর সাথে সম্পর্কিত। কর্মীকে এই পরিবর্তিত পাথ থেকে পড়ার জন্য arguments
এবং inputs
পাওয়া ফাইল পাথগুলিকে অনুবাদ করতে হবে এবং স্যান্ডবক্স_ডির-এর সাথে সম্পর্কিত সমস্ত sandbox_dir
লিখতে হবে। এর মধ্যে '.' এর মতো পাথ, সেইসাথে আর্গুমেন্টে (যেমন "আর্গফাইল" আর্গুমেন্ট) নির্দিষ্ট করা ফাইলে পাওয়া পাথ অন্তর্ভুক্ত রয়েছে।
একবার একজন কর্মী মাল্টিপ্লেক্স স্যান্ডবক্সিং সমর্থন করলে, রুলসেট একটি অ্যাকশনের execution_requirements
এ supports-multiplex-sandboxing
যোগ করে এই সমর্থন ঘোষণা করতে পারে। Bazel তারপর মাল্টিপ্লেক্স স্যান্ডবক্সিং ব্যবহার করবে যদি --experimental_worker_multiplex_sandboxing
পতাকা পাস করা হয়, অথবা যদি কর্মীকে গতিশীল সম্পাদনের সাথে ব্যবহার করা হয়।
স্যান্ডবক্সযুক্ত মাল্টিপ্লেক্স কর্মীর কর্মী ফাইলগুলি এখনও কর্মী প্রক্রিয়ার কার্যকারী ডিরেক্টরির সাথে সম্পর্কিত। এইভাবে, যদি একটি ফাইল কর্মী চালানোর জন্য এবং একটি ইনপুট হিসাবে উভয়ই ব্যবহার করা হয়, তবে এটি ফ্ল্যাগফাইল আর্গুমেন্টের পাশাপাশি tools
, executable
বা runfiles
উভয় ক্ষেত্রেই একটি ইনপুট হিসাবে উল্লেখ করা উচিত।