আপনি কীভাবে ত্রুটির পরিস্থিতি পুনরুত্পাদন করবেন এবং অ্যাপ্লিকেশনটি কার্যকর হওয়ার সাথে সাথে কী ঘটছে তা দেখুন?
আপনি অ্যাপ্লিকেশনের বিভিন্ন সমবর্তী অংশগুলির মধ্যে মিথস্ক্রিয়াটিকে কীভাবে কল্পনা করতে পারেন?
আমার অভিজ্ঞতার ভিত্তিতে এই দুটি দিকের উত্তর নিম্নরূপ:
বিতরণ ট্রেসিং
ডিস্ট্রিবিউটড ট্রেসিং এমন প্রযুক্তি যা আপনার সিস্টেমের প্রতিটি স্বতন্ত্র সমসাময়িক উপাদানগুলির সময়কালীন ডেটা ক্যাপচার করে এবং এটি আপনাকে গ্রাফিকাল ফর্ম্যাটে উপস্থাপন করে। সমবর্তী মৃত্যুদন্ড কার্যকর করার প্রতিনিধিত্বগুলি সর্বদা আন্তঃবিবাহিত থাকে, আপনাকে সমান্তরালে কী চলছে এবং কী নয় তা দেখার অনুমতি দেয়।
বিতরণ করা ট্রেসিং এর মূল উত্স অবশ্যই (বিতরণযোগ্য) বিতরণ ব্যবস্থায় রয়েছে, যা সংজ্ঞা অনুসারে অ্যাসিনক্রোনাস এবং অত্যন্ত সমবর্তী। বিতরণ ট্রেসিং সহ একটি বিতরণ সিস্টেম লোককে এতে সক্ষম করে:
ক) গুরুত্বপূর্ণ বাধা চিহ্নিত করুন, খ) আপনার অ্যাপ্লিকেশনটির আদর্শ 'রানের' একটি চাক্ষুষ উপস্থাপনা প্রাপ্ত করুন এবং গ) সাম্প্রতিক আচরণ কী সম্পাদিত হচ্ছে তার দৃশ্যমানতা সরবরাহ করুন, d) সময়সীমার তথ্য প্রাপ্ত করুন যা আপনার পরিবর্তনের মধ্যে পার্থক্য নির্ধারণের জন্য ব্যবহার করা যেতে পারে সিস্টেম (আপনার কাছে শক্তিশালী এসএলএস থাকলে অত্যন্ত গুরুত্বপূর্ণ)।
বিতরণ ট্রেসিং এর পরিণতিগুলি হ'ল:
এটি আপনার সমস্ত সমসাময়িক প্রক্রিয়াগুলিতে ওভারহেড যুক্ত করে, কারণ এটি কোনও নেটওয়ার্কের মধ্যে কার্যকর এবং জমা দেওয়ার জন্য আরও কোডে অনুবাদ করে। কিছু ক্ষেত্রে, এই ওভারহেড অত্যন্ত তাত্পর্যপূর্ণ - এমনকি গুগল কেবল সমস্ত অনুরোধের একটি ছোট উপসেটে তাদের ট্রেসিং সিস্টেম ড্যাপার ব্যবহার করে যাতে ব্যবহারকারীর অভিজ্ঞতা নষ্ট না হয়।
অনেকগুলি বিভিন্ন সরঞ্জাম বিদ্যমান, এগুলির সমস্ত একে অপরের সাথে আন্তঃযোগযোগ্য নয়। এটি কিছুটা ওপেনট্রেসিংয়ের মতো মানাদির দ্বারা সংশ্লেষিত তবে পুরোপুরি সমাধান হয়নি।
এটি আপনাকে ভাগ করা সংস্থান এবং তাদের বর্তমান অবস্থান সম্পর্কে কিছুই বলে না । আপনি অ্যাপ্লিকেশন কোড এবং আপনি যে গ্রাফটি দেখছেন তা আপনাকে দেখিয়ে দিচ্ছে তার উপর ভিত্তি করে আপনি অনুমান করতে সক্ষম হতে পারেন তবে এই ক্ষেত্রে এটি কোনও কার্যকর সরঞ্জাম নয়।
বর্তমান সরঞ্জামগুলি ধরে নিয়েছে যে অতিরিক্ত বাড়াতে আপনার কাছে মেমরি এবং সঞ্চয় রয়েছে। আপনার সীমাবদ্ধতার উপর নির্ভর করে টাইমসারি সার্ভার হোস্টিং সস্তা নাও হতে পারে।
সফ্টওয়্যার ট্র্যাক করার সময় ত্রুটি
আমি উপরে সেন্ট্রিটির সাথে প্রাথমিকভাবে লিঙ্ক করেছি কারণ এটি সেখানে সর্বাধিক ব্যবহৃত সরঞ্জাম এবং সঠিক কারণে - সেন্ট্রাল সার্ভারের সাথে দেখা ত্রুটির একটি স্ট্যাক ট্রেস একই সাথে ফরোয়ার্ড করতে সেন্ট্রি হাইজ্যাক রানটাইম এক্সিকিউশন এর মতো ত্রুটি ট্র্যাকিং সফ্টওয়্যার।
সাম্প্রতিক কোডগুলিতে এই জাতীয় ডেডিকেটেড সফটওয়্যারের নেট সুবিধা:
- সদৃশ ত্রুটিগুলি সদৃশ হয় না । অন্য কথায়, যদি এক বা একাধিক সমবর্তী সিস্টেম একই ব্যতিক্রম সম্মুখীন, Sentry হবে বাড়ায় একটি ঘটনা রিপোর্ট, কিন্তু ঘটনার দু কপি জমা না।
এর অর্থ আপনি নির্ধারণ করতে পারবেন যে একযোগে ত্রুটিগুলি অগণিত একসাথে না গিয়ে কোন সমবর্তী সিস্টেমটি কোন ধরণের ত্রুটিটি অনুভব করছে। যদি আপনি কখনও বিতরণ করা সিস্টেম থেকে ইমেল স্প্যামের মুখোমুখি হয়ে থাকেন তবে আপনি জানেন যে নরকের কেমন লাগে।
আপনি আপনার সমবর্তী সিস্টেমের বিভিন্ন দিক এমনকি 'ট্যাগ' করতে পারেন (যদিও এটি ধরে নেওয়া হয় যে ঠিক একটি থ্রেডের মধ্যে আন্তঃবিবাহিত কাজ নেই যা প্রযুক্তিগতভাবে কোনওভাবে সামঞ্জস্যপূর্ণ নয় কারণ থ্রেড কেবল দক্ষতার সাথে কার্যের মধ্যে ঝাঁপিয়ে পড়েছে তবে অবশ্যই ইভেন্ট হ্যান্ডলারের প্রক্রিয়া করতে হবে সম্পূর্ণ করার জন্য) এবং ট্যাগ দ্বারা ত্রুটিগুলির একটি ভাঙ্গন দেখুন।
- আপনার রানটাইম ব্যতিক্রমগুলির সাথে অতিরিক্ত বিশদ সরবরাহ করতে আপনি এই ত্রুটিটি পরিচালনা করার সফ্টওয়্যারটি সংশোধন করতে পারেন। প্রক্রিয়াটি কি খোলা সংস্থান ছিল? এই প্রক্রিয়াটি যে কোনও ভাগ করে নেওয়া সংস্থান আছে? কোন ব্যবহারকারী এই সমস্যাটি অনুভব করেছেন?
এটি, সূক্ষ্ম স্ট্যাক ট্রেসগুলি (এবং উত্স মানচিত্রগুলি, যদি আপনাকে আপনার ফাইলগুলির একটি সংক্ষিপ্ত সংস্করণ সরবরাহ করতে হয়) ছাড়াও, সময়ের বেশিরভাগ অংশে কী ভুল হচ্ছে তা নির্ধারণ করা সহজ করে তোলে।
- (সেন্ট্রি-সুনির্দিষ্ট) সিস্টেমের পরীক্ষার জন্য আপনার পৃথক সেন্ট্রি রিপোর্টিং ড্যাশবোর্ড থাকতে পারে, যা আপনাকে পরীক্ষায় ত্রুটিগুলি ধরতে দেয়।
এই ধরনের সফ্টওয়্যারগুলির অসুবিধাগুলির মধ্যে রয়েছে:
সবকিছুর মতো তারাও বাল্ক যোগ করে। উদাহরণস্বরূপ, আপনি এম্বেড করা হার্ডওয়্যারগুলিতে এমন সিস্টেমটি নাও চাইতে পারেন। আমি নিষ্ক্রিয় মেশিনে কয়েক শতাধিক রানের নমুনা সহ এবং এর সাথে একটি সাধারণ সম্পাদনকে তুলনা করে, এই জাতীয় সফ্টওয়্যারটির একটি ট্রায়াল রান করার সুপারিশ করছি।
সমস্ত ভাষা সমানভাবে সমর্থিত নয়, কারণ এই সিস্টেমগুলির মধ্যে অনেকগুলি স্পষ্টতই একটি ব্যতিক্রম ধরায় নির্ভর করে এবং সমস্ত ভাষা শক্তিশালী ব্যতিক্রমগুলির বৈশিষ্ট্য দেয় না। বলা হচ্ছে, প্রচুর সিস্টেমের জন্য ক্লায়েন্ট রয়েছে।
এগুলি সুরক্ষা ঝুঁকি হিসাবে উত্থাপিত হতে পারে, কারণ এর মধ্যে অনেকগুলি সিস্টেম মূলত বদ্ধ-উত্স। এই ক্ষেত্রে, তাদের গবেষণা করার ক্ষেত্রে যথাযথ অধ্যবসায় করুন, বা, যদি পছন্দ হয় তবে আপনার নিজের রোল করুন।
তারা আপনাকে প্রয়োজনীয় তথ্য সর্বদা না দেয়। দৃশ্যমানতা যুক্ত করার সমস্ত প্রচেষ্টা সহ এটি একটি ঝুঁকি।
এই পরিষেবাগুলির বেশিরভাগই উচ্চতর সমসাময়িক ওয়েব অ্যাপ্লিকেশনগুলির জন্য ডিজাইন করা হয়েছিল, সুতরাং প্রতিটি সরঞ্জাম আপনার ব্যবহারের ক্ষেত্রে উপযুক্ত হতে পারে না।
সংক্ষেপে : দৃশ্যমানতা হ'ল যে কোনও সমবর্তী সিস্টেমের সবচেয়ে গুরুত্বপূর্ণ অংশ। উপরে উল্লিখিত দুটি পদ্ধতি, হার্ডওয়্যার এবং ডেটা সম্পর্কে ডেডিকেটেড ড্যাশবোর্ডের সাথে একত্রে যে কোনও নির্দিষ্ট সময়ে সিস্টেমের একটি হোলিডিটিক চিত্র পেতে পারি, সে দিকটি সুস্পষ্টভাবে ফুটিয়ে তোলার জন্য ইন্ডাস্ট্রিতে ব্যাপকভাবে ব্যবহৃত হয়।
কিছু অতিরিক্ত পরামর্শ
যে লোকেরা ভয়ানক উপায়ে সমসাময়িক সমস্যাগুলি সমাধান করার চেষ্টা করেছিল তাদের দ্বারা কোড ঠিক করার জন্য আমি বেশি সময় ব্যয় করেছি। প্রতিবার, আমি এমন কেস পেয়েছি যেখানে নিম্নলিখিত জিনিসগুলি বিকাশকারীদের অভিজ্ঞতার উন্নতি করতে পারে (যা ব্যবহারকারীর অভিজ্ঞতার মতোই গুরুত্বপূর্ণ):
ধরণের উপর নির্ভর করুন । টাইপিং আপনার কোডটি বৈধ করার জন্য উপস্থিত রয়েছে এবং রানটাইমে অতিরিক্ত গার্ড হিসাবে ব্যবহৃত হতে পারে। যেখানে টাইপিংয়ের অস্তিত্ব নেই, ত্রুটিগুলি ধরার জন্য দৃser়শক্তি এবং একটি উপযুক্ত ত্রুটি হ্যান্ডলারের উপর নির্ভর করুন। সমকালীন কোডের জন্য ডিফেন্সিভ কোড প্রয়োজন হয় এবং প্রকারগুলি সর্বোত্তম ধরণের বৈধতা উপলভ্য হিসাবে পরিবেশন করে।
- কোড উপাদানগুলির মধ্যে টেস্ট লিঙ্কগুলি কেবলমাত্র উপাদানটি নয়। এটি একটি পূর্ণ-বিকাশযুক্ত ইন্টিগ্রেশন পরীক্ষার সাথে বিভ্রান্ত করবেন না - যা প্রতিটি উপাদানগুলির মধ্যে প্রতিটি লিঙ্ক পরীক্ষা করে এবং তারপরেও এটি কেবলমাত্র চূড়ান্ত রাষ্ট্রের বৈশ্বিক বৈধতার সন্ধান করে। এটি ত্রুটিগুলি ধরা একটি ভয়ঙ্কর উপায়।
একটি ভাল লিঙ্ক পরীক্ষা পরীক্ষা করে দেখুন, যখন কোনও উপাদান বিচ্ছিন্নভাবে অন্য উপাদানগুলির সাথে কথা বলে , প্রাপ্ত বার্তা এবং প্রেরিত বার্তাটি আপনি প্রত্যাশা করেন একই রকম হয় কিনা। আপনার যদি যোগাযোগের জন্য ভাগ করা পরিষেবায় নির্ভর করে দুটি বা আরও বেশি উপাদান থাকে, সেগুলি সমস্ত স্পিন করুন, তাদেরকে কেন্দ্রীয় পরিষেবার মাধ্যমে বার্তাগুলি আদান প্রদান করুন এবং দেখুন যে আপনি শেষ পর্যন্ত কী প্রত্যাশা করছেন সেগুলি তারা পাচ্ছেন কিনা।
উপাদানগুলির নিজের পরীক্ষার জন্য প্রচুর উপাদান জড়িত পরীক্ষাগুলি ভাঙা এবং উপাদানগুলির মধ্যে প্রতিটি কীভাবে যোগাযোগ করে তা একটি পরীক্ষার মাধ্যমে আপনাকে আপনার কোডের বৈধতার উপর আস্থা বাড়িয়ে তোলে। এ জাতীয় কঠোর পরিশ্রমের পরীক্ষাগুলি আপনাকে পরিষেবাগুলির মধ্যে চুক্তি কার্যকর করার পাশাপাশি অপ্রত্যাশিত ত্রুটিগুলি যখন একবারে চালানো হয় তখন তা ধরা দেয়।
- আপনার অ্যাপ্লিকেশনের অবস্থাটি বৈধ করতে ডান অ্যালগরিদম ব্যবহার করুন। আমি সাধারণ বিষয়গুলির বিষয়ে কথা বলছি, যেমন আপনি যখন একটি মাস্টার প্রক্রিয়া সম্পন্ন করে তার সমস্ত কর্মী কোনও কাজ শেষ করার জন্য অপেক্ষা করেন এবং কেবলমাত্র সমস্ত কর্মী সম্পূর্ণরূপে সম্পন্ন হলে পরবর্তী পদক্ষেপে যেতে চান - এটি বিশ্বব্যাপী সনাক্তকরণের একটি উদাহরণ সমাপ্তি, যার জন্য সাফরার অ্যালগরিদমের মতো পরিচিত পদ্ধতি বিদ্যমান।
এই সরঞ্জামগুলির মধ্যে কয়েকটি ভাষার সাথে বান্ডিল হয়ে আসে - উদাহরণস্বরূপ, রাস্ট গ্যারান্টি দেয় যে আপনার কোডটি সংকলন সময়ে কোনও রেসের শর্ত থাকবে না, এবং গোতে একটি ইনবিল্ট ডেডলক সনাক্তকারী রয়েছে যা সংকলন-সময়ে চালিত হয়। তারা যদি উত্পাদন হিট করার আগে আপনি সমস্যাগুলি ধরতে পারেন তবে এটি সর্বদা একটি জয়।
থাম্বের একটি সাধারণ নিয়ম: সমবর্তী সিস্টেমে ব্যর্থতার জন্য নকশা । অনুমান করুন যে সাধারণ পরিষেবাগুলি ক্র্যাশ বা বিরতিবে। এটি এমন কোনও কোডের জন্যও যায় যা মেশিনগুলিতে বিতরণ করা হয় না - একক মেশিনে সমবর্তী কোড বহিরাগত নির্ভরতার উপর নির্ভর করতে পারে (যেমন একটি ভাগ করা লগ ফাইল, একটি রেডিস সার্ভার, একটি মাইএসকিউএল সার্ভার) যা যে কোনও সময় অদৃশ্য হয়ে যেতে বা মুছে ফেলা হতে পারে) on ।
এটি করার সর্বোত্তম উপায় হ'ল সময় সময় অ্যাপ্লিকেশন রাষ্ট্রকে বৈধতা দেওয়া - প্রতিটি পরিষেবার জন্য স্বাস্থ্য পরীক্ষা করা এবং এই সেবার গ্রাহকদের খারাপ স্বাস্থ্যের বিষয়ে অবহিত করা হয়েছে তা নিশ্চিত করা। ডকারের মতো আধুনিক ধারক সরঞ্জামগুলি এটি বেশ ভালভাবে করে এবং স্যান্ডবক্স জিনিসগুলিতে ব্যবহার করা উচিত।
কীভাবে একত্রিত করা যায় এবং কী অনুক্রমিকভাবে তৈরি করা যায় তা কীভাবে আবিষ্কার করবেন?
সর্বাধিক সমবর্তী সিস্টেমটিতে কাজ করা শিখেছি সবচেয়ে বড় পাঠটি হ'ল: আপনার কখনও পর্যাপ্ত মেট্রিক থাকতে পারে না । আপনার অ্যাপ্লিকেশনের মেট্রিকগুলি একেবারে সমস্ত গাড়ি চালানো উচিত - আপনি যদি সমস্ত কিছু পরিমাপ না করে থাকেন তবে আপনি প্রকৌশলী নন।
মেট্রিক ছাড়া আপনি কয়েকটি খুব গুরুত্বপূর্ণ কাজ করতে পারবেন না:
সিস্টেমে পরিবর্তনগুলি দ্বারা পার্থক্য নির্ধারণ করুন। আপনি যদি জানেন না যে টিউনিং নোবড এড মেট্রিক বি উপরে গিয়েছে এবং মেট্রিক সি নীচে যায় তবে আপনি জানেন না যে লোকেরা যখন আপনার সিস্টেমে অপ্রত্যাশিতভাবে ম্যালিগন্যান্ট কোডটি চাপায় (তখন তারা আপনার সিস্টেমে কোডটি চাপ দেবে) কীভাবে আপনার সিস্টেমটি ঠিক করতে হবে? ।
জিনিসগুলির উন্নতি করার জন্য আপনার পরবর্তী কী করা দরকার তা বুঝতে পারেন। যতক্ষণ না আপনি জানেন যে অ্যাপ্লিকেশনগুলি মেমোরিতে কম চলছে, আপনার সার্ভারগুলির জন্য আপনার আরও বেশি মেমরি পাওয়া উচিত বা আরও বেশি ডিস্ক কিনবেন কিনা তা আপনি বুঝতে পারবেন না।
মেট্রিকগুলি এত গুরুত্বপূর্ণ এবং অপরিহার্য যে কোনও সিস্টেমের কী প্রয়োজন হবে তা চিন্তা করার আগেও আমি কীটি পরিমাপ করতে চাই তার পরিকল্পনা করার সচেতন প্রচেষ্টা করেছি। প্রকৃতপক্ষে, মেট্রিকগুলি এত গুরুত্বপূর্ণ যে আমি বিশ্বাস করি যে তারা এই প্রশ্নের সঠিক উত্তর: আপনার প্রোগ্রামের বিটগুলি কী করছে তা পরিমাপ করার সময় আপনি কেবলমাত্র জানবেন যে অনুক্রমিক বা সমবর্তী তৈরি করা যায় । যথাযথ নকশাটি অনুমানের কাজ নয়, সংখ্যা ব্যবহার করে।
বলা হচ্ছে, থাম্বের কয়েকটি নিয়ম অবশ্যই রয়েছে:
ক্রমবিকাশ নির্ভরতা নির্ভর করে। একটি কিছু ফ্যাশনে অন্যটির উপর নির্ভরশীল হলে দুটি প্রক্রিয়া ক্রমযুক্ত হওয়া উচিত। কোনও নির্ভরতা ছাড়াই প্রক্রিয়াগুলি একই সাথে হওয়া উচিত। তবে ব্যর্থতা হ্যান্ডল করার জন্য এমন একটি পরিকল্পনা পরিকল্পনা করুন যা প্রবাহকে অনির্দিষ্টকালের জন্য অপেক্ষা থেকে আটকাবে না।
একই কোরটিতে সিপিইউ-বাউন্ড টাস্কের সাথে আই / ও বাউন্ড টাস্কটি কখনই মিশ্রিত করবেন না। (উদাহরণস্বরূপ) এমন কোনও ওয়েব ক্রলারটি লিখবেন না যা একই থ্রেডে দশটি সমবর্তী অনুরোধগুলি প্রবর্তন করে, তারা আসার সাথে সাথে এগুলিকে স্ক্র্যাপ করে দেয় এবং পাঁচশত স্কেল করার আশা করে - I / O অনুরোধগুলি সমান্তরালে একটি কাতারে যাবে, তবে সিপিইউ এখনও সিরিয়ালি তাদের মধ্য দিয়ে যাবে। (এই একক থ্রেডযুক্ত ইভেন্ট চালিত মডেলটি জনপ্রিয় একটি, তবে এটি এই দিকের কারণে সীমাবদ্ধ - এটি বোঝার পরিবর্তে লোকেরা কেবল তাদের হাতকে ঘেউ ঘেউ করে বলে এবং নোড স্কেল করে না, আপনাকে উদাহরণ দেওয়ার জন্য)।
একটি একক থ্রেড অনেকগুলি I / O কাজ করতে পারে। তবে আপনার হার্ডওয়্যারের সম্মতিটি সম্পূর্ণরূপে ব্যবহার করতে, থ্রেডপুলগুলি ব্যবহার করুন যা একসাথে সমস্ত কোর দখল করে। উপরের উদাহরণে, কেবল সিপিইউ কাজের জন্য পাঁচটি পাইথন প্রসেস (যার মধ্যে একটি ছয়টি কোর মেশিনে একটি কোর ব্যবহার করতে পারে) আরম্ভ করে কেবল sixth ষ্ঠ পাইথন থ্রেডটি কেবল আপনার I / O কাজের জন্য আরও দ্রুত স্কেল করবে।
সিপিইউ সমাবর্তনের সুবিধা নেওয়ার একমাত্র উপায় হ'ল ডেডিকেটেড থ্রেডপুলের মাধ্যমে। অনেকগুলি আই / ও বাউন্ড কাজের জন্য একটি থ্রেড প্রায়শই যথেষ্ট ভাল। এই কারণেই ইভেন্ট-চালিত ওয়েব সার্ভারগুলির মতো এনগিনেক্স স্কেল আরও ভাল (তারা খাঁটিভাবে I / O আবদ্ধ কাজ করে) অ্যাপাচি (যা সিপিইউ প্রয়োজন এমন কিছু সাথে I / O আবদ্ধ কাজকে সংযুক্ত করে এবং অনুরোধ অনুযায়ী একটি প্রক্রিয়া শুরু করে), তবে কেন নোড ব্যবহার করে সমান্তরালভাবে পাওয়া হাজার হাজার জিপিইউ গণনা একটি ভয়ানক ধারণা।