REST মাইক্রোসার্ভেসিসে লেনদেন?


195

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

এখন এখানে কয়েকটি পরিস্থিতি যেখানে জিনিসগুলি ভুল হতে পারে:

  • ব্যবহারকারীর বব সৃষ্টি ব্যর্থ: এটি ঠিক আছে, আমরা কেবল ববকে একটি ত্রুটি বার্তা ফিরিয়ে দেব। আমরা এসকিউএল লেনদেন ব্যবহার করছি তাই সিস্টেমে ববকে কেউ কখনও দেখেনি। সবকিছু ভাল :)

  • ব্যবহারকারী বব তৈরি হয়েছে তবে আমাদের ওয়ালেট তৈরি হওয়ার আগেই আমাদের এপিআই গেটওয়ে হার্ড ক্র্যাশ। আমাদের কাছে এখন ওয়ালেট (অসঙ্গতিপূর্ণ ডেটা) নেই এমন একটি ব্যবহারকারী রয়েছে।

  • ব্যবহারকারীর বব তৈরি হয়েছে এবং আমরা ওয়ালেট তৈরি করার সাথে সাথে এইচটিটিপি সংযোগ হ্রাস পাবে। ওয়ালেট তৈরির কাজটি সম্ভবত সফল হয়েছে বা এটিতে পারে না।

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

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


3
আকর্ষণীয় লিঙ্ক: নিউজ.ইকোবিনেটর.com
অলিভিয়ার

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

4
@ ভ্লাদিস্লাভস্ট্রাস্নি এটি একটি কাল্পনিক উদাহরণ ছিল, তবে আপনি উদাহরণস্বরূপ স্ট্রাইপ দ্বারা ওয়ালেট পরিষেবাটি পরিচালনা করছেন বলে ভাবতে পারেন।
অলিভিয়ের লালনডে

আপনি লেনদেন (প্রক্রিয়া পরিচালকের প্যাটার্ন) ট্র্যাক করতে একটি প্রসেস ম্যানেজার ব্যবহার করতে পারেন বা প্রতিটি মাইক্রোসারওয়াইস কীভাবে রোলব্যাক (সাগা ম্যানেজার প্যাটার্ন) ট্রিগার করতে পারে তা জানতে বা কিছু ধরণের দুটি কমিট ( ব্লগ.অ্যাস্পায়ারসাইসস / সফটওয়্যার-প্রোডাক্ট-ইঞ্জিনিয়ারিং) করতে পারবেন / productteering /… )
অ্যান্ড্রু প্যাট

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

উত্তর:


148

কোন মানে নেই:

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

আপনাকে মাথাব্যথা কী দেবে:

  • বিতরণ লেনদেন সহ ইজেবি । এটি তাত্ত্বিকভাবে কাজ করে তবে বাস্তবে নয় এমন একটি বিষয়। এই মুহুর্তে আমি JBoss EAP 6.3 দৃষ্টান্ত জুড়ে দূরবর্তী EJBs এর জন্য বিতরণ লেনদেনের কাজ করার চেষ্টা করছি। আমরা কয়েক সপ্তাহ ধরে রেডহ্যাট সমর্থনের সাথে কথা বলছি, এবং এটি এখনও কার্যকর হয়নি।
  • সাধারণভাবে দ্বি-পর্যায়ের কমিট সমাধান । আমি মনে করি 2PC প্রোটোকল একটি দুর্দান্ত অ্যালগরিদম (বহু বছর আগে আমি এটি আরপিসির সাথে সিতে প্রয়োগ করেছি)। এটি পুনরায় চেষ্টা, রাষ্ট্রের সংগ্রহশালা ইত্যাদির সহিত ব্যর্থ পুনরুদ্ধার ব্যবস্থা প্রয়োজন, লেনদেনের কাঠামোর মধ্যে সমস্ত জটিলতা লুকানো আছে (যেমন: জেবস আর্জুনা)। তবে, 2PC ব্যর্থ প্রমাণ নয়। এমন কিছু পরিস্থিতি রয়েছে যা কেবল লেনদেন সম্পূর্ণ করতে পারে না। তারপরে আপনাকে ম্যানুয়ালি ডাটাবেসের অসঙ্গতিগুলি চিহ্নিত করতে এবং ঠিক করতে হবে। আপনি ভাগ্যবান হলে মিলিয়ন লেনদেনের ক্ষেত্রে এটি একবার ঘটতে পারে তবে আপনার প্ল্যাটফর্ম এবং দৃশ্যের উপর নির্ভর করে প্রতি 100 লেনদেনে এটি একবার ঘটতে পারে।
  • সাগস (লেনদেনের ক্ষতিপূরণ) । ক্ষতিপূরণমূলক ক্রিয়াকলাপগুলি তৈরির বাস্তবায়ন ওভারহেড রয়েছে এবং শেষে ক্ষতিপূরণ সক্রিয় করার জন্য সমন্বয় ব্যবস্থা। ক্ষতিপূরণ ক্ষতিপূরণ হয় না। আপনি এখনও অসঙ্গতি (= কিছু মাথা ব্যথা) দিয়ে শেষ করতে পারেন।

