ইভেন্ট সোর্সিং, একটি ইভেন্ট, দুটি সংস্থার স্থিতি পরিবর্তন করা হয়েছে


10

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

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

আমানত এবং প্রত্যাহারের বিষয়ে বিবেচনা করার সময় - এটি তুলনামূলকভাবে সহজ, কারণ কেবলমাত্র একমাত্র সমষ্টিগত পরিবর্তন হয়েছে।

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

আমার প্রশ্নটি - আমি কীভাবে এই তিনটি নীতিকে একত্রিত করতে পারি: "একটি সামগ্রিক এক লেনদেন", "ইভেন্ট-> সামগ্রিক পরিবর্তন" এবং "একযোগে পরিবর্তন প্রতিরোধ"?

উত্তর:


7

এটি ভিন্ন স্থানান্তর করার সময় - দুটি সমষ্টিকে একটি মানি ট্রান্সফার ইভেন্টে পরিবর্তন করতে হবে।

অর্থ স্থানান্তর করা লিডারগুলিকে আপডেট করার থেকে পৃথক কাজ।

MoneyTransferred
AccountCredited
AccountDebited

পরিশেষে আমার জন্য যে অনুশীলনটি এই looseিলে .ালাটি ভেঙেছিল তা বুঝতে পেরেছিল যে AccountOverdrawnএটি একটি ইভেন্ট, এটি এই বিনিময়টিতে অন্য অংশগ্রহণকারীদের বিবেচনা না করে অ্যাকাউন্টের অবস্থা বর্ণনা করে, সুতরাং এটির অ্যাকাউন্ট তৈরির বিরুদ্ধে একটি কমান্ড চালানো অবশ্যই হবে।

আপনি AccountOverdrawnপঠন মডেলটির মতো যুক্তিসঙ্গতভাবে রাজ্যটি অর্জন করতে পারবেন না, কারণ আপনি সম্ভবত এখনও সমস্ত ঘটনা দেখেছেন কিনা তা জানতে পারবেন না - কেবলমাত্র সমষ্টিগত কোনও নির্দিষ্ট মুহুর্তে ইতিহাসের একটি সম্পূর্ণ দৃষ্টিভঙ্গি রয়েছে।

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

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

আমি এর পরে সম্পূর্ণরূপে নিশ্চিত নই, কারণ আপনার কাছে (এটির মতো ক্ষেত্রে) একটি প্রাকৃতিক সম্পর্ক সম্পর্কিত শনাক্তকারী, যা লেনদেন আইডি নিজেই।

দ্বিতীয় জিনিস - এর অর্থ আমার সাগা জাতীয় কিছু ব্যবহার করা দরকার।

কিছুটা আলাদা বানান: আপনার মতো কিছু দরকার যাতে সঠিক কমান্ড প্রেরণ করা হয়

আপনি এটি করতে পারে এমন কমপক্ষে দুটি উপায় রয়েছে। এক হ'ল গ্রাহক শোনার জন্য MoneyTransferredএবং দুটি কমান্ডটি লেজারগুলিতে প্রেরণ করা।

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


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

তা না হয় -> AccountCredited এবং AccoundDebited তারপর MoneyTransferred ? প্রথম সমাধান এক লেনদেন (কোন দৃঢ়তা গ্যারান্টি উভয় দলা আপডেট কোনো ধরনের)? এমন কোনও সমষ্টিও নেই যা মানি ট্রান্সফারড প্রকাশ করতে পারে -> কোনও সম্পর্ক নেই। দ্বিতীয় সমাধানটি আরও ভাল বলে মনে হচ্ছে - প্রসেস ট্রান্সজেকশন মানি ট্রান্সফার্ড প্রকাশ করতে পারে এবং এক লেনদেনে একাধিক সামগ্রিক পরিবর্তন এড়াতে আমি লেনদেন করার পরে অ্যাকাউন্ট থেকে ইভেন্টগুলি প্রকাশ করতে পারি publish চতুর হওয়ার জন্য দুঃখিত নবজাতকের পক্ষে এটি বোঝা শক্ত - কেবলমাত্র একটি প্যাটার্ন ডাব্লু / অন্য ব্যবহার করতে পারে না।
cocsackie

1

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

মনের মধ্যে এই বিয়ারিং, টাকা হস্তান্তর আইন আপডেটে করা উচিত হবে না accountকিন্তু মধ্যে সন্নিবেশ করতে transaction

এটি বলা হচ্ছে, এর জন্য আরও একটি গুরুত্বপূর্ণ নিয়ম রয়েছে: একটি সংযোজন করার কাজটি transaction(অস্বীকৃত ব্যালেন্স ক্ষেত্রের) আপডেটের সাথে পারমাণবিক হওয়া উচিত account

