ইভেন্টগুলি কি কেবল জিইউআই প্রোগ্রামিংয়ের জন্য ব্যবহৃত হয়?
যখন এই অন্যান্য জিনিসটির কিছু ঘটে তখন আপনি কীভাবে সাধারণ ব্যাকএন্ড প্রোগ্রামিংয়ে পরিচালনা করবেন?
ইভেন্টগুলি কি কেবল জিইউআই প্রোগ্রামিংয়ের জন্য ব্যবহৃত হয়?
যখন এই অন্যান্য জিনিসটির কিছু ঘটে তখন আপনি কীভাবে সাধারণ ব্যাকএন্ড প্রোগ্রামিংয়ে পরিচালনা করবেন?
উত্তর:
নাঃ। পর্যবেক্ষককে বাস্তবায়নের জন্য এবং ক্লাসগুলি সংশোধনের জন্য বন্ধ রয়েছে কিনা তা নিশ্চিত করার জন্য তারা সত্যই কার্যকর।
ধরা যাক আমাদের একটি পদ্ধতি রয়েছে যা নতুন ব্যবহারকারীদের নিবন্ধন করে।
public void Register(user) {
db.Save(user);
}
তারপরে কেউ সিদ্ধান্ত নেয় যে একটি ইমেল প্রেরণ করা উচিত। আমরা এটি করতে পারি:
public void Register(user) {
db.Save(user);
emailClient.Send(new RegistrationEmail(user));
}
তবে আমরা সবেমাত্র এমন একটি ক্লাস সংশোধন করেছি যা পরিবর্তনের জন্য বন্ধ হয়ে যাওয়ার কথা। সম্ভবত এই সাধারণ ছদ্ম-কোডের জন্য সূক্ষ্ম, তবে সম্ভবত উত্পাদন কোডে উন্মাদনার উপায়। এই পদ্ধতিটি কোডের 30 টি লাইন না হওয়া অবধি কতক্ষণ না সবে নতুন ব্যবহারকারী তৈরির মূল উদ্দেশ্য সম্পর্কিত?
ক্লাসটি তার মূল কার্যকারিতাটি সম্পাদন করতে দেওয়া এবং এমন একটি ইভেন্ট উত্থাপন করা যা যে কেউ শুনছেন যে একজন ব্যবহারকারী নিবন্ধিত হয়েছে, এবং তারা যে কোনও পদক্ষেপ নিতে হবে (যেমন কোনও ইমেল প্রেরণ করা) নিতে পারে তা অনেক সুন্দর।
public void Register(user) {
db.Save(user);
RaiseUserRegisteredEvent(user);
}
এটি আমাদের কোডটিকে পরিষ্কার এবং নমনীয় রাখে। ওওপির প্রায়শই অবহেলিত টুকরোগুলির মধ্যে একটি হল ক্লাসগুলি একে অপরকে বার্তা প্রেরণ করে । ইভেন্টগুলি এই বার্তা messages
নাঃ।
নন-জিইউআই যুক্তিতে ব্যবহৃত ইভেন্টগুলির একটি দুর্দান্ত উদাহরণ হ'ল ডেটাবেস ট্রিগার।
ট্রিগারগুলি হ'ল এমন কোড যা কোনও প্রদত্ত ইভেন্ট সংঘটিত হওয়ার পরে কার্যকর করা হয় (INSERT, মোছা, ইত্যাদি)। আমার কাছে একটি ইভেন্টের মতো মনে হচ্ছে।
এটি ইভেন্টের উইকিপিডিয়া সংজ্ঞা:
কম্পিউটিংয়ে কোনও ইভেন্ট হ'ল এমন একটি ক্রিয়া বা ঘটনা যা সফ্টওয়্যার দ্বারা পরিচালিত হতে পারে সফ্টওয়্যার দ্বারা স্বীকৃত। কম্পিউটার ইভেন্টগুলি ব্যবহারকারী দ্বারা বা অন্য উপায়ে সিস্টেম দ্বারা উত্পন্ন বা ট্রিগার হতে পারে। সাধারণত প্রোগ্রামগুলি প্রবাহের সাথে ইভেন্টগুলি সিঙ্ক্রোনালি হ্যান্ডল করা হয়, অর্থাৎ, সফ্টওয়্যারটিতে এক বা একাধিক উত্সর্গীকৃত জায়গা থাকতে পারে যেখানে ইভেন্টগুলি পরিচালনা করা হয়, প্রায়শই ইভেন্ট লুপ হয়। ইভেন্টগুলির উত্সটিতে ব্যবহারকারী অন্তর্ভুক্ত থাকে, যাহারা সফ্টওয়্যারটির সাথে উপায়ের সাথে ইন্টারঅ্যাক্ট করতে পারে, উদাহরণস্বরূপ, কীবোর্ডে কীস্ট্রোক। আরেকটি উত্স হ'ল একটি টাইমারের মতো একটি হার্ডওয়্যার ডিভাইস। সফ্টওয়্যার ইভেন্টের লুপে যেমন ইভেন্টের নিজস্ব সেটটি ট্রিগার করতে পারে, যেমন কোনও টাস্কের সমাপ্তির জন্য যোগাযোগ করতে। সফ্টওয়্যার যা ইভেন্টগুলির প্রতিক্রিয়াতে তার আচরণের পরিবর্তন করে তা বলা হয় ইভেন্ট-চালিত, প্রায়শই ইন্টারেক্টিভ হওয়ার লক্ষ্য নিয়ে।
সমস্ত ইভেন্ট ব্যবহারকারীর দ্বারা উত্পাদিত হয় না। কিছু আমি টাইমর দ্বারা ক্রোনটবের মতো তৈরি করা হয়েছিল যেমন একটি ডাটাবেস INSERT এর আগে যেমন আমি আগে উল্লেখ করেছি।
সংজ্ঞাটি আরও কিছু প্রোগ্রাম বা সিস্টেমগুলির চেয়ে আরও উল্লেখ করে যে "ইভেন্ট-চালিত, প্রায়শই ইন্টারেক্টিভ হওয়ার লক্ষ্য নিয়ে" , যার মধ্য থেকে যে কোনও ব্যক্তি জানতে পারেন যে ইভেন্টগুলির উদ্দেশ্য বা উপযোগ কেবলমাত্র নয়, বরং প্রায়শই ইন্টারঅ্যাক্টিভিটি সরবরাহ করা হয় (জিইউআইএসের মতো) যদিও অগত্যা জিইউআই নয়, যেহেতু সিএলআই প্রোগ্রামগুলি ইন্টারেক্টিভও হতে পারে)।
ইভেন্ট-ভিত্তিক প্রোগ্রামিং প্রকৃতপক্ষে উচ্চ পারফরম্যান্ট সার্ভার প্রোগ্রামিংয়ের জন্যও ব্যবহৃত হয়।
একটি সাধারণ সার্ভার কাজের চাপে, ফলাফলের প্রক্রিয়াকরণের বেশিরভাগ সময় আসলে আই / ও থেকে আসে। উদাহরণস্বরূপ, একটি (7200 আরপিএম) হার্ড ডিস্ক ড্রাইভের ডেটা টানতে 8.3 এমএস পর্যন্ত লাগতে পারে। একটি আধুনিক গিগাহার্টজ প্রসেসরের জন্য, এটি million 1 মিলিয়ন ক্লকচক্রের সমান হবে। যদি কোনও সিপিইউ প্রতিবার ডেটার জন্য অপেক্ষা করে থাকে (কিছুই না করে), আমরা প্রচুর ঘড়ির চক্র হারাব।
প্রচলিত প্রোগ্রামিং কৌশলগুলি একাধিক থ্রেড প্রবর্তন করে এটিকে ঘিরে । সিপিইউ একই সাথে কয়েকশ থ্রেড চালানোর চেষ্টা করে। যাইহোক, এই মডেলটি সমস্যাটি হ'ল, প্রতিটি সময় কোনও সিপিইউ থ্রেড সুইচ করে, প্রসঙ্গের সুইচটিতে এটি কয়েকশো ঘড়ির চক্রের প্রয়োজন । কনটেক্সট সুইচ হ'ল সিপিইউ থ্রেড-লোকাল মেমোরিটি সিপিইউ'র রেজিস্টারে অনুলিপি করে এবং পুরানো থ্রেডের রেজিস্টার / স্টেটটি র্যামে জমা করে।
অতিরিক্তভাবে প্রতিটি থ্রেডের স্টেট সংরক্ষণের জন্য অবশ্যই একটি নির্দিষ্ট পরিমাণের মেমরি ব্যবহার করতে হবে।
আজ, সার্ভারগুলির জন্য একটি ধাক্কা রয়েছে যার একটি একক থ্রেড রয়েছে যা লুপে চলে। তারপরে কাজের টুকরোগুলিকে একটি বার্তা পাম্পের দিকে ঠেলে দেওয়া হয় , যা একক থ্রেডের জন্য সারি হিসাবে কাজ করে (অনেকটা ইউআই থ্রেডের মতো)। কাজ শেষ হওয়ার অপেক্ষার পরিবর্তে, হার্ড ডিস্ক ড্রাইভ অ্যাক্সেসের মতো জিনিসগুলির জন্য সিপিইউ একটি কলব্যাক ইভেন্ট সেট করে। যা কনটেক্সট স্যুইচিং হ্রাস করে।
এই জাতীয় সার্ভারের সর্বোত্তম উদাহরণটি নোড.জেএস , যা দেখানো হয়েছে যে মাঝারি হার্ডওয়্যার দিয়ে 1 মিলিয়ন একযোগে সংযোগগুলি পরিচালনা করতে সক্ষম হয়েছে, যখন একটি জাভা / টমক্যাট সার্ভার কয়েক হাজারে লড়াই করবে would
ঘটনাবলী এছাড়াও প্রচন্ডভাবে নেটওয়ার্কের প্রোগ্রামিং (যেমন nginx) ব্যবহার করা হয় ব্যয়বহুল এড়াতে লুপ ব্যস্ত-অপেক্ষা করুন এবং পরিবর্তে জানেন যে একটি পরিষ্কার ইন্টারফেস প্রদান ঠিক (আমি / আউটপুট, জরুরী তথ্য ইত্যাদি) যখন একটি নির্দিষ্ট অপারেশন পাওয়া যায়। এটি সি 10 কে সমস্যার সমাধানও ।
মূল ধারণাটি হ'ল OS কে ইভেন্টের জন্য নিরীক্ষণ করার জন্য সকেটগুলির একটি সেট (অর্থাত্ নেটওয়ার্ক সংযোগ) সরবরাহ করা, সেগুলির সবগুলি বা কেবলমাত্র আপনি বিশেষভাবে আগ্রহী (উদাহরণস্বরূপ পড়ার জন্য উপলভ্য ডেটা); তালিকার কোনও একটি সকেটে অপারেটিং সিস্টেমের মাধ্যমে যখন এই জাতীয় কার্যকলাপ সনাক্ত করা হয়, আপনি API এর দ্বারা অনুসন্ধান করা ইভেন্টটির একটি বিজ্ঞপ্তি পাবেন যা আপনাকে কোথা থেকে আসে তা বাছাই করে সেই অনুসারে কাজ করতে হবে ।
এখন, এটি একটি নিম্ন-স্তরের এবং বিমূর্ত দৃশ্য, আরও ভাল স্কেল করা কঠিন। তবে এমন অনেকগুলি উচ্চ স্তরের ফ্রেমওয়ার্ক রয়েছে যা এটি এমনকি ক্রস-প্ল্যাটফর্মের ফ্যাশনে ডিল করে: পাইথনের জন্য বাঁকানো, সি ++ এর জন্য বুস্ট .অ্যাসিও বা সি'র জন্য মুক্তির বিষয়টি আমার মনে আসে।
এম্বেড থাকা সিস্টেমগুলি প্রায়শই সহজাতভাবে ইভেন্ট-চালিত হয়, এমনকি যদি সেগুলি স্পষ্টভাবে প্রোগ্রাম না করা হয়।
এই ইভেন্টগুলি হার্ডওয়্যার বিঘ্ন, বোতাম টিপুন, পিরিয়ড অ্যানালগ থেকে ডিজিটাল রিডিং, টাইমার সমাপ্তি ইত্যাদির মতো জিনিস থেকে আসে
লো-পাওয়ার এম্বেড থাকা সিস্টেমগুলি ইভেন্ট-চালিত হওয়ার সম্ভাবনা আরও বেশি; তারা বেশিরভাগ সময় ঘুমিয়ে কাটায় (সিপিইউ একটি স্বল্প বিদ্যুতের মোডে ঘুমায়), কিছু হওয়ার জন্য অপেক্ষা করে (যে "কিছু" একটি ইভেন্ট)।
ইভেন্ট-চালিত এম্বেডেড সিস্টেমগুলির জন্য একটি সাধারণ এবং জনপ্রিয় ফ্রেমওয়ার্কগুলির একটি হ'ল কোয়ান্টাম প্ল্যাটফর্ম (কিউপি) (কিউপি লিনাক্স, উইন্ডোজ এবং কোনও ইউনিক্স-এর মতো ওএস এর অধীনেও কাজ করে।) স্টেট মেশিনগুলি ইভেন্ট-চালিত প্রোগ্রামিংয়ের জন্য একটি প্রাকৃতিক ফিট, প্রোগ্রামটি সাধারণ অর্থে "অনুক্রমিক" নয়, বরং এটি "কলব্যাকস" এর একটি সেট যা সিস্টেমের অবস্থা এবং বর্তমান ইভেন্টের উপর নির্ভর করে আহবান করে।
ইভেন্ট বার্তাগুলি গ্রেগর হোপ।
ইভেন্ট চালিত আর্কিটেকচার গ্রেগর হোপ pe
SEDA আর্কিটেকচার , ওয়েলশ, কুলার, ব্রিউয়ার।
আপনি যখন স্বাভাবিক ব্যাকএন্ড প্রোগ্রামিংয়ে হ্যান্ডেল করবেন যখন কিছু ঘটে অন্য কিছু করে?
ফিনাইট স্টেট মেশিন একটি সাধারণ পদ্ধতি
Given(State.A)
When(Event.B)
Then(State.C)
.and(Consequences.D)
এম্বেড থাকা সিস্টেমে ইভেন্টগুলি বিঘ্নের সময় ঘটে। টাইমার থেকে শুরু করে আই / ও পর্যন্ত প্রচুর বিঘ্নের উত্স রয়েছে।
এছাড়াও, আরটিওএসের ইভেন্টগুলিও থাকতে পারে। একটি উদাহরণ অন্য কোনও কাজের বার্তার জন্য অপেক্ষা করছে।
এমবেডেড নন সিস্টেমের জন্য তবে আমি সি # তে যা কিছু করছিলাম তা ছিল এসসিএডিএ সিস্টেম। গুদামে যা ঘটেছিল তার সাথে অনেকগুলি ঘটনা যুক্ত ছিল যখন সিস্টেম উত্পন্ন ইভেন্টের লোড আনলোড করা অংশ ছিল এবং অন্য অংশটি ডাটাবেসে নতুন রাষ্ট্র লিখছিল। আমাদের অবশ্যই কিছু জিইআইআই ক্লায়েন্ট ছিল তবে এটি কেবলমাত্র ডাটাবেসের অবস্থা প্রদর্শন করা ছিল যা গুদামের অবস্থা প্রতিফলিত করে। সুতরাং এটি ইভেন্ট এবং থ্রেডিংয়ের ভিত্তিতে ব্যাকএন্ড সার্ভার সফটওয়্যার ছিল। বিকাশ বেশ চ্যালেঞ্জিং।