সম্ভবত সেরা বিকল্পটি কী:

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

তবে আপনার যদি সমকালীন প্রতিক্রিয়াগুলির প্রয়োজন হয়?

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

4
পরিণামের ধারাবাহিকতা আমার পক্ষে কাজ করেছিল। এই ক্ষেত্রে "NewUser" সারিটি উচ্চ উপলব্ধ এবং নমনীয় হওয়া উচিত।
রাম বাভেদীদী

@ রমবাভেদীদী কি কাফকা বা রাব্বিটএমকিউ কি নমনীয় সারি সমর্থন করে?
v.oddou

@ v.oddou হ্যাঁ, তারা করে।
রাম বাভেদীদী

2
@ পাওলোমারসন আমি নিশ্চিত নই যে আপনি কীভাবে সামঞ্জস্য বজায় রাখার জন্য লেনদেনের ক্ষতিপূরণ দিতে আলাদা। যদি আপনার শেষ ধারাবাহিকতায় মানিব্যাগের সৃষ্টি ব্যর্থ হয়?
বালসিক

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

66

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

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

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

  • আপনার ওয়েব পরিষেবাদি সংজ্ঞায়িত করার সময় খুব সূক্ষ্ম হয়ে উঠবেন না (আজকাল ঘটে যাওয়া মাইক্রো-সার্ভিস হাইপ সম্পর্কে আমি নিশ্চিত নই: খুব বেশি দূরে যাওয়ার ঝুঁকি);

  • অ্যাসিঙ্ক কার্য সম্পাদন বৃদ্ধি করে তাই অ্যাসিঙ্ক হওয়া পছন্দ করুন, যখনই সম্ভব ইমেলের মাধ্যমে বিজ্ঞপ্তি প্রেরণ করুন।

  • যেকোন সংখ্যক বার "পুনরায়" পুনরুদ্ধারযোগ্য করে তুলতে আরও বুদ্ধিমান পরিষেবাগুলি তৈরি করুন, কোনও ইউআইডি বা টাস্কিডের সাথে প্রক্রিয়াজাতকরণ যা প্রতিটি পদক্ষেপে ব্যবসায়ের নিয়মকে বৈধতা দিয়ে শেষ অবধি অর্ডার বটম-টপ অনুসরণ করবে;

  • বার্তা সারি (জেএমএস বা অন্য) ব্যবহার করুন এবং ত্রুটি পরিচালনা করা প্রসেসরের দিকে ঝুঁকুন যা বিপরীত ক্রিয়াকলাপগুলি প্রয়োগ করে "রোলব্যাক" -তে অপারেশনগুলি প্রয়োগ করবে, উপায় দ্বারা, অ্যাসিঙ্ক অর্ডার দিয়ে কাজ করার জন্য প্রক্রিয়াটির বর্তমান অবস্থার বৈধতা পাওয়ার জন্য কিছু ধরণের কিউ প্রয়োজন হবে, সুতরাং বিবেচনা করুন;

  • শেষ অবলম্বনে, (যেহেতু এটি প্রায়শই না ঘটে), ম্যানুয়াল ত্রুটিগুলি প্রক্রিয়া করার জন্য এটি একটি সারিতে রাখুন।

পোস্ট করা প্রথম সমস্যাটি নিয়ে ফিরে আসি। একটি অ্যাকাউন্ট তৈরি করুন এবং একটি ওয়ালেট তৈরি করুন এবং নিশ্চিত হয়ে নিন যে সবকিছু শেষ হয়েছে।

