ইভেন্টগুলি কি কেবল জিইউআই প্রোগ্রামিংয়ের জন্য ব্যবহৃত হয়?


57

ইভেন্টগুলি কি কেবল জিইউআই প্রোগ্রামিংয়ের জন্য ব্যবহৃত হয়?

যখন এই অন্যান্য জিনিসটির কিছু ঘটে তখন আপনি কীভাবে সাধারণ ব্যাকএন্ড প্রোগ্রামিংয়ে পরিচালনা করবেন?


6
যাইহোক, ইভেন্ট সোর্স ইভেন্ট-প্রোগ্রামিংয়ের একটি সম্পূর্ণ orthogonal ধারণা। ইভেন্ট সোর্সিংয়ের প্রাথমিক ধারণাটি হ'ল আপনি আপনার সিস্টেমের "স্টেট" সংরক্ষণের পরিবর্তে আপনার সিস্টেমে "ইভেন্ট" বা "পরিবর্তন" সঞ্চয় করেন। উদাহরণস্বরূপ, আপনি আপনার ব্যাংক অ্যাকাউন্টকে ক) আপনার ব্যালেন্স (রাজ্য) বা খ) লেনদেনের একটি সিরিজ (ইভেন্টস) হিসাবে মডেল করতে পারেন।
আরটিস

4
ব্যবহারের উপর নির্ভর করে একটি "ইভেন্ট" সাধারণত চিনির সাথে আবৃত কলব্যাকের কিছু রূপ। কলব্যাকগুলি সর্বত্র ব্যবহৃত হয় - আপনি যদি আগ্রহী হন তবে এটি সম্ভবত একটি ভাল কীওয়ার্ড দিয়ে অনুসন্ধান শুরু করতে হবে।
জে ...

10
আমি আরও উল্লেখ করব যে আপনি মাইক্রোকন্ট্রোলারের মতো নিম্ন স্তরে গেলেও আপনি হার্ডওয়্যারকে একটি কার্যকর এবং বিতর্কিতভাবে প্রয়োজনীয় বৈশিষ্ট্যটি বাধাগ্রস্থ করতে পারবেন। কন্ট্রোল সিস্টেমের জন্য দুর্দান্ত বা কফি প্রস্তুতকারকের মতো বেসিক আইও O এই হার্ডওয়্যার বিঘ্ন ঘটনাগুলি মূলত ইভেন্টগুলির থেকে পৃথক নয়।
ড্যান

নাঃ! ব্যবহারিক উদাহরণ: নোডেজ ইভেন্টস
সাম্পাথিস্রিস

2
আপনি কি উইন্ডোজে আছেন? ইভেন্ট ভিউয়ারটি দেখুন। আনন্দ কর.
২৩7777

উত্তর:


106

নাঃ। পর্যবেক্ষককে বাস্তবায়নের জন্য এবং ক্লাসগুলি সংশোধনের জন্য বন্ধ রয়েছে কিনা তা নিশ্চিত করার জন্য তারা সত্যই কার্যকর।

ধরা যাক আমাদের একটি পদ্ধতি রয়েছে যা নতুন ব্যবহারকারীদের নিবন্ধন করে।

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


37
আমি এটি পড়েছি এবং আমাদের "তৈরি বুকিং" কোডটি মনে করি এবং আমি কিছুক্ষণের জন্য কান্নাকাটি করি এবং আরও ভাল জায়গার জন্য অপেক্ষা করি: '(
সারা

1
+1, দুর্দান্ত উত্তর। কেবল একটি স্পর্শকাতর প্রশ্ন (এটি আমাকে খানিকটা বিরক্ত করেছিল): আপনার পদ্ধতির নামগুলি (রেজিস্ট্রেশন, সংরক্ষণ এবং প্রেরণ) বড় বড় অক্ষর দিয়ে শুরু করার কোনও বিশেষ কারণ আছে কি? যদিও এটি এই উত্তরটির কার্যকারিতা প্রভাবিত করে না।
পেড্রো এ

14
@ হামস্টেরিফিক আমি বেশিরভাগ সি # দেব এবং এটিই সাধারণভাবে গৃহীত কনভেনশন। অন্য কোন কারণ নেই।
রাবারডাক

