এপিআই গেটওয়ে (আরএসটি) + ইভেন্ট-চালিত মাইক্রোসার্ভেসিস


16

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

আমি একটি ইভেন্ট চালিত আর্কিটেকচারের পিছনে পয়েন্টটি বুঝতে পারি। আমি যা বুঝতে পারি না তা হ'ল কোনও মডেলের (REST) ​​এর পিছনে বসে যখন এমন অনুরোধটি ব্যবহার করা হয় যা প্রতিটি অনুরোধের প্রতিক্রিয়া আশা করে। উদাহরণস্বরূপ, আমার কাছে যদি আমার এপিআই গেটওয়েটি একটি মাইক্রোসার্চিস হিসাবে থাকে এবং অন্য একটি মাইক্রোসার্চিস যা ব্যবহারকারীদের সঞ্চয় এবং পরিচালনা করে, আমি কীভাবে কোনও GET /users/1ইভেন্টের মতো কোনও চালিত ফ্যাশনের মতো কোনও মডেল তৈরি করতে পারি ?

উত্তর:


9

আমি বলার পরে বলুন:

রেস্ট এবং অ্যাসিক্রোনাস ইভেন্টগুলি বিকল্প নয়। তারা পুরোপুরি অরথোগোনাল।

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


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

এখানে খেলার সময়ে কোর ধারণা যে মাপযোগ্য ঢিলেঢালাভাবে-কাপল্ড ত্রুটি-সহিষ্ণু মেসেজিং দ্বারা সংজ্ঞায়িত করা হয় কি বার্তাগুলি পাঠাতে না কিভাবে তাদের পাঠাতে । অন্য কথায়, আলগা সংযুক্তিকে অ্যাপ্লিকেশন স্তরে সংজ্ঞায়িত করা হয়

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

  • পার্টি এ POSTপার্টি বি এর সাথে একটি এইচটিটিপি অনুরোধ বার্তা প্রেরণ করেContent-Type: image/jpeg
  • পার্টি বি ইমেজটি প্রসেস করে (এটি দীর্ঘকালীন বড় হলে) সম্ভবত পার্টি এ অপেক্ষা করে, সম্ভবত অন্যান্য কাজ করে
  • পার্টি বি 201 Createdএকটি Content-Location: <url>হেডারের সাথে পার্টি এ একটি এইচটিটিপি প্রতিক্রিয়া বার্তা প্রেরণ করে যা প্রক্রিয়াযুক্ত চিত্রটির সাথে লিঙ্ক করে
  • পার্টি এ এর ​​কাজটি বিবেচনা করে যেহেতু এখন এটিতে প্রক্রিয়াযুক্ত চিত্রটির একটি উল্লেখ রয়েছে
  • ভবিষ্যতে কিছু সময় যখন পার্টি এ-তে প্রক্রিয়াযুক্ত চিত্রের প্রয়োজন হয় তখন এটি পূর্বের Content-Locationশিরোনামের লিঙ্কটি ব্যবহার করে এটি পায়

201 Createdপ্রতিক্রিয়া কোড একটি ক্লায়েন্ট যে না শুধুমাত্র তাদের অনুরোধ সফল হয়েছে বলে, এটি একটি নতুন রিসোর্স তৈরি করা হয়েছে। ২০১২ এর প্রতিক্রিয়ায় Content-Locationশিরোনামটি তৈরি হওয়া সংস্থার লিঙ্ক। এটি আরএফসি 7231 বিভাগ 6.3.2 এবং 3.1.4.2 এ নির্দিষ্ট করা আছে।

এখন, আসুন দেখি কীভাবে এই মিথস্ক্রিয়াটি এএমকিউপির শীর্ষে অনুমানমূলক আরপিসি প্রোটোকলের মাধ্যমে কাজ করে:

  • পার্টি এ একটি এএমকিউপি বার্তা দালালকে (এটিকে ম্যাসেঞ্জার বলুন) প্রেরণ করার জন্য ইমেজ সম্বলিত বার্তা এবং এটিকে পার্টি বিতে প্রেরণের জন্য নির্দেশনা প্রেরণ করে, তারপরে ছবিটির জন্য কোনও প্রকারের ঠিকানা সহ পার্টি এ-তে প্রতিক্রিয়া জানান
  • পার্টি এ অপেক্ষা করছে, সম্ভবত অন্যান্য কাজ করছে
  • ম্যাসেঞ্জার পার্টি বি এর কাছে পার্টি এ এর ​​মূল বার্তা প্রেরণ করে
  • পার্টি বি বার্তা প্রসেস করে
  • পার্টি বি প্রক্রিয়াকৃত চিত্রের জন্য একটি ঠিকানা সম্বলিত মেসেঞ্জারকে বার্তা প্রেরণ করে এবং সেই বার্তাটি পার্টি এ-তে প্রেরণের নির্দেশনা প্রেরণ করে
  • ম্যাসেঞ্জার পার্টি বি থেকে প্রক্রিয়াকৃত চিত্রের ঠিকানা সহ বার্তা প্রেরণ করে
  • পার্টি এ এর ​​কাজটি বিবেচনা করে যেহেতু এখন এটিতে প্রক্রিয়াযুক্ত চিত্রটির একটি উল্লেখ রয়েছে
  • ভবিষ্যতে পার্টি পার্টি যখন ছবিটির প্রয়োজন হয় তখন ঠিকানাটি ব্যবহার করে চিত্রটি পুনরুদ্ধার করে (সম্ভবত অন্য কোনও পক্ষকে বার্তা পাঠিয়ে)