ধরা যাক পুরো অপারেশনকে অর্কেস্ট্রেট করার জন্য একটি ওয়েব পরিষেবা ডাকা হয়েছে।

ওয়েব পরিষেবাদির সিউডো কোডটি দেখতে এই রকম হবে:

  1. অ্যাকাউন্ট তৈরির মাইক্রোসার্চিসকে কল করুন, এটিকে কিছু তথ্য এবং কিছু অনন্য টাস্ক আইডি 1.1 দিন কোনও টাস্ক আইডি অ্যাকাউন্টের রেকর্ডের সাথে সম্পর্কিত। মাইক্রোসার্ভাইস সনাক্ত করে যে অ্যাকাউন্টটি বিদ্যমান নেই তাই এটি এটিকে তৈরি করে এবং টাস্ক আইডি সঞ্চয় করে। দ্রষ্টব্য: এই পরিষেবাটি 2000 বার কল করা যেতে পারে, এটি সর্বদা একই ফলাফল সম্পাদন করবে। পরিষেবাটি "" যদি প্রয়োজন হয় একটি পূর্বাবস্থায় ফিরে আসা অপারেশন সম্পাদনের জন্য ন্যূনতম তথ্য ধারণ করে এমন একটি রশিদ দিয়ে উত্তর দেয়।

  2. এটিকে অ্যাকাউন্ট আইডি এবং টাস্ক আইডি দিয়ে ওয়ালেট তৈরির কল করুন। ধরা যাক একটি শর্ত বৈধ নয় এবং ওয়ালেট তৈরি করা যায় না। কলটি একটি ত্রুটি সহ ফিরে আসে তবে কিছুই তৈরি হয়নি।

  3. অর্কেস্ট্রেটারকে ত্রুটি সম্পর্কে অবহিত করা হয়। এটি জানে যে অ্যাকাউন্ট তৈরি বাতিল করতে হবে তবে এটি এটি নিজে করবে না। এটি ওয়ালেট পরিষেবাটি প্রথম পদক্ষেপের শেষে প্রাপ্ত "ন্যূনতম পূর্বাবস্থা প্রাপ্তি" পাস করে এটি করতে বলবে।

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

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

  6. ওয়েব পরিষেবাটি ব্যবহারকারীর কাছে ফিরে আসে যে অ্যাকাউন্টটি তৈরি করা যায়নি।

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

আমি একটি অনুসন্ধান করেছি এবং মাইক্রোসফ্ট ওয়েব সাইটে এই পদ্ধতির জন্য একটি প্যাটার্ন বর্ণনা রয়েছে। একে ক্ষতিপূরণ লেনদেনের ধরণ বলা হয়:

ক্ষতিপূরণ লেনদেনের ধরণ


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

আমি প্রাথমিক পোস্টে প্রাথমিকভাবে সরবরাহ করা কেস সম্পর্কিত একটি উদাহরণ যুক্ত করেছি।
ব্যবহারকারী 8098437

2
মাইক্রোসফ্ট দ্বারা বর্ণিত হিসাবে ক্ষতিপূরণ লেনদেনের ধরণে সবেমাত্র একটি লিঙ্ক যুক্ত হয়েছে।
ব্যবহারকারী 8098437

3
আমার জন্য, এটি সেরা উত্তর। এত সহজ
অস্কার নেভারেজ

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

32

সমস্ত বিতরণ সিস্টেমে লেনদেনের ধারাবাহিকতায় সমস্যা হয়। এটি করার সর্বোত্তম উপায়টি আপনি যেমন বলেছিলেন, দ্বি-পর্যায়ের অঙ্গীকারবদ্ধ করুন। ওয়ালেট এবং ব্যবহারকারীকে একটি মুলতুবি অবস্থায় তৈরি করতে দিন। এটি তৈরির পরে, ব্যবহারকারীকে সক্রিয় করার জন্য একটি পৃথক কল করুন।

এই শেষ কলটি নিরাপদে পুনরাবৃত্তিযোগ্য হওয়া উচিত (যদি আপনার সংযোগ নেমে যায়)।

এটি প্রয়োজনীয় হবে যে শেষ কলটি উভয় টেবিলের সম্পর্কে জানতে পারে (যাতে এটি একটি একক জেডিবিসি লেনদেনে করা যায়)।

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


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

