ইভেন্ট সোর্সিং এবং রেস্ট


17

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

REST এর সাহায্যে আপনি ফাইল নামে পরিচিতিগুলিতে একটি নতুন রাষ্ট্র রাখতে পারেন। একটি অনুরোধে আপনি নতুন ফাইলের নাম প্রেরণ করতে পারেন, আপনি প্যারেন্ট ফোল্ডারটি এবং / অথবা ফাইলের মালিক পরিবর্তন করতে পারেন।

সার্ভারটি কীভাবে তৈরি করা যায় তাই আমি ইভেন্ট সোর্সিং ব্যবহার করতে পারি। আমি এই সম্ভাবনাগুলি সম্পর্কে ভাবছিলাম:

  1. সার্ভারে তা নির্ধারণ ক্ষেত্র পরিবর্তন করা হয়েছে এবং উপযুক্ত কমান্ড (তৈরি RenameFileCommand, MoveFileCommand, ChangeOwnerCommand, ...) এবং এইসব পৃথকভাবে পাঠাতে হবে। তবে এই সেটআপে, প্রতিটি কমান্ড অন্যকে লেনদেনের বাইরে রেখে আর এইভাবে "পরমাণু" সংস্থান থেকে বাদ দিতে পারে।

  2. ডিসপ্যাচ শুধুমাত্র একটি কমান্ড ( UpdateFileCommand) এবং কমান্ড হ্যান্ডলার এ, মোটের উপর আরো স্পষ্ট করে, তা নির্ধারণ ক্ষেত্র পরিবর্তন করা হয়েছে এবং এর পরিবর্তে পৃথক ঘটনা পাঠান ( FileRenamedEvent, FileMovedEvent, OwnerChangedEvent, ...)

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

আপনি কোনটিকে পছন্দ করবেন বা এটি পরিচালনা করার আরও ভাল কোনও উপায় আছে?

পার্শ্ব নোট: ইভেন্ট-সোর্সিংয়ের জন্য জাভা এবং অ্যাকসন ফ্রেমওয়ার্কে লিখিত অ্যাপ্লিকেশন।


অবশ্যই 3 য় না। আমি 1 ম করব, তবে আমি এটি সম্পর্কে চিন্তা করতে হবে।
inf3rno

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

আমি একটি উদাহরণ পেয়েছি, তবে এটি সিআরইউডি। github.com/sz अघि/predaddy-issuetracker-sample/blob/3.0/src/hu/… আমি লেখককে তার মতামতটি জিজ্ঞাসা করব, তিনি আমার চেয়ে ডিডিডি সম্পর্কে আরও জানেন।
inf3rno

1
আমার হ'ল আপনি যদি তাত্ক্ষণিক ধারাবাহিকতা চান তবে আপনার "কাজের একক" তে একাধিক কমান্ড ব্যবহার করা উচিত। যদি আপনি ঘটনাগত ধারাবাহিকতার কথা বলছেন তবে প্রশ্নটি আমার কাছে বোঝা যায় না। কমপোজাইট কম্যান্ড প্রেরণের জন্য আরেকটি সম্ভাব্য সমাধান যা আপনার পরমাণু সম্পাদন করতে চান সেই আদেশগুলি থাকতে পারে can এটি একটি সহজ সংগ্রহ হতে পারে, কেবলমাত্র জিনিসটি এটি সঠিকভাবে পরিচালনা করতে পারে matters
inf3rno

1
তাঁর মতে আপনার আদেশ ও HTTP অনুরোধের মধ্যে 1: 1 সম্পর্ক অর্জন করার চেষ্টা করা উচিত। যদি আপনি এটি করতে না পারেন (এটি একটি দুর্গন্ধযুক্ত গন্ধ), তবে এটিকে পারমাণবিক করতে আপনার বাল্ক (আমি এটি যৌগিক বলেছি) ব্যবহার করা উচিত।
inf3rno

উত্তর:


11

আমি মনে করি আপনার এখানে ব্যবহারকারীর অমিলের ব্যবহারকারীর একটি প্রক্রিয়া থাকতে পারে।

প্রথম: একজন ব্যবহারকারী কি একযোগে কোনও ফাইলে একাধিক পরিবর্তন সম্পাদন করতে চান ? একটি পুনর্নামকরণ (যা পথের পরিবর্তনের অন্তর্ভুক্ত হতে পারে বা নাও থাকতে পারে?), মালিকানা পরিবর্তন এবং সম্ভবত ফাইল সামগ্রীর পরিবর্তন (যুক্তির স্বার্থে) পৃথক ক্রিয়া বলে মনে হয়।

উত্তরটি "হ্যাঁ" যেখানে রয়েছে তা কেসে নেওয়া যাক - আপনার ব্যবহারকারীরা সত্যিই একসাথে এই পরিবর্তনগুলি করতে চান।

যে ক্ষেত্রে, আমি দৃঢ়ভাবে কোনো বাস্তবায়ন একাধিক ঘটনা পাঠায় বিরুদ্ধে বলতে চাই - RenameFileCommand, MoveFileCommand, ChangeOwnerCommand- এই প্রতিনিধিত্ব করতে একক ব্যবহারকারী অভিপ্রায়।

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

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

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

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

মজার বিষয় হ'ল আরএসটি-তে ইভেন্ট ভিত্তিক আর্কিটেকচারের মতো কিছু দিকে একটি আন্দোলন চলছে, যাকে থ্যাচট্রাক্স প্রযুক্তির রাডার, 2015 এর মধ্যে প্রস্তাবিত, "বিশ্রাম ব্যতীত পিইউটি " বলা হয় । এখানে PUT ছাড়াই বিশ্রামের জন্য যথেষ্ট দীর্ঘ ব্লগ রয়েছে ।

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

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

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

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


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

ইটাগ এমন কিছু যা আমি যাই হোক না কেন করতে চাই। এছাড়াও আপনার "লম্বা ব্লগ পোস্ট" এর লিঙ্কটি প্রথম লিঙ্কের মতো।
লাল চুত্তয়ালা লোক

আরও চিন্তাভাবনা পুনরায় পুট করার পরে আমি কিছুটা বিবেচনার পরে এ ফিরে আসব। অবশ্যই, পুট অপসারণ কেবল "ES এর জন্য কার্যকর নয়"। আমি ব্লগের লিঙ্কটি ঠিক করেছি।
পারফেকশনিস্ট

4

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

নিবন্ধে, তারা উল্লেখ করেছে যে আরপিসি-স্টাইলটি REST এর পক্ষে খারাপ এবং কমান্ডের নামটি নির্দিষ্ট করার জন্য সামগ্রী-প্রকার প্রসারিত করার পরামর্শ দেয়:

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

PUT /api/InventoryItem/4454c398-2fbb-4215-b986-fb7b54b62ac5 HTTP/1.1
Accept:application/json, text/plain, */*
Accept-Encoding:gzip,deflate,sdch
Content-Type:application/json;domain-model=RenameInventoryItemCommand`

নিবন্ধটি এখানে: http://www.infoq.com/articles/rest-api-on-cqrs

আপনি মিডিয়া প্রকারের প্রায় 5 টি স্তরের আরও এখানে পড়তে পারেন: http://byterot.blogspot.co.uk/2012/12/5-levels-of-media-type-rest-csds.html


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

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