সিকিউআরএস ওভাররিঞ্জাইনিং নয়?


15

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

পূর্বে আমার কাছে এর একটি স্পষ্ট উত্তর ছিল: আমি পরীক্ষার জন্য এটি করি কারণ এই সমস্ত অচলাচল সিঙ্গেলন এবং সামগ্রিক কুরুচিপূর্ণ এএসপি.নেট অবকাঠামো দিয়ে কন্ট্রোলার পরীক্ষা করা শক্ত। তবে সময় বদলে গেছে এবং এএসপি.এনইটি অবকাঠামোগত ক্লাসগুলি আজকাল অনেক বেশি ইউনিট পরীক্ষার বান্ধব (বিশেষত এএসপি.এনইটি কোর)।

এখানে একটি সাধারণ ওয়েবএপি কল রয়েছে: কমান্ডটি যুক্ত করা হয় এবং সিগন্যালআর ক্লায়েন্টদের এটি সম্পর্কে অবহিত করা হয়:

public void AddClient(string clientName)
{
    using (var dataContext = new DataContext())
    {
        var client = new Client() { Name = clientName };

        dataContext.Clients.Add(client);

        dataContext.SaveChanges();

        GlobalHost.ConnectionManager.GetHubContext<ClientsHub>().ClientWasAdded(client);
    }
}

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

সম্প্রতি ভারী কমান্ড / ক্যোয়ারী হ্যান্ডলারগুলি তৈরি করতে আমি কম এবং কম অনুপ্রেরণা অনুভব করেছি এবং আমি ওয়েব এপিআই ক্রিয়াকলাপগুলিতে কোড রাখার ঝোঁক। যুক্তি পুনরাবৃত্তি করা হয় বা এটি সত্যিই জটিল হয় এবং আমি এটিকে বিচ্ছিন্ন করতে চাই তবেই আমি ব্যতিক্রম করি। তবে আমি নিশ্চিত নই যে আমি এখানে সঠিক জিনিস করছি কিনা।

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

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


1
সিকিউআরএস কীভাবে জিনিসগুলিকে আরও পরীক্ষামূলক করে তোলে / সিঙ্গেলনস / নিয়ন্ত্রণকারী / ইত্যাদির সাহায্যে কোনওরকম সহায়তা করে তা আমি দেখতে ব্যর্থ হয়েছি। এগুলি মূলত সম্পর্কিত নয়। এছাড়াও, আপনি এখনও আপনার (কাউন্টার?) উদাহরণে একটি কমান্ড তৈরি করছেন, যা বিজোড়।
guillaume31

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

1
প্রশ্ন এবং আদেশের কোনও যুক্তি নেই। তারা বোবা ডিটিও। তারপরে আপনার কমান্ড / ক্যোয়ারী হ্যান্ডলারগুলি রয়েছে তবে সেগুলি হ'ল অ্যাপ্লিকেশন পরিষেবা, ইন্টারেক্টর, ব্যবসায় পরিষেবাগুলির মতো, আপনি এটির নাম দিন ... একটি CQRS প্রসঙ্গে। কন্ট্রোলারের চেয়ে পৃথক বস্তুতে প্রয়োগযোগ্য / ব্যবহারের ক্ষেত্রে যুক্তি স্থাপন করা কোনও সিকিউআরএস নির্দিষ্ট জিনিস নয়।
guillaume31

এছাড়াও, সিঙ্গেলটন বনাম ইনজেকশন নির্ভরতার প্রশ্নটি সিকিউআরএসের কাছে সম্পূর্ণ orthogonal। আপনি একটি কন্ট্রোলার একটি CommandHandler Singleton করে একটি সংগ্রহস্থলের প্রয়োগ Singleton আহ্বান কলিং হতে পারে ...
guillaume31

1
@ guillaume31, সিকিউআরএস রিপোজিটরি / অ্যাপ্লিকেশন পরিষেবা কলগুলির চেয়ে আরও জটিল হয়ে ওঠে। তারা সাধারণত 2-3 শ্রেণীর প্রয়োজন (অর্থাত ক্যোয়ারী, queryhandler, queryresult), পরিকাঠামো, ইত্যাদি
SiberianGuy

উত্তর:


17

সিকিউআরএস কি তুলনামূলকভাবে জটিল এবং ব্যয়বহুল ধরণ? হ্যাঁ.

এটি কি ওভার ইঞ্জিনিয়ারিং? একেবারে না.

ইন মূল নিবন্ধ যেখানে মার্টিন জালিয়া CQRS সম্পর্কে আলোচনা আপনি CQRS যেখানে এটি প্রযোজ্য নয় ব্যবহার করছেন না সম্পর্কে সতর্কবার্তা অনেকটা দেখতে পারেন:

যে কোনও প্যাটার্নের মতো, সিকিউআরএস কিছু জায়গায় কার্যকর, তবে অন্যগুলিতে নয়।

সিকিউআরএস সকল সংশ্লিষ্টদের জন্য একটি উল্লেখযোগ্য মানসিক লাফ, সুতরাং সুবিধাটি লাফিয়ে লাফিয়ে না নিলে মোকাবেলা করা উচিত নয়

আমি যখন সিকিউআরএসের সফল ব্যবহারগুলি দেখতে পেয়েছি, এখন পর্যন্ত বেশিরভাগ ক্ষেত্রেই আমি এগুলি চালিয়েছি তা এত ভাল হয়নি ...

এই সুবিধাগুলি সত্ত্বেও, আপনার সিকিউআরএস ব্যবহার সম্পর্কে খুব সতর্ক হওয়া উচিত

... এই জাতীয় সিস্টেমে সিকিউআরএস যুক্ত করা গুরুত্বপূর্ণ জটিলতা যুক্ত করতে পারে