7
আমি দ্বিতীয় দৃষ্টিকোণের সাথে একমত দেখে মনে হচ্ছে, আপনার মাইক্রোসার্চিস যা ব্যবহারকারী তৈরি করে তাও একটি মানিব্যাগ তৈরি করা উচিত, কারণ এই অপারেশনটি কাজের পারমাণবিক ইউনিটকে উপস্থাপন করে। এছাড়াও, আপনি এই eaipatterns.com/docs/IEEE_Software_Design_2PC.pdf
সাত্তার ইমামভ

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

10

আইএমএইচও মাইক্রোসার্চেস আর্কিটেকচারের অন্যতম প্রধান বিষয় হ'ল লেনদেনটি পৃথক মাইক্রোসার্ভেসের (একক দায়িত্বের নীতি) মধ্যে সীমাবদ্ধ।

বর্তমান উদাহরণে, ব্যবহারকারী তৈরির একটি নিজস্ব লেনদেন হবে। ব্যবহারকারী তৈরির ফলে একটি USER_CREATED ইভেন্টটিকে ইভেন্টের কাতারে ঠেলা দেবে। ওয়ালেট পরিষেবা USER_CREATED ইভেন্টের সদস্যতা নেবে এবং ওয়ালেট তৈরি করবে।


1
ধরে নিই যে আমরা যে কোনও এবং সমস্ত 2 পিসি এড়াতে চাইছি এবং ধরে নিই যে ব্যবহারকারী পরিষেবাটি একটি ডাটাবেসে লিখেছে, তবে আমরা বার্তাটিকে কোনও ইভেন্টের সারিতে রূপান্তর করতে পারি না লেনদেনের, যার অর্থ এটি কখনই তৈরি করতে পারে না ওয়ালেট পরিষেবা
রোমান খারকভস্কি

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

1
তারপরে ইভেন্টটি ডাটাবেস পাশাপাশি সত্তার মধ্যে সঞ্চয় করুন। সঞ্চিত ইভেন্টগুলি প্রক্রিয়া করতে এবং বার্তা দালালকে প্রেরণে একটি নির্ধারিত কাজ করুন। stackoverflow.com/a/52216427/4587961
ইয়ান Khonski

7

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

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

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

ওয়ালেট তৈরির জটিলতা এবং ঝুঁকি বাড়ার সাথে সাথে আপনাকে অবশ্যই জড়িত ঝুঁকিকে প্রশমিত করার পদক্ষেপ নিতে হবে। আসুন আমরা কয়েকটি পদক্ষেপের জন্য একাধিক অংশীদার এপিএস কল করা প্রয়োজন।

এই মুহুর্তে আপনি আংশিকভাবে নির্মিত ব্যবহারকারী এবং / অথবা মানিব্যাগগুলির ধারণার সাথে একটি বার্তা সারি পরিচয় করিয়ে দিতে পারেন।

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

আমি কেন আমার বিধান প্রক্রিয়ায় ব্যর্থতার ঝুঁকিপূর্ণ পদক্ষেপ নিয়েছিলাম তা নিয়ে দীর্ঘ এবং কঠোরভাবে চিন্তা করব।


4

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


3

এই জাতীয় ডেটা অসঙ্গতি হওয়া থেকে রোধ করার জন্য কী সমাধানগুলি পাওয়া যায়?

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

এমন কি এমন নিদর্শন রয়েছে যা লেনদেনকে একাধিক REST অনুরোধ বিস্তৃত করতে দেয়?

এসওএপি (ঠিক আছে, বিশ্রাম নয়) এর জন্য, ডাব্লুএস-এটি স্পেসিফিকেশন রয়েছে তবে আমার কোনও সংস্থাগুলি কখনও সংহত করতে হয়নি সেটির সমর্থন নেই has REST এর জন্য, JBoss এর পাইপলাইনে কিছু রয়েছে । অন্যথায়, "প্যাটার্ন" হ'ল হয় এমন কোনও পণ্য সন্ধান করা যা আপনি আপনার আর্কিটেকচারে প্লাগ করতে পারেন বা নিজের সমাধান তৈরি করতে পারেন (প্রস্তাবিত নয়)।

আমি জাভা ইই এর জন্য এই জাতীয় একটি পণ্য প্রকাশ করেছি: https://github.com/maxant/genericconnector

আপনার উল্লেখ করা কাগজ অনুসারে, অ্যাটমিকোস থেকে ট্রান্স-বাতিল / কনফার্ম প্যাটার্ন এবং সম্পর্কিত পণ্য রয়েছে।