এখন যদি আমি সমষ্টিগুলির ডিডিডি ধারণাটি বুঝতে পারি তবে নিম্নলিখিতগুলি প্রাসঙ্গিক বলে মনে হচ্ছে:

সমষ্টিগত বিষয়গুলি একটি যৌক্তিক সীমানা যা কোনও প্রদত্ত প্রসঙ্গে ব্যবসায়ের লেনদেনে পরিবর্তন করতে পারে। একটি সমষ্টি একক শ্রেণীর দ্বারা বা বহু শ্রেণীর দ্বারা প্রতিনিধিত্ব করা যেতে পারে। যদি একের অধিক শ্রেণি একটি সমন্বয়ে গঠিত হয় তবে তাদের মধ্যে একটি হ'ল তথাকথিত মূল শ্রেণি বা সত্তা। বাইরে থেকে সামগ্রিকভাবে সমস্ত অ্যাক্সেস রুট ক্লাসের মাধ্যমে ঘটতে হবে।

সুতরাং ডিডিডি ডিজাইনের ক্ষেত্রে আমি পরামর্শ দেব:

  1. স্থানান্তর উপস্থাপন করার জন্য একটি সমষ্টি আছে

  2. সমষ্টিগত নিম্নলিখিত উপাদানগুলির সমন্বয়ে গঠিত: স্থানান্তর (মূল বস্তু); মূল অবজেক্টটি দুটি লেনদেনের তালিকার সাথে যুক্ত (প্রতিটি অ্যাকাউন্টের জন্য একটি); এবং প্রতিটি লেনদেনের তালিকা একটি অ্যাকাউন্টে লিঙ্কযুক্ত।

  3. স্থানান্তর সমস্ত অ্যাক্সেস রুট অবজেক্ট (দ্বারা transfer) দ্বারা ধ্যান করা উচিত ।

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

আপনি যদি রিয়েল-টাইম বাস্তবায়ন করতে চান, স্থানান্তর লেনদেনকে অবরুদ্ধ করে থাকেন, তবে ব্যবসায়ের যুক্তিটি একটি তৈরি করা উচিত transferএবং সেই বস্তুটি অন্যান্য সময়ে রিয়েল টাইমে সমন্বয় করবে।

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

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


0

আমি বর্তমানে শেখার পর্যায়ে আছি। বাস্তবায়ন দৃষ্টিকোণ থেকে, আমি মনে করি আপনি এই ক্রিয়াটি সম্পাদন করবেন।

প্রেরণ ট্রান্সফারমনিকম্যান্ড যা নিম্নলিখিত ইভেন্টগুলি উত্থাপন করে [মানি ট্রান্সফার ইভেন্ট, অ্যাকাউন্টড্যাবিটেড এভেন্ট]

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

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

ইভেন্টগুলি সফলভাবে ডাটাবেসে সংরক্ষণ করা হলে আপনি উত্থাপিত দুটি ইভেন্ট প্রকাশ করতে পারেন।

অ্যাকাউন্ট ডেবিটেড এভেন্ট প্রদানকারীর অ্যাকাউন্ট থেকে অর্থ সরিয়ে দেবে (সমষ্টিগত অবস্থা এবং সম্পর্কিত কোনও দৃশ্য / প্রজেকশন মডেল আপডেট করে)

মানি ট্রান্সফার ইভেন্টটি সাগা / প্রক্রিয়া পরিচালক শুরু করে।

সাগা / প্রসেস ম্যানেজারের কাজ হ'ল প্রাপকের অ্যাকাউন্টটি ক্রেডিট করার চেষ্টা করা হবে, যদি এটি ব্যর্থ হয় তবে এটি ব্যালেন্সটিকে অর্থ প্রদানকারীর কাছে ফেরত জমা করতে হবে।

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

ইভেন্ট সোর্সিং দৃষ্টিকোণ থেকে, আপনি যদি এই ক্রিয়াকে বিপরীত করতে চান, তবে এই লেনদেনের সমস্ত ইভেন্টের সাথে সম্পর্ক / কার্যকারিতা আইডি আসল ট্রান্সফারমনিকম্যান্ড হিসাবে থাকবে যা আপনি পূর্বাবস্থা / বিপরীত ক্রিয়াকলাপগুলির জন্য ইভেন্টগুলি বাড়াতে ব্যবহার করতে পারেন।

উপরোক্ত বিষয়গুলিতে কোনও সমস্যা বা সম্ভাব্য উন্নতি নির্দ্বিধায় নির্দ্বিধায় মনে করুন।

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