6
@ হ্যামস্টেরিফিক্স যুক্ত করুন, আপনি যা লোয়ারকেস বলছেন তবে মাঝখানে একটি বড় হাতের অক্ষর রয়েছে তাকে প্রায়শই উটকেস বলা হয় কারণ এটি মাঝখানে কুঁচকিয়েছে। এটি এটিকে সাপ_কেসে আলাদা করে, যেখানে ছোট হাতের শব্দগুলি আন্ডারস্কোর দ্বারা পৃথক করা হয়, যা অজগর এবং বেশিরভাগ শেল ভাষার সাথে পরিচিত, কয়েকটি নাম রাখার জন্য।
হারুন

5
ইভেন্টগুলি হ'ল এই বার্তাগুলির এক প্রকার , আমি বলব। পদ্ধতি কলগুলিও ম্যাসেজ পাসিং হিসাবে বিবেচিত হবে বলে মনে করা হচ্ছে।
jpmc26

53

নাঃ।

নন-জিইউআই যুক্তিতে ব্যবহৃত ইভেন্টগুলির একটি দুর্দান্ত উদাহরণ হ'ল ডেটাবেস ট্রিগার।

ট্রিগারগুলি হ'ল এমন কোড যা কোনও প্রদত্ত ইভেন্ট সংঘটিত হওয়ার পরে কার্যকর করা হয় (INSERT, মোছা, ইত্যাদি)। আমার কাছে একটি ইভেন্টের মতো মনে হচ্ছে।

এটি ইভেন্টের উইকিপিডিয়া সংজ্ঞা:

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

সমস্ত ইভেন্ট ব্যবহারকারীর দ্বারা উত্পাদিত হয় না। কিছু আমি টাইমর দ্বারা ক্রোনটবের মতো তৈরি করা হয়েছিল যেমন একটি ডাটাবেস INSERT এর আগে যেমন আমি আগে উল্লেখ করেছি।

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


2
আমি যখন ডেটাবেস ট্রিগারগুলি সম্পর্কে শুনি তখন আমি সর্বদা এটির
অ্যালমো

একজন প্রাক্তন ডিবিএ এখন বিকাশকারী হিসাবে আমি যখনই শুনি লোকেরা বিস্তৃত ডিবি কর্মক্ষমতা বিবেচনা না করে ট্রিগারগুলি ব্যবহার করার বিষয়ে কথা শুনি time
তিনটি মান যৌক্তিক

28

ইভেন্ট-ভিত্তিক প্রোগ্রামিং প্রকৃতপক্ষে উচ্চ পারফরম্যান্ট সার্ভার প্রোগ্রামিংয়ের জন্যও ব্যবহৃত হয়।

একটি সাধারণ সার্ভার কাজের চাপে, ফলাফলের প্রক্রিয়াকরণের বেশিরভাগ সময় আসলে আই / ও থেকে আসে। উদাহরণস্বরূপ, একটি (7200 আরপিএম) হার্ড ডিস্ক ড্রাইভের ডেটা টানতে 8.3 এমএস পর্যন্ত লাগতে পারে। একটি আধুনিক গিগাহার্টজ প্রসেসরের জন্য, এটি million 1 মিলিয়ন ক্লকচক্রের সমান হবে। যদি কোনও সিপিইউ প্রতিবার ডেটার জন্য অপেক্ষা করে থাকে (কিছুই না করে), আমরা প্রচুর ঘড়ির চক্র হারাব।

প্রচলিত প্রোগ্রামিং কৌশলগুলি একাধিক থ্রেড প্রবর্তন করে এটিকে ঘিরে । সিপিইউ একই সাথে কয়েকশ থ্রেড চালানোর চেষ্টা করে। যাইহোক, এই মডেলটি সমস্যাটি হ'ল, প্রতিটি সময় কোনও সিপিইউ থ্রেড সুইচ করে, প্রসঙ্গের সুইচটিতে এটি কয়েকশো ঘড়ির চক্রের প্রয়োজন । কনটেক্সট সুইচ হ'ল সিপিইউ থ্রেড-লোকাল মেমোরিটি সিপিইউ'র রেজিস্টারে অনুলিপি করে এবং পুরানো থ্রেডের রেজিস্টার / স্টেটটি র‌্যামে জমা করে।