বিপিইএল ইঞ্জিনগুলি ক্ষতিপূরণ ব্যবহার করে দূরবর্তী মোতায়েন করা পরিষেবার মধ্যে ধারাবাহিকতা পরিচালনা করে।

বিকল্পভাবে, আমি জানি বিশ্রাম এই ব্যবহারের ক্ষেত্রে উপযুক্ত হতে পারে না। পুরোপুরিভাবে REST ফেলে দেওয়ার জন্য এবং ম্যাসেজ কাতারের সিস্টেমের মতো একটি পৃথক যোগাযোগ প্রোটোকল ব্যবহার করার জন্য কি এই পরিস্থিতিটি হ্যান্ডেল করার সঠিক উপায়টি হতে পারে?

লেনদেনে অ-লেনদেনের সংস্থানগুলিকে "বাঁধাই" করার অনেকগুলি উপায় রয়েছে:

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

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

শয়তানদের উকিল বাজানো: কেন এমন কিছু তৈরি করুন, যখন এমন পণ্য তৈরি হয় যা আপনার জন্য করে (উপরে দেখুন), এবং সম্ভবত আপনি যা করতে পারেন তার থেকে আরও ভাল করুন, কারণ তাদের চেষ্টা করা হয়েছে এবং পরীক্ষা করা হচ্ছে?


2

ব্যক্তিগতভাবে আমি মাইক্রো পরিষেবাদি, ব্যবহারের ক্ষেত্রে সংজ্ঞায়িত মডিউলগুলির ধারণা পছন্দ করি তবে আপনার প্রশ্নের হিসাবে উল্লেখ করা আছে, তাদের ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে তারা ব্যাংক, বীমা, টেলিকম ইত্যাদির মতো ধ্রুপদী ব্যবসায়ের জন্য অভিযোজন সমস্যা রয়েছে ...

বিতর্কিত লেনদেন, যেমন অনেকে উল্লেখ করেছেন, ভাল পছন্দ নয়, লোকেরা এখন অবশেষে ধারাবাহিক সিস্টেমে আরও বেশি চলেছে তবে আমি নিশ্চিত নই যে এটি ব্যাংক, বীমা ইত্যাদির পক্ষে কাজ করবে ...

আমি আমার প্রস্তাবিত সমাধান সম্পর্কে একটি ব্লগ লিখেছি, এটি হতে পারে এটি আপনাকে সহায়তা করতে পারে ....

https://mehmetsalgar.wordpress.com/2016/11/05/micro-services-fan-out-transaction-problems-and-solutions-with-spring-bootjboss-and-netflix-eureka/


0

ইভেন্টের ধারাবাহিকতা এখানে মূল চাবিকাঠি।

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

কমান্ডার বিতরণ লেনদেনের দায়িত্বে থাকেন এবং নিয়ন্ত্রণ নেন। এটি কার্যকর করার নির্দেশটি জানে এবং তাদের সম্পাদনকে সমন্বয় করবে। বেশিরভাগ পরিস্থিতিতে কেবল দুটি নির্দেশ থাকবে তবে এটি একাধিক নির্দেশনা পরিচালনা করতে পারে।

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

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

পরিণামের ধারাবাহিকতা এটি বেশিরভাগ বিতরণ লেনদেনের চ্যালেঞ্জ সমাধান করে, তবে আমাদের এখানে কয়েকটি বিষয় বিবেচনা করতে হবে। প্রতিটি ব্যর্থ লেনদেনের পরে পুনরায় চেষ্টা করা হবে, চেষ্টা করা পুনরায় চেষ্টা করার পরিমাণ প্রসঙ্গে নির্ভর করে।

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


-2

স্ক্রিপ্টিং / প্রোগ্রামিং সমর্থন করে এমন এপিআই ম্যানেজমেন্ট (এপিআইএম) প্ল্যাটফর্ম কেন ব্যবহার করবেন না? সুতরাং, আপনি মাইক্রো পরিষেবাগুলিকে বিরক্ত না করে এপিআইএমগুলিতে সংমিশ্রণ পরিষেবা তৈরি করতে সক্ষম হবেন। আমি এই উদ্দেশ্যে এপিআইজিই ব্যবহার করে ডিজাইন করেছি।

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