মাইক্রোসার্ফেসে ডিটিও ভাগ করার উপায়?


33

আমার পরিস্থিতি নিম্নরূপ।

আমি বিভিন্ন ধরণের সেন্সর থেকে ডেটা গ্রহণের জন্য ডিজাইন করা একটি সিস্টেম ডিজাইন করছি, এবং রূপান্তর করে তা পরে বিভিন্ন ফ্রন্ট-এন্ড এবং বিশ্লেষণ পরিষেবাদি দ্বারা ব্যবহার করা অবিরত রাখছি।

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

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

আমি কি সিস্টেমের স্থপতি সম্পর্কে ভুল যাচ্ছি? যদি তা না হয় তবে এর আশেপাশে কয়েকটি উপায় কী কী?


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

এনকোডেড JSON স্ট্রিং এবং এএমকিউপি। আমি ভাষা-নির্দিষ্ট কিছু ব্যবহার না করা পছন্দ করব।
nbaughman

উত্তর:


38

আমার উপদেশ? অ্যাপ্লিকেশনগুলির মধ্যে কোনও ধরণের লাইব্রেরিতে এই ডিটিওগুলি ভাগ করবেন না । বা কমপক্ষে এখনই এটি করবেন না।

আমি জানি, খুব পাল্টা স্বজ্ঞাত মনে হয়। আপনি কোড নকল করছেন, তাই না? তবে এটি কোনও ব্যবসায়ের নিয়ম নয়, তাই আপনি আরও নমনীয় হতে পারেন।

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

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

তবে যদি এই পরিস্থিতিটি আপনাকে সত্যিই বিরক্ত করে, আপনি তিনটি বিধি অনুসরণ করতে পারেন :

পুনঃব্যবহারের জন্য দুটি "বিধি বিধি" রয়েছে: (ক) একক ব্যবহারের উপাদান হিসাবে পুনরায় ব্যবহারযোগ্য উপাদান তৈরি করা তিনগুণ কঠিন, এবং (খ) একটি পুনরায় ব্যবহারযোগ্য উপাদানটি পর্যাপ্ত সাধারণ হওয়ার আগে তিনটি পৃথক প্রয়োগে চেষ্টা করা উচিত be একটি পুনরায় ব্যবহার লাইব্রেরিতে গ্রহণ করতে।

সুতরাং, পরিষেবাগুলির মধ্যে এই ডিটিও ভাগ করে নেওয়ার আগে আরও কিছুটা অপেক্ষা করার চেষ্টা করুন।


1
খুব বেশি প্রশংশিত. এটি সত্যিই আমি এগিয়ে যাচ্ছি খুব খুব কয়েকটি বড় উদ্বেগের মধ্যে একটি। রাতে আমাকে ধরে রাখার জন্য যথেষ্ট নয়, তবে আমাকে চিন্তিত করার পক্ষে যথেষ্ট।
nbaughman

4
সদৃশ ডিটিওগুলি (বিভিন্ন এবং খুব স্বতন্ত্র সেবার ক্ষেত্রে) ডিআরওয়াই লঙ্ঘন করে না। এটাই.
লাইভ

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

1
এমনকি একটি সম্পূর্ণ পরিষেবা মুছে ফেলা হতে পারে পুরো সিস্টেমটিতে কোনও বড় সমস্যা নেই। মূলত।
লাইভ

4
উত্তরের সারমর্মটি পরিষ্কার করার জন্য, মাইক্রোসার্ভেসেসগুলি বিকাশ করার সময়, প্রতিটি পরিষেবা এমনভাবে বিকাশ করা উচিত যেন তারা অন্যান্য পরিষেবাদি সম্পর্কে জানে না, এটির জন্য প্রকৃত চুক্তিগুলি বাদে।
জোনাথন ভ্যান ডি ভীন

12

যখন মাইক্রোসার্ভেসিসের কথা আসে, পরিষেবাগুলির বিকাশের জীবনের চক্রগুলিও স্বাধীন হওয়া উচিত। *

বিভিন্ন এসএলডিসি এবং বিভিন্ন দেব দল

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

বিভিন্ন প্রয়োজন, বিভিন্ন প্রযুক্তি