অতিরিক্তভাবে প্রতিটি থ্রেডের স্টেট সংরক্ষণের জন্য অবশ্যই একটি নির্দিষ্ট পরিমাণের মেমরি ব্যবহার করতে হবে।

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

এই জাতীয় সার্ভারের সর্বোত্তম উদাহরণটি নোড.জেএস , যা দেখানো হয়েছে যে মাঝারি হার্ডওয়্যার দিয়ে 1 মিলিয়ন একযোগে সংযোগগুলি পরিচালনা করতে সক্ষম হয়েছে, যখন একটি জাভা / টমক্যাট সার্ভার কয়েক হাজারে লড়াই করবে would


2
"পরিমিত হার্ডওয়্যার" কিছুটা বিভ্রান্তিকর। ওএস যা ব্যবহার করে তা ছাড়াও নোডের জন্য আপনার 8 জিবি + লাগবে। এবং আপনার যদি এত বেশি স্মৃতি থাকে তবে টমক্যাট সহজেই কয়েক হাজার সংযোগ পরিচালনা করতে পারে। মঞ্জুর, একটি বড় পার্থক্য আছে, কিন্তু এটি 1000x নয়।
পল ড্রাগার

@ পলড্রাপার এটি করতে পারে না। এবং না এটি না। 8000 থ্রেডের জন্য কেবল স্ট্যাকের জন্য আপনার 8 গিগাবাইট + প্রয়োজন। এটাই বড় পার্থক্য।
আরটিস

3
8 জিবি ছাড়াও @ পলড্রাপার সার্ভার স্ট্যান্ডার্ড অনুসারে খুব বিনয়ী। আমি 128 গিগাবাইট র‌্যাম সহ মেশিনে কাজ করেছি এবং সেগুলি পুরোপুরি লোড করা হয়নি। আপনার পুরো মেশিনের চেয়ে ভেড়ার কাঠিগুলির দাম বেশি।
আরটিস

এটি আপনার স্ট্যাকের আকারটি নির্ভর করে। ওরাকল / ওপেনজেডিকে বেশিরভাগ প্ল্যাটফর্মগুলিতে 64-বিটের জন্য 1MB এবং 32-বিটের জন্য 512 কে ডিফল্ট হয়। আপনি যদি কেবল ডিফল্টগুলি নেন তবে আপনি সঠিক হয়ে উঠবেন। তবে ডিফল্টগুলি কীভাবে আপনি 1 এম নোড সংযোগগুলি পাবেন তা নয়;) যাইহোক, 128 কে প্রচুর পরিমাণে; আপনি আরও কম সঙ্গে পালাতে পারেন। 8000 থ্রেডের জন্য এটি 1GB স্ট্যাক স্পেস হবে।
পল ড্রাগার

6
তুমি ভুল করেছ এমনকি ডিফল্ট স্ট্যাক আকার সহ, আপনার কেবল ভার্চুয়াল মেমরির 8 গিগাবাইট প্রয়োজন । স্মৃতিটি উড়ে যাওয়ার প্রয়োজনে প্রতিশ্রুতিবদ্ধ। সাধারণত, আপনি কেবল অতিরিক্ত মেমরি ব্যবহার না করে আপনার স্ট্যাকের জন্য কেবল একটি পৃষ্ঠার প্রয়োজন page এবং অনুশীলনে, এই জাতীয় সিস্টেমে বেশিরভাগ থ্রেডগুলিতে কেবল সেগুলি (সাধারণত) -৪-কিবি স্ট্যাক থাকে। ভার্চুয়াল মেমরির ব্যবহার 32-বিট ওএসের ক্ষেত্রে একটি বড় চুক্তি, তবে 64-বিটে তেমন কিছু নয়। আপনি খুব তাড়াতাড়ি অন্যান্য সীমাতে চলে যান - যেমন টিসিপি পোর্ট ক্লান্তি, উদাহরণস্বরূপ :) এবং আপনি কী মনে করেন নোডের সেই "সিউডো-স্ট্যাকস" সঞ্চিত আছে? ঠিক আছে, গাদা উপর।
লুয়ান

10

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