আপনি কি এখানে দেখতে সমস্যা? উভয় ক্ষেত্রেই, পার্টির একজন পর্যন্ত একটি চিত্র ঠিকানা পেতে পারে না পরে পার্টির বি ইমেজ প্রক্রিয়াকরণ । তবু পার্টি এটিকে এখনই চিত্রটির দরকার নেই এবং সমস্ত অধিকার অনুসারে, প্রসেসিং শেষ হয়ে গেলে কম যত্ন নিতে পারে না!

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

কি অনুমান ব্যতীত: আপনি একই জিনিসটি বিশ্রামের মাধ্যমে অর্জন করতে পারেন । AMQP উদাহরণে আমরা "চিত্রটি প্রক্রিয়াকরণ করছে, এটি" প্রক্রিয়াজাত চিত্রটি "বার্তাকে একটি" চিত্রটি প্রক্রিয়াজাত করছে, আপনি পরে এটি পেতে পারেন "বার্তা পরিবর্তন করেছেন। RESTful HTTP এ করতে, আমরা 202 Acceptedকোডটি Content-Locationআবার ব্যবহার করব :

  • পার্টি এ POSTপার্টি বি এর সাথে একটি এইচটিটিপি বার্তা প্রেরণ করেContent-Type: image/jpeg
  • পার্টি বি তাত্ক্ষণিকভাবে একটি 202 Acceptedপ্রতিক্রিয়া প্রেরণ করবে যাতে এক ধরণের "অ্যাসিনক্রোনাস অপারেশন" সামগ্রী রয়েছে যা প্রসেসিং শেষ হয়েছে কিনা এবং চিত্রটি প্রসেসিংয়ের পরে কোথায় পাওয়া যাবে তা বর্ণনা করে। এছাড়াও অন্তর্ভুক্ত একটি Content-Location: <link>শিরোনাম যা একটি 202 Acceptedপ্রতিক্রিয়া হিসাবে, প্রতিক্রিয়া বডি যাই হোক না কেন প্রতিনিধিত্ব করে সংস্থানটির লিঙ্ক। এই ক্ষেত্রে, এর অর্থ এটি আমাদের অ্যাসিনক্রোনাস অপারেশনের একটি লিঙ্ক!
  • পার্টি এ এর ​​কাজটি বিবেচনা করে যেহেতু এখন এটিতে প্রক্রিয়াযুক্ত চিত্রটির একটি উল্লেখ রয়েছে
  • ভবিষ্যতে কিছু সময়ের মধ্যে যখন পার্টি এ প্রসেসড চিত্রের প্রয়োজন হয়, এটি প্রথমে শিরোনামের সাথে সংযুক্ত অ্যাসিঙ্ক অপারেশন রিসোর্সটিContent-Location প্রক্রিয়াকরণ শেষ হয়েছে কিনা তা নির্ধারণ করে। যদি তা হয়, তবে পার্টি এ তারপরে প্রক্রিয়াজাত চিত্রটি পাওয়ার জন্য এসিঙ্ক অপারেশনে লিঙ্কটি ব্যবহার করে uses

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

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

ঠিক আছে, এইচটিটিপি এর ইতিমধ্যে এর জন্য একটি প্রমিত প্রোটোকল রয়েছে! একে বলা হয় HTTP পছন্দসমূহ, বিশেষত respond-asyncআরএফসি 7240 বিভাগ 4.1 এর পছন্দ। পার্টি এ যদি একটি অ্যাসিক্রোনাস প্রতিক্রিয়া চায়, তবে Prefer: respond-asyncএটির প্রাথমিক POST অনুরোধ সহ একটি শিরোনাম অন্তর্ভুক্ত । পার্টি বি যদি এই অনুরোধটিকে সম্মান জানাতে সিদ্ধান্ত নেয়, তবে এটি 202 Acceptedএমন একটি প্রতিক্রিয়া ফেরত পাঠায় যাতে ক Preference-Applied: respond-async। অন্যথায়, পার্টি বি কেবল শিরোনামকে উপেক্ষা করে Preferএবং 201 Createdএটি সাধারণত পাঠায় ।

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


1

আপনার খাঁটি ইভেন্টটি চালিত হওয়া দরকার কিনা তা অবশ্যই আপনার নির্দিষ্ট দৃশ্যের উপর নির্ভর করে। ধরে নিচ্ছি যে আপনার সত্যই হওয়া দরকার, তবে আপনি সমস্যাটি সমাধান করতে পারেন:

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

GET /users/1এই পদ্ধতির সাথে মডেল করার জন্য , কেউ ইভেন্ট UserCreatedএবং UserUpdatedইভেন্টগুলি শুনে এবং ব্যবহারকারীর উপকারের উপসেটটি পরিষেবাতে সঞ্চয় করতে পারে। যখন আপনার সেই ব্যবহারকারীদের তথ্য নেওয়া দরকার তখন আপনি কেবল আপনার স্থানীয় ডেটা স্টোরটি অনুসন্ধান করতে পারেন।

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


আমি বুঝেছি. তবে এই দৃশ্যে ক্লায়েন্টদের ত্রুটি পরিচালনা (এবং প্রতিবেদন করা) সম্পর্কে কী?
টনি ই স্টার্ক

আমি বলতে চাইছি, UserCreatedইভেন্টটি পরিচালনা করার সময় ঘটে যাওয়া ক্লায়েন্টদের ত্রুটিগুলিতে আমি কীভাবে পুনরায় রিপোর্ট করব (উদাহরণস্বরূপ, ব্যবহারকারীর নাম বা ইমেল বা ডাটাবেস ডুপ্লিকেট)।
টনি ই স্টার্ক

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

0

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

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