উপরে আমার জোর।

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

এবং এটি পুরো প্রয়োগ নাও হতে পারে তবে এটির একটি সামান্য অংশ।

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

সিকিউআরএস সেই সমস্যার জন্য উপযুক্ত যেখানে আপনার একাধিক অভিনেতা একই সংস্থার ডেটাতে একই সংস্থায় সহযোগিতা করছেন বা একই সংস্থানটিতে লিখছেন।

এগুলি ছাড়াও, আপনার সমস্ত সমস্যার একক সমস্যা সমাধানের জন্য তৈরি প্যাটার্ন ছড়িয়ে দেওয়া আপনার আরও সমস্যা তৈরি করবে।


কিছু অন্যান্য দরকারী লিঙ্ক:

http://udidahan.com/2011/04/22/when-to-avoid-cqrs/

http://codebetter.com/gregyoung/2012/09/09/cqrs-is-not-an-architecture-2/


3
"তুলনামূলকভাবে জটিল এবং ব্যয়বহুল প্যাটার্ন" অংশ বাদে সবকিছুর সাথে সম্মত হন। সিকিউআরএস কেবল লেখার চেয়ে আলাদা করে পাঠাচ্ছে। আপনি এটি নালী টেপ, শূন্য মিডলওয়্যার / জটিল টুলিং এবং এটি যে সমস্ত যত্নশীল তা পূর্বের মতো একই ডাটাবেস রেখে এটি করতে পারেন।
guillaume31

@ গিলিয়াম 31, এটি ন্যায্য বিষয়। আমি মনে করি এটি মূল প্রশ্ন থেকে ধারণাটির মূল বিষয়: "ওয়েব অপি যেখানে ক্রিয়া নিজেই একরকম কমান্ড / কোয়েরি is" তবে আপনি কি এমন কোন সিকিউআরএস নমুনা (গিথুবকে প্রাধান্য দিয়ে) দেখেছেন যা কমান্ড এবং প্রশ্নের জন্য পৃথক ক্লাস ব্যবহার করে না? অন্যান্য ব্যক্তিরা কীভাবে নেট থেকে সিকিউআরএস প্রয়োগ করে তা দেখার চেষ্টা করার সময় আমি এটি খুঁজে পাই।
সাইবেরিয়ানগুই

হ্যাঁ, তবে এটি অতিরিক্ত কাজ করে না। এটি প্যাটার্নের প্রাথমিক ভিত্তি - লেখাগুলি থেকে কোয়েরিগুলিকে আলাদা করা এবং ডোমেন মডেল থেকে মডেল পড়ুন।
guillaume31

CQRS পদ্ধতির বেশি হতে পারে হত্যা প্রেক্ষিতে অনেক মধ্যে, কিন্তু যে একটি সম্পূর্ণরূপে ভিন্ন গল্প। আপনি আপনার প্রশ্নাবলীতে সিকিউআরএসকে ভুলভাবে যে সমস্ত ছোট প্রযুক্তিগত বিবরণ দিয়েছেন তার কারণেই এটি অত্যধিক দক্ষতা নয়, এটি ওভারকিল কারণ আপনার সিকিউরিআরএস যা নিয়ে আসে তা আপনার সর্বদা প্রয়োজন হয় না।
guillaume31

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

3

সিকিউআরএস হ'ল রিপোজিটরিগুলির জন্য একের জন্য এক প্রতিস্থাপন নয়, কারণ এটি একটি জটিল, ব্যয়বহুল প্যাটার্ন যা কেবলমাত্র কিছু ক্ষেত্রে কার্যকর।

এখানে উদী দহন যা বলতে চাইছেন তা এখানে:

সিকিউআরএস ব্যবহারকারী বেশিরভাগ লোকের (এবং ইভেন্ট সোর্সিংও) এটি করা উচিত হয়নি।

[...]

আমি দুঃখিত যে সর্বাধিক নমুনা অ্যাপ্লিকেশন আপনি অনলাইনে দেখতে পাবেন যা সিকিউআরএস দেখায় স্থাপত্যগতভাবে ভুল। আমি এমন ফ্রেমওয়ার্কগুলি সম্পর্কেও অত্যন্ত সতর্ক থাকব যা আপনাকে সত্ত্বা-স্টাইলের সমষ্টিগত রুট সিকিউআরএস মডেলের দিকে পরিচালিত করে।

( উত্স )

মার্টিন ফাউলার:

[...] সিকিউআরএস ব্যবহার সম্পর্কে আপনার খুব সতর্ক হওয়া উচিত । অনেকগুলি তথ্য সিস্টেম এমন একটি তথ্য ভিত্তির ধারণার সাথে পুরোপুরি ফিট করে যা এটি পড়তে হয় একইভাবে আপডেট করা হয়, এই জাতীয় সিস্টেমে সিকিউআরএস যুক্ত করা গুরুত্বপূর্ণ জটিলতা যুক্ত করতে পারে।

( উত্স )

অবশেষে, গ্রেগ ইয়ং:

সিকিউআরএসকে একটি স্থাপত্য নিদর্শন বলা যেতে পারে।

[...]

এটি বোঝার জন্য খুব গুরুত্বপূর্ণ যে বেশিরভাগ স্থাপত্য নিদর্শনগুলি সর্বত্র প্রয়োগ করা ভাল নয়। আপনি যদি কোনও স্থাপত্য নির্দেশিকাতে স্থাপত্য নিদর্শনগুলি দেখেন তবে আপনার সম্ভবত সমস্যা আছে have

[...]

ইভেন্ট সোর্সিং ব্যবহার করে লোকেদের থেকে আমি সবচেয়ে বড় ব্যর্থতা হ'ল তারা এটিকে সর্বত্র ব্যবহার করার চেষ্টা করে।

( উত্স )

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