কোনও বার্তা কমান্ড বার্তা বা ইভেন্টের বার্তা হওয়া উচিত কিনা তা কীভাবে নির্ধারণ করবেন?


11

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

আমরা আমাদের বার্তাগুলির নাম ইভেন্ট হিসাবে রাখি, এটি অতীতের নিখুঁত বাক্য হিসাবে, যেমন PurchaseOrderShipped। যাইহোক, ইভেন্টগুলি কেবল তখনই যুক্ত করা হয় যখন কিছু অন্যান্য পরিষেবাদিগুলি তাদের সম্পর্কে জানতে হবে এবং শুরুতে প্রায়শই কেবল একটি পরিষেবা যত্নশীল। তদুপরি, কখনও কখনও সেই পরিষেবা ফলাফল হিসাবে একটি ইভেন্ট প্রেরণ করে, যা প্রথম পরিষেবা দ্বারা শ্রবণ করা হয়। সুতরাং যদি আমি ইন্টারঅ্যাকশনটি ডায়াগ্রাম করি তবে এটি ইভেন্ট বার্তার জন্য যে লিখিত (বা এমনকি আরপিসি চিত্র) কমান্ড বার্তার জন্য ডায়াগ্রামের মতো দেখতে অনেক বেশি লাগবে, যদিও এটি আবার প্রয়োগ করা হয় না with ডাইরেক্ট ম্যাসেজিং তবে একটি বাসে সম্প্রচার করুন। এটি যুক্ত করুন যে আমি সম্প্রতি কিছু বার্তা যুক্ত হতে দেখেছি যা কমান্ড হিসাবে নামকরণ করা হয়েছে, এটি হ'ল আবশ্যক একটি বাক্য, যেমন BillShippedPurchaseOrder

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

উত্তর:


11

কমান্ড এবং ইভেন্টের মধ্যে একটি সূক্ষ্ম, তবে গুরুত্বপূর্ণ পার্থক্য রয়েছে। একটি কমান্ডের একটি প্রতিক্রিয়ার অনুমান থাকে যখন কোনও ইভেন্ট কোনও প্রতিক্রিয়া অনুমান করে না, এটি কেবল একটি বিবৃতি।

কম বিমূর্ত হতে:

ShipOrderএকটি কমান্ড এবং প্রেরক ShipOrderসম্ভবত কোনও প্রকারের প্রতিক্রিয়া আশা করবে।
OrderShippedএটি একটি ঘোষণা এবং প্রেরক কোনও প্রতিক্রিয়া আশা করতে পারে GoodJob!না কারণ এই উদাহরণে অকেজো প্রতিক্রিয়া।

আপনি যদি কেবলমাত্র ইভেন্টের বার্তাগুলি প্রত্যাশার জন্য আপনার সিস্টেমগুলি ডিজাইন করেন তবে আপনার বার্তাগুলি কী বলে তা সিস্টেম ডিজাইনের পক্ষে প্রয়োজনীয় নয়। বিকাশকারীরা কোনও বার্তার নাম নিয়ে বিভ্রান্ত হতে পারে, তবে আপনি কোন কনভেনশন দিয়ে জিনিসগুলির নাম রাখেন তা নির্বিশেষে সিস্টেমগুলি ঠিক জবাব দেবে।

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

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


কীভাবে request for informationকার্যকারিতা বাস্তবায়ন করবেন ? getUserInfo(uid)প্রতিক্রিয়াটিকে ব্যতিক্রমী একটি কমান্ড বার্তা বলে এমনটি ব্যবহার করা স্বাভাবিক বলে মনে হয়। আমি জানি যে কমান্ড বার্তাগুলি কাপলিংয়ের পরিচয় দেয়, তবে দুঃখের বিষয় এই ক্ষেত্রে, ইভেন্টের বার্তাগুলি দিয়ে কীভাবে এটি প্রয়োগ করা যায় তা আমি দেখছি না। অথবা এরকম কিছু উপলক্ষে বার্তাগুলি কমান্ড করা ঠিক আছে?
du369

@ du369 দুঃখিত, তবে আমি আপনার প্রশ্নটি পুরোপুরি অনুসরণ করছি না। মনে হচ্ছে আপনি একটি কমান্ড তৈরি করার চেষ্টা করছেন তবে ইভেন্টগুলি ব্যবহার করছেন?

হ্যাঁ, বেশ। ইন লিংক লি এর উত্তর দেওয়া, একই কার্যকারিতা দুটি ভিন্ন উপায়ে বাস্তবায়িত হয়। একটি CancelPolicyRequestবার্তা ব্যবহার করছে যা একটি কমান্ড। অন্য পদ্ধতির দুটি ইভেন্ট বার্তা ব্যবহার করে, InvoicePastDueNotificationএবং PolicyCancelledNotification। সুতরাং আমি ভাবছি যে getUserInfo(uid)ইভেন্ট ম্যাসেজের শৈলীর মতো কমান্ডগুলি ছাঁটাই করা সম্ভব এবং কীভাবে আমার এটি করা উচিত।
du369

1
@ du369 কিছু, কোথাও Actionকমান্ডের সাথে যুক্ত সম্পাদন করতে হবে । কমান্ডের সাথে দুটি পদক্ষেপ যুক্ত রয়েছে। 1) কমান্ডটি কী প্রয়োজন (যেমন নীতিমালার মেয়াদ শেষ হয়ে গেছে), এবং 2) কমান্ডটি কার্যকর করে (যেমন নীতিটি বাতিল করুন)। যদি এটি Actorনির্ধারণ করে যে কমান্ডটির প্রয়োজন হয় এবং কার্যকর করতে পারে তবে তা Actorইভেন্টের বার্তা প্রেরণ করতে সক্ষম। অন্যথায়, কমান্ডের প্রয়োজনীয়তা যা নির্ধারণ করে তা কমান্ড ইভেন্ট প্রেরণের প্রয়োজন।

5

একটি ইভেন্ট বার্তা এমন কিছু যা সবে ঘটেছিল। সবেমাত্র ঘটে যাওয়া ইভেন্টটি আপনি অবহিত করছেন।

কমান্ড বার্তা এমন একটি বার্তা যা প্রত্যাশা করে যে কিছু হয়ে গেছে। এটি বা প্রতিক্রিয়া আশা করতে পারে না।

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

বিল পুল কমান্ড বার্তাগুলি একসাথে এড়িয়ে যাওয়ার পরামর্শ দেয়: http://bill-poole.blogspot.com.au/2008/04/avoid-command-messages.html

http://bill-poole.blogspot.com.au/


লি, আপনার উত্তরের জন্য ধন্যবাদ, কিন্তু আমি প্রতিটি সংজ্ঞা পিছনে তত্ত্ব বুঝতে পারি। আমার প্রশ্ন হ'ল এটি বাস্তব জীবনে কীভাবে প্রয়োগ করা যায় --- কখন যে কিছু ঘটেছিল তা অবহিত করা যায়, যার ফলস্বরূপ কিছু ঘটে যায় এবং কখন কিছু করার অনুরোধ করা হয়।
কাজার্ক

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

লি, ধন্যবাদ, এটি সহায়ক; প্রকৃতপক্ষে, আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি আপনার মন্তব্যে আপনার উত্তরে পুলের নিবন্ধগুলির লিঙ্ক সহ (যা আমি পড়িনি যে আমি নিশ্চিত নই) আপনার লিখিত লিঙ্কটি অন্তর্ভুক্ত করে edit
কাজার্ক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.