বিচ্ছিন্ন এসএলডিসি দলগুলিকে তাদের প্রয়োজনীয়তার সর্বোত্তম অনুসারে স্ট্যাকটি বেছে নেওয়ার অনুমতি দেয়। একটি নির্দিষ্ট প্রযুক্তিতে প্রয়োগ করা ডিটিও চাপিয়ে দেওয়া দলগুলির নির্বাচনের ক্ষমতা সীমাবদ্ধ করে।

ডিটিওগুলি ব্যবসায়ের নিয়ম বা পরিষেবা চুক্তি নয়

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

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

বিভিন্ন ব্যবসা, বিভিন্ন ব্যাখ্যা

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

কেস স্টাডি

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

গ্রাহক সেবা, তার কারণে ডোমেইন ভাষা , গ্রাহকদের, যেখানে ধারণা প্রায় কার্যকরী সেবা গ্রাহকদের দ্বারা ব্যক্তি । উদাহরণস্বরূপ, গ্রাহকরা নাম , পদবি , বয়স , লিঙ্গ , ইমেল , ফোন ইত্যাদি রূপে মডেল হন

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

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

সম্পর্কিত লিংক


* এখানে এই স্থাপত্যের শক্তিগুলি রাখে


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

8

আমি প্রতিটি পরিষেবা যথাসম্ভব স্বতন্ত্র হতে ডিজাইন করার চেষ্টা করছি

আপনার ইভেন্ট প্রকাশ করা উচিত । ইভেন্টগুলি নির্দিষ্ট ধরণের বার্তাগুলি যা কোনও নির্দিষ্ট সময়ে ঘটেছিল এমন কিছু সম্পর্কে দৃ fact় সত্যকে উপস্থাপন করে।

প্রতিটি সেবার একটি খুব সুস্পষ্ট সংজ্ঞায়িত দায়িত্ব থাকতে হবে এবং সেই দায়িত্ব সম্পর্কিত ঘটনা প্রকাশের দায়িত্ব থাকা উচিত have

তদুপরি, আপনি চান যে আপনার ইভেন্টগুলি প্রযুক্তি সম্পর্কিত ইভেন্ট নয়, ব্যবসায় সম্পর্কিত ইভেন্টগুলির প্রতিনিধিত্ব করবে। যেমন OrderCancelledএকটি OrderUpdatedসাথে ইভেন্ট পছন্দ status: "CANCELLED"

এইভাবে, যখন কোনও পরিষেবার জন্য কোনও বাতিল আদেশের প্রতিক্রিয়া দেখাতে হবে, তখন কেবল একটি নির্দিষ্ট ধরণের বার্তা শুনতে হবে, যা কেবলমাত্র সেই ইভেন্টের সাথে সম্পর্কিত ডেটা বহন করে। যেমন একটি OrderCancelledসম্ভবত প্রয়োজন একটি order_id। যার যে কোনও পরিষেবাদিতে এর প্রতিক্রিয়া দেখাতে হবে তার নিজের ডেটা স্টোরে অর্ডার সম্পর্কে যা জানা দরকার তা ইতিমধ্যে সংরক্ষণ করেছে।

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

আপনার ক্ষেত্রে, যাইহোক, আপনার সেন্সর ডেটা প্রকাশ হয়, এটা জ্ঞান বানাতে পারে একটি সেবা আছে, ঘটনা শুনতে ও "ব্যবসার ঘটনা", যেমন একটি নতুন প্রবাহ প্রকাশ TemperatureThresholdExceeded, TemperatureStabilised

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

অনেক বেশি, খুব ছোট পরিষেবাদি থাকার চেয়ে খুব কম, খুব বড় পরিষেবা দেওয়া ভাল।


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

2
@ নিকডবি ৯৩ - আপনার ক্ষেত্রে, যেমন আপনি সেন্সর ডেটা প্রকাশ করছেন, সেবার কোনও পরিষেবা দেওয়া, ইভেন্টগুলি শোনার এবং "ব্যবসায়িক ইভেন্টগুলি" এর যেমন একটি নতুন ধারা প্রকাশ করা অর্থাত্ টেম্পারেচারথ্রহোল্ডএলসিডড, টেম্পারেচার স্ট্যাবিলাইজড হওয়া বোধগম্য হতে পারে। (উত্তরে যুক্ত করা হয়েছে)
পিট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.