একটি বিতরণ, ইভেন্ট উত্সাহিত সিস্টেমে ধারাবাহিকতা বজায় রাখার জন্য নিদর্শনগুলি?


12

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

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

এখন, আসুন আমাদের নীচের ব্যবসায়িক বিধি রয়েছে: প্রতিটি স্বতন্ত্র ব্যবহারকারীর অবশ্যই একটি অনন্য ব্যবহারকারীর নাম থাকতে হবে।

যদি দুটি প্রক্রিয়া একই ব্যবহারকারীর এক্স এর জন্য ব্যবহারকারীর রেজিস্ট্রেশন কমান্ড পায়, তারা উভয়ই পরীক্ষা করে যে এক্স তাদের ব্যবহারকারীর নামের তালিকায় নেই, বিধিটি উভয় প্রক্রিয়াটির জন্য বৈধতা দেয় এবং তারা উভয়ই "ইউজারনেম এক্স সহ নতুন ব্যবহারকারী" ইভেন্টটিকে সঞ্চয় করে রাখে ।

ব্যবসায়ের নিয়ম লঙ্ঘন করা হয়েছে (একই ব্যবহারকারীর নাম সহ দুটি স্বতন্ত্র ব্যবহারকারী রয়েছে) কারণ আমরা এখন একটি অসামঞ্জস্যপূর্ণ বৈশ্বিক রাষ্ট্রে প্রবেশ করেছি।

একটি traditionalতিহ্যবাহী এন সার্ভার <-> 1 আরডিবিএমএস শৈলী সিস্টেমে ডাটাবেসটিকে সিঙ্ক্রোনাইজেশনের কেন্দ্রীয় পয়েন্ট হিসাবে ব্যবহৃত হয় যা এই জাতীয় অসঙ্গতিগুলি রোধ করতে সহায়তা করে।

আমার প্রশ্ন হ'ল: ইভেন্ট সোর্সড সিস্টেমগুলি সাধারণত এই সমস্যাটির কাছে কীভাবে আসে? তারা কি প্রতিটি কমান্ডগুলি যথাযথভাবে প্রক্রিয়াজাত করে (উদাহরণস্বরূপ যে প্রক্রিয়াটি স্টোরটিতে লিখতে পারে তা সীমাবদ্ধ করে)?


1
এই জাতীয় সীমাবদ্ধতা কোড দ্বারা নিয়ন্ত্রিত হয় বা এটি একটি ডিবি বাধা? এন ইভেন্টগুলি ক্রমানুসারে প্রেরণ-প্রক্রিয়াজাত করা হতে পারে ... এন ইভেন্টগুলি বৈধতার মধ্য দিয়ে যেতে পারে একে অপরকে বিচ্ছিন্ন না করে। যদি অর্ডার সম্পর্কিত বিষয়গুলি হয় তবে আপনাকে বৈধতা সিঙ্ক করতে হবে। বা ইভেন্টগুলি সারিবদ্ধ করার জন্য
সারিটি

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

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

উত্তর:


6

একটি traditionalতিহ্যবাহী এন সার্ভার <-> 1 আরডিবিএমএস শৈলী সিস্টেমে ডাটাবেসটিকে সিঙ্ক্রোনাইজেশনের কেন্দ্রীয় পয়েন্ট হিসাবে ব্যবহৃত হয় যা এই জাতীয় অসঙ্গতিগুলি রোধ করতে সহায়তা করে।

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

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

আমার প্রশ্ন হ'ল: ইভেন্ট সোর্সড সিস্টেমগুলি সাধারণত এই সমস্যাটির কাছে কীভাবে আসে? এগুলি কি প্রতিটি কমান্ড যথাযথভাবে প্রক্রিয়া করে?

গ্রেগ ইয়ং অন সেট ভ্যালিডেশন

ব্যবসায়ের যুক্তিটিকে পরিষেবা স্তরে না নিয়ে ডোমেন অবজেক্টের বৈশিষ্ট্যে অনন্য প্রতিবন্ধকতাগুলি পরীক্ষা করার কি দুর্দান্ত উপায় আছে?

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

কিছু ক্ষেত্রে, যেখানে আপনার ইভেন্টের স্টোর সেট বৈধকরণে (যেমন: একটি রিলেশনাল ডাটাবেস) ভাল, সেখানে আপনি সেই একই লেনদেনে একটি "অনন্য নাম" টেবিলকে লিখে প্রয়োজনীয়তা বাস্তবায়ন করেন যা ইভেন্টগুলি অব্যাহত রাখে।

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


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

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

(1) আমি "ইতিহাসের নতুন সংস্করণ" বলব "নতুন ইভেন্ট" না করে, তবে আপনার ধারণাটি রয়েছে; কেবলমাত্র ইতিহাসটি প্রতিস্থাপন করুন যদি এটি আমরা প্রত্যাশা করি।
ভয়েসফুউনরেজন

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

2

আপনি যেমন মনে করেন ব্যবহারকারীর নিবন্ধকরণের জন্য sagaআপনি কোনও ব্যবসায়িক প্রক্রিয়া ( প্রসঙ্গে Domain Driven Design) প্রয়োগ করতে পারেন যেখানে ব্যবহারকারীকে যেমন ব্যবহার করা হয় CRDT

সম্পদ

  1. https://doc.akka.io/docs/akka/current/distributes-data.html http://archive.is/t0QIx

  2. "আক্কা বিতরণকৃত ডেটা সহ সিআরডিটিস" https://www.slideshare.net/markusjura/crdts-with-akka-distribated-data সম্পর্কে জানতে

    • CmRDTগুলি - অপারেশন ভিত্তিক সিআরডিটি
    • CvRDTগুলি - রাজ্য ভিত্তিক সিআরটিডি
  3. কোড স্কেল https://github.com/akka/akka-sample/tree/master/akka-sample-distributes-data-scala এ কোড উদাহরণ । সম্ভবত "শপিং কার্ট" সবচেয়ে উপযুক্ত।

  4. আক্কা ক্লাস্টারের ভ্রমণ - আক্কা বিতরণ করা ডেটা https://manuel.bernhardt.io/2018/01/03/tour-akka-cluster-akka-distributes-data/
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.