মূল ধারণাটি হ'ল OS কে ইভেন্টের জন্য নিরীক্ষণ করার জন্য সকেটগুলির একটি সেট (অর্থাত্ নেটওয়ার্ক সংযোগ) সরবরাহ করা, সেগুলির সবগুলি বা কেবলমাত্র আপনি বিশেষভাবে আগ্রহী (উদাহরণস্বরূপ পড়ার জন্য উপলভ্য ডেটা); তালিকার কোনও একটি সকেটে অপারেটিং সিস্টেমের মাধ্যমে যখন এই জাতীয় কার্যকলাপ সনাক্ত করা হয়, আপনি API এর দ্বারা অনুসন্ধান করা ইভেন্টটির একটি বিজ্ঞপ্তি পাবেন যা আপনাকে কোথা থেকে আসে তা বাছাই করে সেই অনুসারে কাজ করতে হবে ।

এখন, এটি একটি নিম্ন-স্তরের এবং বিমূর্ত দৃশ্য, আরও ভাল স্কেল করা কঠিন। তবে এমন অনেকগুলি উচ্চ স্তরের ফ্রেমওয়ার্ক রয়েছে যা এটি এমনকি ক্রস-প্ল্যাটফর্মের ফ্যাশনে ডিল করে: পাইথনের জন্য বাঁকানো, সি ++ এর জন্য বুস্ট .অ্যাসিও বা সি'র জন্য মুক্তির বিষয়টি আমার মনে আসে।


+1 "ব্যয়বহুল ব্যস্ত-অপেক্ষার লুপগুলি": অন্য কথায়, এটি এমন কোনও সমান্তরাল প্রক্রিয়াগুলিতে কার্যকর যা কিছু নিষ্ক্রিয়তা (প্রতীক্ষা) জড়িত, পাশাপাশি এই জাতীয় প্রক্রিয়াগুলির মধ্যে সমন্বয় (বার্তা বা ইভেন্টগুলি)। রিয়েল ওয়ার্ল্ড যতটা কাজ করে।
fr13d

এটি খুঁজে পাওয়া আকর্ষণীয় যে সকেটগুলি নেটওয়ার্কিংয়ের অস্তিত্বের আগে একক মেশিনে মূলত আইপিসির ফর্ম হিসাবে ডিজাইন করা হয়েছিল।

5

এম্বেড থাকা সিস্টেমগুলি প্রায়শই সহজাতভাবে ইভেন্ট-চালিত হয়, এমনকি যদি সেগুলি স্পষ্টভাবে প্রোগ্রাম না করা হয়।

এই ইভেন্টগুলি হার্ডওয়্যার বিঘ্ন, বোতাম টিপুন, পিরিয়ড অ্যানালগ থেকে ডিজিটাল রিডিং, টাইমার সমাপ্তি ইত্যাদির মতো জিনিস থেকে আসে

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

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


3

ইভেন্ট বার্তাগুলি গ্রেগর হোপ।

ইভেন্ট চালিত আর্কিটেকচার গ্রেগর হোপ pe

SEDA আর্কিটেকচার , ওয়েলশ, কুলার, ব্রিউয়ার।

আপনি যখন স্বাভাবিক ব্যাকএন্ড প্রোগ্রামিংয়ে হ্যান্ডেল করবেন যখন কিছু ঘটে অন্য কিছু করে?

ফিনাইট স্টেট মেশিন একটি সাধারণ পদ্ধতি

Given(State.A)
When(Event.B)
Then(State.C)
    .and(Consequences.D)

2
1, এটি সত্যিই সুসংগত উত্তর নয় এবং 2, এফএসএম ইভেন্ট ব্যবহারের ভাল উদাহরণ নয়।
হোসনেম

1
FSM। আমি নিশ্চিত যে পাসফেরিয়ান ধর্মটি বেশ কয়েকটি ইভেন্ট পর্যবেক্ষণ করে ;-)
ফেব্রুয়ারী

0

এম্বেড থাকা সিস্টেমে ইভেন্টগুলি বিঘ্নের সময় ঘটে। টাইমার থেকে শুরু করে আই / ও পর্যন্ত প্রচুর বিঘ্নের উত্স রয়েছে।

এছাড়াও, আরটিওএসের ইভেন্টগুলিও থাকতে পারে। একটি উদাহরণ অন্য কোনও কাজের বার্তার জন্য অপেক্ষা করছে।


0

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

https://en.wikipedia.org/wiki/SCADA

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